Files
tasks/service/matching/fairness_util_test.go
Stephan BehnkeandGitHub a0067a2aef Fairness weight override API (#8379)
## What changed?

Adds the ability to set/unset fairness weight overrides by fairness key
via `UpdateTaskQueueConfig` API.

From the API:

> // Fairness weight for a task can come from multiple sources for
    // flexibility. From highest to lowest precedence:
// 1. Weights for a small set of keys can be overridden in task queue
    //    configuration with an API.
    // 2. It can be attached to the workflow/activity in this field.
    // 3. The default weight of 1.0 will be used.
    //
    // Weight values are clamped to the range [0.001, 1000].

## Why?

To allow users to fine-tune their fairness key behavior via the API. 

## How did you test it?
- [x] built
- [x] run locally and tested manually
- [ ] covered by existing tests
- [ ] added new unit test(s)
- [x] added new functional test(s)

## Potential risks
N/A
2025-10-17 00:37:31 +00:00

79 lines
2.8 KiB
Go

package matching
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestMergeFairnessWeightOverrides(t *testing.T) {
t.Run("apply upserts and deletes", func(t *testing.T) {
existing := fairnessWeightOverrides{"a": 1.0, "b": 2.0}
set := fairnessWeightOverrides{
"a": 3.0, // update
"c": 4.0, // insert
}
unset := []string{"b", "x"} // delete existing b and non-existent x (no-op)
out, err := mergeFairnessWeightOverrides(existing, set, unset, 10)
require.NoError(t, err)
require.Equal(t, fairnessWeightOverrides{"a": 3.0, "c": 4.0}, out)
})
t.Run("no update", func(t *testing.T) {
// nil set and unset
existing := fairnessWeightOverrides{"a": 1.2, "b": 3.4}
out, err := mergeFairnessWeightOverrides(existing, nil, nil, 10)
require.NoError(t, err)
require.Equal(t, existing, out)
// empty set and unset
existing = fairnessWeightOverrides{"a": 1.2, "b": 3.4}
out, err = mergeFairnessWeightOverrides(existing, fairnessWeightOverrides{}, []string{}, 10)
require.NoError(t, err)
require.Equal(t, existing, out)
// non-existent key in unset
existing = fairnessWeightOverrides{"a": 1.2, "b": 3.4}
out, err = mergeFairnessWeightOverrides(existing, fairnessWeightOverrides{}, []string{"does-not-exist"}, 2)
require.NoError(t, err)
require.Equal(t, existing, out)
// same key and value
existing = fairnessWeightOverrides{"a": 1.2, "b": 3.4}
out, err = mergeFairnessWeightOverrides(existing, fairnessWeightOverrides{"a": 1.2}, []string{}, 2)
require.NoError(t, err)
require.Equal(t, existing, out)
})
t.Run("return set when existing is empty", func(t *testing.T) {
set := fairnessWeightOverrides{"a": 1.2, "b": 3.4}
out, err := mergeFairnessWeightOverrides(nil, set, nil, 10)
require.NoError(t, err)
require.Equal(t, set, out)
out, err = mergeFairnessWeightOverrides(fairnessWeightOverrides{}, set, nil, 10)
require.NoError(t, err)
require.Equal(t, set, out)
})
t.Run("enforce capacity", func(t *testing.T) {
existing := fairnessWeightOverrides{"e": 1.0, "b": 2.0}
unset := []string{"b"} // remove one first -> size becomes 1
set := fairnessWeightOverrides{"a": 3.0, "c": 4.0} // adding two makes size 3 which exceeds capacity 2
out, err := mergeFairnessWeightOverrides(existing, set, unset, 2)
require.ErrorIs(t, err, errFairnessOverridesUpdateRejected)
require.Nil(t, out)
})
t.Run("check capacity after deletes", func(t *testing.T) {
existing := fairnessWeightOverrides{"a": 1.0, "b": 2.0}
unset := []string{"b"} // first, delete one
set := fairnessWeightOverrides{"c": 5.0} // then, add one
out, err := mergeFairnessWeightOverrides(existing, set, unset, 2)
require.NoError(t, err)
require.Equal(t, fairnessWeightOverrides{"a": 1.0, "c": 5.0}, out)
})
}