Skip to content

Commit 9320e13

Browse files
authored
Merge pull request #246 from splitio/fallback-treatmnet
[FME-11064] Release fallback treatment
2 parents b56f0e2 + d176e9b commit 9320e13

File tree

19 files changed

+353
-150
lines changed

19 files changed

+353
-150
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ jobs:
3939

4040
- name: SonarQube Scan (Push)
4141
if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/development')
42-
uses: SonarSource/sonarcloud-github-action@v5.0
42+
uses: SonarSource/sonarqube-scan-action@v6
4343
env:
4444
SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }}
4545
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -51,7 +51,7 @@ jobs:
5151
5252
- name: SonarQube Scan (Pull Request)
5353
if: github.event_name == 'pull_request'
54-
uses: SonarSource/sonarcloud-github-action@v5.0
54+
uses: SonarSource/sonarqube-scan-action@v6
5555
env:
5656
SONAR_TOKEN: ${{ secrets.SONARQUBE_TOKEN }}
5757
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
6.9.0 (Nov 26, 2025)
2+
- Added new configuration for Fallback Treatments, which allows setting a treatment value and optional config to be returned in place of "control", either globally or by flag. Read more in our docs.
3+
14
6.8.1 (Nov 10, 2025)
25
- Fixed to use an old proxy with 1.3 spec.
36

go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module github.com/splitio/go-client/v6
33
go 1.18
44

55
require (
6-
github.com/splitio/go-split-commons/v8 v8.0.0
6+
github.com/splitio/go-split-commons/v9 v9.0.0
77
github.com/splitio/go-toolkit/v5 v5.4.1
88
github.com/stretchr/testify v1.11.1
99
)
@@ -14,11 +14,13 @@ require (
1414
github.com/cespare/xxhash/v2 v2.2.0 // indirect
1515
github.com/davecgh/go-spew v1.1.1 // indirect
1616
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
17+
github.com/kr/pretty v0.1.0 // indirect
1718
github.com/kr/text v0.2.0 // indirect
1819
github.com/pmezard/go-difflib v1.0.0 // indirect
1920
github.com/redis/go-redis/v9 v9.0.4 // indirect
2021
github.com/stretchr/objx v0.5.2 // indirect
2122
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
2223
golang.org/x/sync v0.3.0 // indirect
24+
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
2325
gopkg.in/yaml.v3 v3.0.1 // indirect
2426
)

go.sum

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,17 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
1212
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
1313
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
1414
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
15+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
16+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
17+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
1518
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
1619
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
1720
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1821
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
1922
github.com/redis/go-redis/v9 v9.0.4 h1:FC82T+CHJ/Q/PdyLW++GeCO+Ol59Y4T7R4jbgjvktgc=
2023
github.com/redis/go-redis/v9 v9.0.4/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=
21-
github.com/splitio/go-split-commons/v8 v8.0.0 h1:wLk5eT6WU2LfxtaWG3ZHlTbNMGWP2eYsZTb1o+tFpkI=
22-
github.com/splitio/go-split-commons/v8 v8.0.0/go.mod h1:vgRGPn0s4RC9/zp1nIn4KeeIEj/K3iXE2fxYQbCk/WI=
24+
github.com/splitio/go-split-commons/v9 v9.0.0 h1:6uHEkBMUUZNhIiop9dyN04gXQUrMXp+X/0uXSytbp+Q=
25+
github.com/splitio/go-split-commons/v9 v9.0.0/go.mod h1:gJuaKo04Swlh4w9C1b2jBAqAdFxEd/Vpd8jnFINOeDY=
2326
github.com/splitio/go-toolkit/v5 v5.4.1 h1:srTyvDBJZMUcJ/KiiQDMyjCuELVgTBh2TGRVn0sOXEE=
2427
github.com/splitio/go-toolkit/v5 v5.4.1/go.mod h1:SifzysrOVDbzMcOE8zjX02+FG5az4FrR3Us/i5SeStw=
2528
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
@@ -34,5 +37,6 @@ golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
3437
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
3538
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
3639
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
40+
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
3741
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
3842
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

splitio/client/client.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ import (
1111
"github.com/splitio/go-client/v6/splitio/conf"
1212
impressionlistener "github.com/splitio/go-client/v6/splitio/impressionListener"
1313

14-
"github.com/splitio/go-split-commons/v8/dtos"
15-
"github.com/splitio/go-split-commons/v8/engine/evaluator"
16-
"github.com/splitio/go-split-commons/v8/engine/evaluator/impressionlabels"
17-
"github.com/splitio/go-split-commons/v8/flagsets"
18-
"github.com/splitio/go-split-commons/v8/provisional"
19-
"github.com/splitio/go-split-commons/v8/storage"
20-
"github.com/splitio/go-split-commons/v8/telemetry"
14+
"github.com/splitio/go-split-commons/v9/dtos"
15+
"github.com/splitio/go-split-commons/v9/engine/evaluator"
16+
"github.com/splitio/go-split-commons/v9/engine/evaluator/impressionlabels"
17+
"github.com/splitio/go-split-commons/v9/flagsets"
18+
"github.com/splitio/go-split-commons/v9/provisional"
19+
"github.com/splitio/go-split-commons/v9/storage"
20+
"github.com/splitio/go-split-commons/v9/telemetry"
2121
"github.com/splitio/go-toolkit/v5/logging"
2222
)
2323

splitio/client/client_test.go

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,24 @@ import (
1919
impressionlistener "github.com/splitio/go-client/v6/splitio/impressionListener"
2020
"github.com/stretchr/testify/assert"
2121

22-
commonsCfg "github.com/splitio/go-split-commons/v8/conf"
23-
"github.com/splitio/go-split-commons/v8/dtos"
24-
"github.com/splitio/go-split-commons/v8/engine/evaluator"
25-
"github.com/splitio/go-split-commons/v8/engine/evaluator/impressionlabels"
26-
evaluatorMock "github.com/splitio/go-split-commons/v8/engine/evaluator/mocks"
27-
"github.com/splitio/go-split-commons/v8/healthcheck/application"
28-
"github.com/splitio/go-split-commons/v8/provisional"
29-
"github.com/splitio/go-split-commons/v8/provisional/strategy"
30-
authMocks "github.com/splitio/go-split-commons/v8/service/mocks"
31-
"github.com/splitio/go-split-commons/v8/storage"
32-
"github.com/splitio/go-split-commons/v8/storage/inmemory"
33-
"github.com/splitio/go-split-commons/v8/storage/inmemory/mutexqueue"
34-
"github.com/splitio/go-split-commons/v8/storage/mocks"
35-
"github.com/splitio/go-split-commons/v8/storage/redis"
36-
"github.com/splitio/go-split-commons/v8/synchronizer"
37-
syncMock "github.com/splitio/go-split-commons/v8/synchronizer/mocks"
38-
"github.com/splitio/go-split-commons/v8/telemetry"
39-
"github.com/splitio/go-split-commons/v8/util"
22+
commonsCfg "github.com/splitio/go-split-commons/v9/conf"
23+
"github.com/splitio/go-split-commons/v9/dtos"
24+
"github.com/splitio/go-split-commons/v9/engine/evaluator"
25+
"github.com/splitio/go-split-commons/v9/engine/evaluator/impressionlabels"
26+
evaluatorMock "github.com/splitio/go-split-commons/v9/engine/evaluator/mocks"
27+
"github.com/splitio/go-split-commons/v9/healthcheck/application"
28+
"github.com/splitio/go-split-commons/v9/provisional"
29+
"github.com/splitio/go-split-commons/v9/provisional/strategy"
30+
authMocks "github.com/splitio/go-split-commons/v9/service/mocks"
31+
"github.com/splitio/go-split-commons/v9/storage"
32+
"github.com/splitio/go-split-commons/v9/storage/inmemory"
33+
"github.com/splitio/go-split-commons/v9/storage/inmemory/mutexqueue"
34+
"github.com/splitio/go-split-commons/v9/storage/mocks"
35+
"github.com/splitio/go-split-commons/v9/storage/redis"
36+
"github.com/splitio/go-split-commons/v9/synchronizer"
37+
syncMock "github.com/splitio/go-split-commons/v9/synchronizer/mocks"
38+
"github.com/splitio/go-split-commons/v9/telemetry"
39+
"github.com/splitio/go-split-commons/v9/util"
4040

4141
"github.com/splitio/go-toolkit/v5/datastructures/set"
4242
"github.com/splitio/go-toolkit/v5/logging"
@@ -1322,6 +1322,22 @@ func TestClient(t *testing.T) {
13221322
cfg.LabelsEnabled = true
13231323
logger := logging.NewLogger(nil)
13241324

1325+
stringConfig := "flag1_config"
1326+
globalTreatment := "global_treatment"
1327+
flag1Treatment := "flag1_treatment"
1328+
config := &dtos.FallbackTreatmentConfig{
1329+
GlobalFallbackTreatment: &dtos.FallbackTreatment{
1330+
Treatment: &globalTreatment,
1331+
},
1332+
ByFlagFallbackTreatment: map[string]dtos.FallbackTreatment{
1333+
"flag1": {
1334+
Treatment: &flag1Treatment,
1335+
Config: &stringConfig,
1336+
},
1337+
},
1338+
}
1339+
fallbackTreatmentCalculator := dtos.NewFallbackTreatmentCalculatorImp(config)
1340+
13251341
evaluator := evaluator.NewEvaluator(
13261342
mocks.MockSplitStorage{
13271343
SplitCall: func(splitName string) *dtos.SplitDTO {
@@ -1374,6 +1390,7 @@ func TestClient(t *testing.T) {
13741390
logger,
13751391
cfg.Advanced.FeatureFlagRules,
13761392
cfg.Advanced.RuleBasedSegmentRules,
1393+
fallbackTreatmentCalculator,
13771394
)
13781395

13791396
mockedTelemetryStorage := mocks.MockTelemetryStorage{
@@ -1409,19 +1426,19 @@ func TestClient(t *testing.T) {
14091426
t.Error("Wrong impression saved")
14101427
}
14111428

1412-
expectedTreatment(client.Treatment("invalid", "invalid", nil), "control", t)
1413-
if client.Treatment("invalid", "invalid", nil) != "control" {
1429+
expectedTreatment(client.Treatment("invalid", "invalid", nil), "global_treatment", t)
1430+
if client.Treatment("invalid", "invalid", nil) != "global_treatment" {
14141431
t.Error("Unexpected Treatment Result")
14151432
}
14161433

14171434
expectedTreatment(client.Treatment("invalid", "killed", nil), "defTreatment", t)
1418-
if isInvalidImpression(client, "invalid", "killed", "defTreatment") {
1435+
if isInvalidImpression(client, "invalid", "invalid", "global_treatment") {
14191436
t.Error("Wrong impression saved")
14201437
}
14211438

14221439
// Assertion Treatments
14231440
treatments := client.Treatments("user1", []string{"valid", "invalid", "killed"}, nil)
1424-
expectedTreatment(treatments["invalid"], "control", t)
1441+
expectedTreatment(treatments["invalid"], "global_treatment", t)
14251442
expectedTreatment(treatments["killed"], "defTreatment", t)
14261443
expectedTreatment(treatments["valid"], "on", t)
14271444
client.impressions.(storage.ImpressionStorage).PopN(cfg.Advanced.ImpressionsBulkSize)
@@ -1437,15 +1454,15 @@ func TestClient(t *testing.T) {
14371454
t.Error("Wrong impression saved")
14381455
}
14391456

1440-
expectedTreatmentAndConfig(client.TreatmentWithConfig("invalid", "invalid", nil), "control", "", t)
1457+
expectedTreatmentAndConfig(client.TreatmentWithConfig("invalid", "invalid", nil), "global_treatment", "", t)
14411458
expectedTreatmentAndConfig(client.TreatmentWithConfig("invalid", "killed", nil), "defTreatment", "{\"color\": \"orange\",\"size\": 15}", t)
1442-
if isInvalidImpression(client, "invalid", "killed", "defTreatment") {
1459+
if isInvalidImpression(client, "invalid", "invalid", "global_treatment") {
14431460
t.Error("Wrong impression saved")
14441461
}
14451462

14461463
// Assertion TreatmentsWithConfig
14471464
treatmentsWithConfigs := client.TreatmentsWithConfig("user1", []string{"valid", "invalid", "killed"}, nil)
1448-
expectedTreatmentAndConfig(treatmentsWithConfigs["invalid"], "control", "", t)
1465+
expectedTreatmentAndConfig(treatmentsWithConfigs["invalid"], "global_treatment", "", t)
14491466
expectedTreatmentAndConfig(treatmentsWithConfigs["killed"], "defTreatment", "{\"color\": \"orange\",\"size\": 15}", t)
14501467
expectedTreatmentAndConfig(treatmentsWithConfigs["valid"], "on", "{\"color\": \"blue\",\"size\": 13}", t)
14511468
}

0 commit comments

Comments
 (0)