diff --git a/CHANGES.txt b/CHANGES.txt index 01e501ed..b40d9fc4 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,9 @@ +5.12.0 (Dec 30, 2025) +- Split Proxy: + - Added support for new impression properties to be appended to the impressions sent to the Split backend. Read more in our docs. +- Split-Sync: + - Added support for new impression properties to be appended to the impressions sent to the Split backend. Read more in our docs. + 5.11.1 (Dec 16, 2025) - Fixed vulnerabilities: - Updated golang image to 1.24.11 diff --git a/go.mod b/go.mod index a21ea10e..af5ba33b 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/gin-gonic/gin v1.10.1 github.com/google/uuid v1.3.0 github.com/splitio/gincache v1.0.1 - github.com/splitio/go-split-commons/v8 v8.0.0 + github.com/splitio/go-split-commons/v9 v9.1.0 github.com/splitio/go-toolkit/v5 v5.4.1 github.com/stretchr/testify v1.11.1 go.etcd.io/bbolt v1.3.6 diff --git a/go.sum b/go.sum index c5bcbc9d..7757f3ae 100644 --- a/go.sum +++ b/go.sum @@ -74,8 +74,8 @@ github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUA github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/splitio/gincache v1.0.1 h1:dLYdANY/BqH4KcUMCe/LluLyV5WtuE/LEdQWRE06IXU= github.com/splitio/gincache v1.0.1/go.mod h1:CcgJDSM9Af75kyBH0724v55URVwMBuSj5x1eCWIOECY= -github.com/splitio/go-split-commons/v8 v8.0.0 h1:wLk5eT6WU2LfxtaWG3ZHlTbNMGWP2eYsZTb1o+tFpkI= -github.com/splitio/go-split-commons/v8 v8.0.0/go.mod h1:vgRGPn0s4RC9/zp1nIn4KeeIEj/K3iXE2fxYQbCk/WI= +github.com/splitio/go-split-commons/v9 v9.1.0 h1:sfmPMuEDTtbIOJ+MeWNbfYl2/xKB/25d4/J95OUD+X0= +github.com/splitio/go-split-commons/v9 v9.1.0/go.mod h1:gJuaKo04Swlh4w9C1b2jBAqAdFxEd/Vpd8jnFINOeDY= github.com/splitio/go-toolkit/v5 v5.4.1 h1:srTyvDBJZMUcJ/KiiQDMyjCuELVgTBh2TGRVn0sOXEE= github.com/splitio/go-toolkit/v5 v5.4.1/go.mod h1:SifzysrOVDbzMcOE8zjX02+FG5az4FrR3Us/i5SeStw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/splitio/admin/common/config.go b/splitio/admin/common/config.go index 63cb4376..119f41a2 100644 --- a/splitio/admin/common/config.go +++ b/splitio/admin/common/config.go @@ -1,8 +1,8 @@ package common import ( - "github.com/splitio/go-split-commons/v8/engine/grammar/constants" - "github.com/splitio/go-split-commons/v8/storage" + "github.com/splitio/go-split-commons/v9/engine/grammar/constants" + "github.com/splitio/go-split-commons/v9/storage" ) var ProducerFeatureFlagsRules = []string{constants.MatcherTypeAllKeys, constants.MatcherTypeInSegment, constants.MatcherTypeWhitelist, constants.MatcherTypeEqualTo, constants.MatcherTypeGreaterThanOrEqualTo, constants.MatcherTypeLessThanOrEqualTo, constants.MatcherTypeBetween, diff --git a/splitio/admin/controllers/helpers.go b/splitio/admin/controllers/helpers.go index 7565aed7..0a739d9b 100644 --- a/splitio/admin/controllers/helpers.go +++ b/splitio/admin/controllers/helpers.go @@ -5,8 +5,8 @@ import ( "strings" "time" - "github.com/splitio/go-split-commons/v8/storage" - "github.com/splitio/go-split-commons/v8/telemetry" + "github.com/splitio/go-split-commons/v9/storage" + "github.com/splitio/go-split-commons/v9/telemetry" "github.com/splitio/split-synchronizer/v5/splitio/admin/views/dashboard" "github.com/splitio/split-synchronizer/v5/splitio/producer/evcalc" diff --git a/splitio/admin/controllers/helpers_test.go b/splitio/admin/controllers/helpers_test.go index 7889dfcb..862fbf2f 100644 --- a/splitio/admin/controllers/helpers_test.go +++ b/splitio/admin/controllers/helpers_test.go @@ -5,8 +5,8 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/admin/views/dashboard" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/storage/mocks" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/storage/mocks" "github.com/splitio/go-toolkit/v5/datastructures/set" "github.com/stretchr/testify/assert" diff --git a/splitio/admin/controllers/observability_test.go b/splitio/admin/controllers/observability_test.go index c92d57c5..b1aa7f00 100644 --- a/splitio/admin/controllers/observability_test.go +++ b/splitio/admin/controllers/observability_test.go @@ -11,8 +11,8 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/provisional/observability" "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/storage/mocks" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/storage/mocks" "github.com/splitio/go-toolkit/v5/datastructures/set" "github.com/splitio/go-toolkit/v5/logging" diff --git a/splitio/common/conf/advanced.go b/splitio/common/conf/advanced.go index 8c786f12..82dbd651 100644 --- a/splitio/common/conf/advanced.go +++ b/splitio/common/conf/advanced.go @@ -3,7 +3,7 @@ package conf import ( "os" - "github.com/splitio/go-split-commons/v8/conf" + "github.com/splitio/go-split-commons/v9/conf" ) // InitAdvancedOptions initializes an advanced config with default values + overriden urls. diff --git a/splitio/common/conf/validators.go b/splitio/common/conf/validators.go index fbafb216..a9a287b2 100644 --- a/splitio/common/conf/validators.go +++ b/splitio/common/conf/validators.go @@ -3,7 +3,7 @@ package conf import ( "strings" - "github.com/splitio/go-split-commons/v8/flagsets" + "github.com/splitio/go-split-commons/v9/flagsets" ) type FlagSetValidationError struct { diff --git a/splitio/common/conf/validators_test.go b/splitio/common/conf/validators_test.go index ab46165a..a2ab5c0a 100644 --- a/splitio/common/conf/validators_test.go +++ b/splitio/common/conf/validators_test.go @@ -3,7 +3,7 @@ package conf import ( "testing" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/stretchr/testify/assert" ) diff --git a/splitio/common/impressionlistener/dtos.go b/splitio/common/impressionlistener/dtos.go index 111df2a7..e6aae466 100644 --- a/splitio/common/impressionlistener/dtos.go +++ b/splitio/common/impressionlistener/dtos.go @@ -9,6 +9,7 @@ type ImpressionForListener struct { Label string `json:"label"` BucketingKey string `json:"bucketingKey,omitempty"` Pt int64 `json:"pt,omitempty"` + Properties string `json:"properties,omitempty"` } // ImpressionsForListener struct for payload diff --git a/splitio/common/impressionlistener/listener.go b/splitio/common/impressionlistener/listener.go index e0e43e7f..5f07c274 100644 --- a/splitio/common/impressionlistener/listener.go +++ b/splitio/common/impressionlistener/listener.go @@ -7,7 +7,7 @@ import ( "fmt" "net/http" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/splitio/go-toolkit/v5/struct/traits/lifecycle" ) diff --git a/splitio/common/impressionlistener/listener_test.go b/splitio/common/impressionlistener/listener_test.go index f190b839..d9a3a656 100644 --- a/splitio/common/impressionlistener/listener_test.go +++ b/splitio/common/impressionlistener/listener_test.go @@ -7,7 +7,8 @@ import ( "net/http/httptest" "testing" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/stretchr/testify/assert" ) func TestImpressionListener(t *testing.T) { @@ -15,54 +16,220 @@ func TestImpressionListener(t *testing.T) { reqsDone := make(chan struct{}, 1) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer func() { reqsDone <- struct{}{} }() - if r.URL.Path != "/someUrl" && r.Method != "POST" { - t.Error("Invalid request. Should be POST to /someUrl") - } + // Verify request method and path + assert.False(t, r.URL.Path != "/someUrl" && r.Method != "POST", "Invalid request. Should be POST to /someUrl") + // Read and parse request body body, err := ioutil.ReadAll(r.Body) r.Body.Close() + assert.False(t, err != nil, "Error reading body") if err != nil { - t.Error("Error reading body") return } var all impressionListenerPostBody err = json.Unmarshal(body, &all) + assert.False(t, err != nil, "Error parsing json: %v", err) if err != nil { - t.Errorf("Error parsing json: %s", err) return } - if all.SdkVersion != "go-1.1.1" || all.MachineIP != "1.2.3.4" || all.MachineName != "ip-1-2-3-4" { - t.Error("invalid metadata") - } + // Verify metadata + assert.False(t, all.SdkVersion != "go-1.1.1" || all.MachineIP != "1.2.3.4" || all.MachineName != "ip-1-2-3-4", "invalid metadata") + // Verify impressions imps := all.Impressions - if len(imps) != 2 { - t.Error("invalid number of impression groups received") - return - } + assert.Equal(t, 2, len(imps), "Should have 2 impression groups") + + // Verify first impression group (t1) + assert.Equal(t, "t1", imps[0].TestName, "First group should be t1") + assert.Equal(t, 2, len(imps[0].KeyImpressions), "t1 should have 2 impressions") + + // Verify first impression of t1 + assert.Equal(t, "k1", imps[0].KeyImpressions[0].KeyName, "t1 first impression should have correct key name") + assert.Equal(t, "on", imps[0].KeyImpressions[0].Treatment, "t1 first impression should have correct treatment") + assert.Equal(t, int64(1), imps[0].KeyImpressions[0].Time, "t1 first impression should have correct time") + assert.Equal(t, int64(2), imps[0].KeyImpressions[0].ChangeNumber, "t1 first impression should have correct change number") + assert.Equal(t, "l1", imps[0].KeyImpressions[0].Label, "t1 first impression should have correct label") + assert.Equal(t, "b1", imps[0].KeyImpressions[0].BucketingKey, "t1 first impression should have correct bucketing key") + assert.Equal(t, int64(1), imps[0].KeyImpressions[0].Pt, "t1 first impression should have correct pt") + + // Verify second impression of t1 + assert.Equal(t, "k2", imps[0].KeyImpressions[1].KeyName, "t1 second impression should have correct key name") + assert.Equal(t, "on", imps[0].KeyImpressions[1].Treatment, "t1 second impression should have correct treatment") + assert.Equal(t, int64(1), imps[0].KeyImpressions[1].Time, "t1 second impression should have correct time") + assert.Equal(t, int64(2), imps[0].KeyImpressions[1].ChangeNumber, "t1 second impression should have correct change number") + assert.Equal(t, "l1", imps[0].KeyImpressions[1].Label, "t1 second impression should have correct label") + assert.Equal(t, "b1", imps[0].KeyImpressions[1].BucketingKey, "t1 second impression should have correct bucketing key") + assert.Equal(t, int64(1), imps[0].KeyImpressions[1].Pt, "t1 second impression should have correct pt") + + // Verify second impression group (t2) + assert.Equal(t, "t2", imps[1].TestName, "Second group should be t2") + assert.Equal(t, 2, len(imps[1].KeyImpressions), "t2 should have 2 impressions") + + // Verify first impression of t2 + assert.Equal(t, "k1", imps[1].KeyImpressions[0].KeyName, "t2 first impression should have correct key name") + assert.Equal(t, "off", imps[1].KeyImpressions[0].Treatment, "t2 first impression should have correct treatment") + assert.Equal(t, int64(2), imps[1].KeyImpressions[0].Time, "t2 first impression should have correct time") + assert.Equal(t, int64(3), imps[1].KeyImpressions[0].ChangeNumber, "t2 first impression should have correct change number") + assert.Equal(t, "l2", imps[1].KeyImpressions[0].Label, "t2 first impression should have correct label") + assert.Equal(t, "b2", imps[1].KeyImpressions[0].BucketingKey, "t2 first impression should have correct bucketing key") + assert.Equal(t, int64(2), imps[1].KeyImpressions[0].Pt, "t2 first impression should have correct pt") + + // Verify second impression of t2 + assert.Equal(t, "k2", imps[1].KeyImpressions[1].KeyName, "t2 second impression should have correct key name") + assert.Equal(t, "off", imps[1].KeyImpressions[1].Treatment, "t2 second impression should have correct treatment") + assert.Equal(t, int64(2), imps[1].KeyImpressions[1].Time, "t2 second impression should have correct time") + assert.Equal(t, int64(3), imps[1].KeyImpressions[1].ChangeNumber, "t2 second impression should have correct change number") + assert.Equal(t, "l2", imps[1].KeyImpressions[1].Label, "t2 second impression should have correct label") + assert.Equal(t, "b2", imps[1].KeyImpressions[1].BucketingKey, "t2 second impression should have correct bucketing key") + assert.Equal(t, int64(3), imps[1].KeyImpressions[1].Pt, "t2 second impression should have correct pt") + })) + defer ts.Close() + + listener, err := NewImpressionBulkListener(ts.URL, 10, nil) + assert.False(t, err != nil, "error cannot be nil: %v", err) + + err = listener.Start() + assert.False(t, err != nil, "start() should not fail. Got: %v", err) + defer listener.Stop(true) + + listener.Submit([]ImpressionsForListener{ + ImpressionsForListener{ + TestName: "t1", + KeyImpressions: []ImpressionForListener{ + ImpressionForListener{ + KeyName: "k1", + Treatment: "on", + Time: 1, + ChangeNumber: 2, + Label: "l1", + BucketingKey: "b1", + Pt: 1, + }, + ImpressionForListener{ + KeyName: "k2", + Treatment: "on", + Time: 1, + ChangeNumber: 2, + Label: "l1", + BucketingKey: "b1", + Pt: 1, + }, + }, + }, + ImpressionsForListener{ + TestName: "t2", + KeyImpressions: []ImpressionForListener{ + ImpressionForListener{ + KeyName: "k1", + Treatment: "off", + Time: 2, + ChangeNumber: 3, + Label: "l2", + BucketingKey: "b2", + Pt: 2, + }, + ImpressionForListener{ + KeyName: "k2", + Treatment: "off", + Time: 2, + ChangeNumber: 3, + Label: "l2", + BucketingKey: "b2", + Pt: 3, + }, + }, + }, + }, &dtos.Metadata{SDKVersion: "go-1.1.1", MachineIP: "1.2.3.4", MachineName: "ip-1-2-3-4"}) + + <-reqsDone +} + +func TestImpressionListenerWithProperties(t *testing.T) { - if imps[0].TestName != "t1" || len(imps[0].KeyImpressions) != 2 { - t.Errorf("invalid ipmressions for t1") + reqsDone := make(chan struct{}, 1) + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer func() { reqsDone <- struct{}{} }() + // Verify request method and path + assert.False(t, r.URL.Path != "/someUrl" && r.Method != "POST", "Invalid request. Should be POST to /someUrl") + + // Read and parse request body + body, err := ioutil.ReadAll(r.Body) + r.Body.Close() + assert.False(t, err != nil, "Error reading body") + if err != nil { return } - if imps[1].TestName != "t2" || len(imps[1].KeyImpressions) != 2 { - t.Errorf("invalid ipmressions for t2") + var all impressionListenerPostBody + err = json.Unmarshal(body, &all) + assert.False(t, err != nil, "Error parsing json: %v", err) + if err != nil { return } + + // Verify metadata + assert.False(t, all.SdkVersion != "go-1.1.1" || all.MachineIP != "1.2.3.4" || all.MachineName != "ip-1-2-3-4", "invalid metadata") + + // Verify impressions + imps := all.Impressions + assert.Equal(t, 2, len(imps), "Should have 2 impression groups") + + // Verify first impression group (t1) + assert.Equal(t, "t1", imps[0].TestName, "First group should be t1") + assert.Equal(t, 2, len(imps[0].KeyImpressions), "t1 should have 2 impressions") + + // Verify first impression of t1 + assert.Equal(t, "k1", imps[0].KeyImpressions[0].KeyName, "t1 first impression should have correct key name") + assert.Equal(t, "on", imps[0].KeyImpressions[0].Treatment, "t1 first impression should have correct treatment") + assert.Equal(t, int64(1), imps[0].KeyImpressions[0].Time, "t1 first impression should have correct time") + assert.Equal(t, int64(2), imps[0].KeyImpressions[0].ChangeNumber, "t1 first impression should have correct change number") + assert.Equal(t, "l1", imps[0].KeyImpressions[0].Label, "t1 first impression should have correct label") + assert.Equal(t, "b1", imps[0].KeyImpressions[0].BucketingKey, "t1 first impression should have correct bucketing key") + assert.Equal(t, int64(1), imps[0].KeyImpressions[0].Pt, "t1 first impression should have correct pt") + assert.Equal(t, "{'prop':'val'}", imps[0].KeyImpressions[0].Properties, "First impression of t1 should have properties") + + // Verify second impression of t1 + assert.Equal(t, "k2", imps[0].KeyImpressions[1].KeyName, "t1 second impression should have correct key name") + assert.Equal(t, "on", imps[0].KeyImpressions[1].Treatment, "t1 second impression should have correct treatment") + assert.Equal(t, int64(1), imps[0].KeyImpressions[1].Time, "t1 second impression should have correct time") + assert.Equal(t, int64(2), imps[0].KeyImpressions[1].ChangeNumber, "t1 second impression should have correct change number") + assert.Equal(t, "l1", imps[0].KeyImpressions[1].Label, "t1 second impression should have correct label") + assert.Equal(t, "b1", imps[0].KeyImpressions[1].BucketingKey, "t1 second impression should have correct bucketing key") + assert.Equal(t, int64(1), imps[0].KeyImpressions[1].Pt, "t1 second impression should have correct pt") + // Second impression should not have properties + assert.Empty(t, imps[0].KeyImpressions[1].Properties, "Second impression of t1 should not have properties") + + // Verify second impression group (t2) + assert.Equal(t, "t2", imps[1].TestName, "Second group should be t2") + assert.Equal(t, 2, len(imps[1].KeyImpressions), "t2 should have 2 impressions") + + // Verify first impression of t2 + assert.Equal(t, "k1", imps[1].KeyImpressions[0].KeyName, "t2 first impression should have correct key name") + assert.Equal(t, "off", imps[1].KeyImpressions[0].Treatment, "t2 first impression should have correct treatment") + assert.Equal(t, int64(2), imps[1].KeyImpressions[0].Time, "t2 first impression should have correct time") + assert.Equal(t, int64(3), imps[1].KeyImpressions[0].ChangeNumber, "t2 first impression should have correct change number") + assert.Equal(t, "l2", imps[1].KeyImpressions[0].Label, "t2 first impression should have correct label") + assert.Equal(t, "b2", imps[1].KeyImpressions[0].BucketingKey, "t2 first impression should have correct bucketing key") + assert.Equal(t, int64(2), imps[1].KeyImpressions[0].Pt, "t2 first impression should have correct pt") + + // Verify second impression of t2 + assert.Equal(t, "k2", imps[1].KeyImpressions[1].KeyName, "t2 second impression should have correct key name") + assert.Equal(t, "off", imps[1].KeyImpressions[1].Treatment, "t2 second impression should have correct treatment") + assert.Equal(t, int64(2), imps[1].KeyImpressions[1].Time, "t2 second impression should have correct time") + assert.Equal(t, int64(3), imps[1].KeyImpressions[1].ChangeNumber, "t2 second impression should have correct change number") + assert.Equal(t, "l2", imps[1].KeyImpressions[1].Label, "t2 second impression should have correct label") + assert.Equal(t, "b2", imps[1].KeyImpressions[1].BucketingKey, "t2 second impression should have correct bucketing key") + assert.Equal(t, int64(3), imps[1].KeyImpressions[1].Pt, "t2 second impression should have correct pt") })) defer ts.Close() listener, err := NewImpressionBulkListener(ts.URL, 10, nil) - if err != nil { - t.Error("error cannot be nil: ", err) - } + assert.False(t, err != nil, "error cannot be nil: %v", err) - if err = listener.Start(); err != nil { - t.Error("start() should not fail. Got: ", err) - } + err = listener.Start() + assert.False(t, err != nil, "start() should not fail. Got: %v", err) defer listener.Stop(true) listener.Submit([]ImpressionsForListener{ @@ -77,6 +244,7 @@ func TestImpressionListener(t *testing.T) { Label: "l1", BucketingKey: "b1", Pt: 1, + Properties: "{'prop':'val'}", }, ImpressionForListener{ KeyName: "k2", diff --git a/splitio/common/impressionlistener/mocks/listener.go b/splitio/common/impressionlistener/mocks/listener.go index 7a478a03..7f181136 100644 --- a/splitio/common/impressionlistener/mocks/listener.go +++ b/splitio/common/impressionlistener/mocks/listener.go @@ -2,8 +2,9 @@ package mocks import ( "github.com/splitio/split-synchronizer/v5/splitio/common/impressionlistener" + "github.com/stretchr/testify/mock" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" ) type ImpressionBulkListenerMock struct { @@ -23,3 +24,22 @@ func (l *ImpressionBulkListenerMock) Start() error { func (l *ImpressionBulkListenerMock) Stop(blocking bool) error { return l.StopCall(blocking) } + +type MockImpressionBulkListener struct { + mock.Mock +} + +func (l *MockImpressionBulkListener) Submit(imps []impressionlistener.ImpressionsForListener, metadata *dtos.Metadata) error { + args := l.Called(imps, metadata) + return args.Error(1) +} + +func (l *MockImpressionBulkListener) Start() error { + args := l.Called() + return args.Error(1) +} + +func (l *MockImpressionBulkListener) Stop(blocking bool) error { + args := l.Called() + return args.Error(1) +} diff --git a/splitio/common/runtime.go b/splitio/common/runtime.go index b6dd09b5..46b1de66 100644 --- a/splitio/common/runtime.go +++ b/splitio/common/runtime.go @@ -12,7 +12,7 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/provisional/healthcheck/application" "github.com/splitio/split-synchronizer/v5/splitio/provisional/healthcheck/services" - "github.com/splitio/go-split-commons/v8/synchronizer" + "github.com/splitio/go-split-commons/v9/synchronizer" "github.com/splitio/go-toolkit/v5/logging" "github.com/splitio/go-toolkit/v5/sync" ) diff --git a/splitio/common/sync/sync.go b/splitio/common/sync/sync.go index 051096c3..fa0378fa 100644 --- a/splitio/common/sync/sync.go +++ b/splitio/common/sync/sync.go @@ -1,9 +1,9 @@ package sync import ( - "github.com/splitio/go-split-commons/v8/conf" - "github.com/splitio/go-split-commons/v8/synchronizer" - "github.com/splitio/go-split-commons/v8/tasks" + "github.com/splitio/go-split-commons/v9/conf" + "github.com/splitio/go-split-commons/v9/synchronizer" + "github.com/splitio/go-split-commons/v9/tasks" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/producer/conf/sections.go b/splitio/producer/conf/sections.go index 649635f6..14006be6 100644 --- a/splitio/producer/conf/sections.go +++ b/splitio/producer/conf/sections.go @@ -3,7 +3,7 @@ package conf import ( "github.com/splitio/split-synchronizer/v5/splitio/common/conf" - cconf "github.com/splitio/go-split-commons/v8/conf" + cconf "github.com/splitio/go-split-commons/v9/conf" ) // Main configuration options diff --git a/splitio/producer/initialization.go b/splitio/producer/initialization.go index d1803733..c0039f13 100644 --- a/splitio/producer/initialization.go +++ b/splitio/producer/initialization.go @@ -20,21 +20,21 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/provisional/observability" "github.com/splitio/split-synchronizer/v5/splitio/util" - cconf "github.com/splitio/go-split-commons/v8/conf" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/engine/grammar" - "github.com/splitio/go-split-commons/v8/flagsets" - "github.com/splitio/go-split-commons/v8/provisional/strategy" - "github.com/splitio/go-split-commons/v8/service/api" - "github.com/splitio/go-split-commons/v8/storage/filter" - "github.com/splitio/go-split-commons/v8/storage/inmemory" - "github.com/splitio/go-split-commons/v8/storage/redis" - "github.com/splitio/go-split-commons/v8/synchronizer" - "github.com/splitio/go-split-commons/v8/synchronizer/worker/impressionscount" - "github.com/splitio/go-split-commons/v8/synchronizer/worker/segment" - "github.com/splitio/go-split-commons/v8/synchronizer/worker/split" - "github.com/splitio/go-split-commons/v8/tasks" - "github.com/splitio/go-split-commons/v8/telemetry" + cconf "github.com/splitio/go-split-commons/v9/conf" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/engine/grammar" + "github.com/splitio/go-split-commons/v9/flagsets" + "github.com/splitio/go-split-commons/v9/provisional/strategy" + "github.com/splitio/go-split-commons/v9/service/api" + "github.com/splitio/go-split-commons/v9/storage/filter" + "github.com/splitio/go-split-commons/v9/storage/inmemory" + "github.com/splitio/go-split-commons/v9/storage/redis" + "github.com/splitio/go-split-commons/v9/synchronizer" + "github.com/splitio/go-split-commons/v9/synchronizer/worker/impressionscount" + "github.com/splitio/go-split-commons/v9/synchronizer/worker/segment" + "github.com/splitio/go-split-commons/v9/synchronizer/worker/split" + "github.com/splitio/go-split-commons/v9/tasks" + "github.com/splitio/go-split-commons/v9/telemetry" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/producer/initialization_test.go b/splitio/producer/initialization_test.go index e696fd17..54e855b1 100644 --- a/splitio/producer/initialization_test.go +++ b/splitio/producer/initialization_test.go @@ -14,9 +14,9 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/producer/conf" "github.com/splitio/split-synchronizer/v5/splitio/util" - config "github.com/splitio/go-split-commons/v8/conf" - "github.com/splitio/go-split-commons/v8/service/mocks" - predis "github.com/splitio/go-split-commons/v8/storage/redis" + config "github.com/splitio/go-split-commons/v9/conf" + "github.com/splitio/go-split-commons/v9/service/mocks" + predis "github.com/splitio/go-split-commons/v9/storage/redis" "github.com/splitio/go-toolkit/v5/logging" "github.com/stretchr/testify/mock" diff --git a/splitio/producer/storage/mocks/telemetry.go b/splitio/producer/storage/mocks/telemetry.go index 8466f75c..c5852bc3 100644 --- a/splitio/producer/storage/mocks/telemetry.go +++ b/splitio/producer/storage/mocks/telemetry.go @@ -1,7 +1,7 @@ package mocks import ( - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" ) // RedisTelemetryConsumerMultiMock is a mock diff --git a/splitio/producer/storage/telemetry.go b/splitio/producer/storage/telemetry.go index 13244f05..1e18361a 100644 --- a/splitio/producer/storage/telemetry.go +++ b/splitio/producer/storage/telemetry.go @@ -7,9 +7,9 @@ import ( "strconv" "strings" - "github.com/splitio/go-split-commons/v8/dtos" - redisSt "github.com/splitio/go-split-commons/v8/storage/redis" - "github.com/splitio/go-split-commons/v8/telemetry" + "github.com/splitio/go-split-commons/v9/dtos" + redisSt "github.com/splitio/go-split-commons/v9/storage/redis" + "github.com/splitio/go-split-commons/v9/telemetry" "github.com/splitio/go-toolkit/v5/logging" "github.com/splitio/go-toolkit/v5/redis" ) diff --git a/splitio/producer/storage/telemetry_test.go b/splitio/producer/storage/telemetry_test.go index d88eca61..bf3f7d9a 100644 --- a/splitio/producer/storage/telemetry_test.go +++ b/splitio/producer/storage/telemetry_test.go @@ -7,9 +7,9 @@ import ( "testing" "time" - "github.com/splitio/go-split-commons/v8/dtos" - redisSt "github.com/splitio/go-split-commons/v8/storage/redis" - "github.com/splitio/go-split-commons/v8/telemetry" + "github.com/splitio/go-split-commons/v9/dtos" + redisSt "github.com/splitio/go-split-commons/v9/storage/redis" + "github.com/splitio/go-split-commons/v9/telemetry" "github.com/splitio/go-toolkit/v5/logging" "github.com/splitio/go-toolkit/v5/redis" ) diff --git a/splitio/producer/task/events.go b/splitio/producer/task/events.go index 7c578cfe..79b0fe51 100644 --- a/splitio/producer/task/events.go +++ b/splitio/producer/task/events.go @@ -10,8 +10,8 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/producer/evcalc" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/storage" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/storage" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/producer/task/events_test.go b/splitio/producer/task/events_test.go index e09ac79d..f0705f6c 100644 --- a/splitio/producer/task/events_test.go +++ b/splitio/producer/task/events_test.go @@ -13,8 +13,8 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/producer/evcalc" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/storage/mocks" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/storage/mocks" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/producer/task/impressions.go b/splitio/producer/task/impressions.go index f402d9aa..e6567e35 100644 --- a/splitio/producer/task/impressions.go +++ b/splitio/producer/task/impressions.go @@ -11,9 +11,9 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/common/impressionlistener" "github.com/splitio/split-synchronizer/v5/splitio/producer/evcalc" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/provisional" - "github.com/splitio/go-split-commons/v8/storage" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/provisional" + "github.com/splitio/go-split-commons/v9/storage" "github.com/splitio/go-toolkit/v5/logging" ) @@ -165,6 +165,7 @@ func (i *ImpressionsPipelineWorker) sendImpressionsToListener(b *impBatches) { Label: ki.Label, BucketingKey: ki.BucketingKey, Pt: ki.Pt, + Properties: ki.Properties, }) } payload = append(payload, forTest) @@ -268,6 +269,7 @@ func (s *impsWithMetadata) add(i *dtos.Impression) { Label: i.Label, BucketingKey: i.BucketingKey, Pt: i.Pt, + Properties: i.Properties, }) s.count++ } diff --git a/splitio/producer/task/impressions_test.go b/splitio/producer/task/impressions_test.go index 3fe8832a..dca0c829 100644 --- a/splitio/producer/task/impressions_test.go +++ b/splitio/producer/task/impressions_test.go @@ -12,13 +12,16 @@ import ( "time" "github.com/splitio/split-synchronizer/v5/splitio/producer/evcalc" + "github.com/splitio/split-synchronizer/v5/splitio/common/impressionlistener" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/provisional" - "github.com/splitio/go-split-commons/v8/provisional/strategy" - "github.com/splitio/go-split-commons/v8/storage/inmemory" - "github.com/splitio/go-split-commons/v8/storage/mocks" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/provisional" + "github.com/splitio/go-split-commons/v9/provisional/strategy" + "github.com/splitio/go-split-commons/v9/storage/inmemory" + "github.com/splitio/go-split-commons/v9/storage/mocks" "github.com/splitio/go-toolkit/v5/logging" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" ) type trackingAllocator struct { @@ -108,6 +111,10 @@ func newTrackingAllocator() *trackingAllocator { } func makeSerializedImpressions(metadatas int, features int, keys int) [][]byte { + return makeSerializedImpressionsWithProperties(metadatas, features, keys, false) +} + +func makeSerializedImpressionsWithProperties(metadatas int, features int, keys int, withProperties bool) [][]byte { result := func(r []byte, _ error) []byte { return r } imps := make([][]byte, 0, metadatas*features*keys) for mindex := 0; mindex < metadatas; mindex++ { @@ -115,9 +122,17 @@ func makeSerializedImpressions(metadatas int, features int, keys int) [][]byte { for findex := 0; findex < features; findex++ { feature := "feat_" + strconv.Itoa(findex) for kindex := 0; kindex < keys; kindex++ { + imp := dtos.Impression{ + FeatureName: feature, + KeyName: "key_" + strconv.Itoa(kindex), + Time: int64(1 + mindex*findex*kindex), + } + if withProperties { + imp.Properties = "{'prop':'val'}" + } imps = append(imps, result(json.Marshal(&dtos.ImpressionQueueObject{ Metadata: metadata, - Impression: dtos.Impression{FeatureName: feature, KeyName: "key_" + strconv.Itoa(kindex), Time: int64(1 + mindex*findex*kindex)}, + Impression: imp, }))) } } @@ -166,6 +181,187 @@ func TestMemoryIsProperlyReturned(t *testing.T) { poolWrapper.validate(t) } +func TestImpressionsWithPropertiesIntegration(t *testing.T) { + + var mtx sync.Mutex + impsByMachineName := make(map[string]int, 3) + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + body, err := ioutil.ReadAll(r.Body) + if err != nil { + t.Error("error reading body") + } + + var ti []dtos.ImpressionsDTO + if err := json.Unmarshal(body, &ti); err != nil { + t.Error("error deserializing body: ", err) + } + + impressionCount := 0 + for _, feature := range ti { + for _, imp := range feature.KeyImpressions { + impressionCount++ + assert.Equal(t, "{'prop':'val'}", imp.Properties, "Impression should have properties") + } + } + + machine := r.Header.Get("SplitSDKMachineName") + mtx.Lock() + impsByMachineName[machine] = impsByMachineName[machine] + impressionCount + mtx.Unlock() + })) + defer server.Close() + + imps := makeSerializedImpressionsWithProperties(3, 4, 20, true) + var calls int64 + st := &mocks.MockImpressionStorage{ + PopNRawCall: func(int64) ([]string, int64, error) { + atomic.AddInt64(&calls, 1) + return []string{}, 0, nil + }, + } + + impressionCounter := strategy.NewImpressionsCounter() + impressionObserver, _ := strategy.NewImpressionObserver(500) + strategy := strategy.NewOptimizedImpl(impressionObserver, impressionCounter, &inmemory.TelemetryStorage{}, false) + + w, err := NewImpressionWorker(&ImpressionWorkerConfig{ + EvictionMonitor: evcalc.New(1), + Logger: logging.NewLogger(nil), + ImpressionsListener: nil, + Storage: st, + URL: server.URL, + Apikey: "someApikey", + FetchSize: 100, + ImpressionManager: provisional.NewImpressionManager(strategy), + }) + if err != nil { + t.Error("there should be no error. Got: ", err) + } + + sinker := make(chan interface{}, 100) + w.Process(imps, sinker) + + for i := 0; i < 3; i++ { + i := <-sinker + req, err := w.BuildRequest(i) + if err != nil { + t.Error("there should be no error. Got: ", err) + } + + // Make the actual HTTP request + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + t.Error("error making request: ", err) + } + resp.Body.Close() + + if asRecyclable, ok := i.(recyclable); ok { + asRecyclable.recycle() + } + } + + if len(impsByMachineName) != 3 { + t.Error("wrong number of machines reporting impressions") + } + + for _, count := range impsByMachineName { + if count != 80 { + t.Error("wrong number of impressions per machine") + } + } +} + +type mockImpressionBulkListener struct { + mock.Mock +} + +func (m *mockImpressionBulkListener) Submit(imps []impressionlistener.ImpressionsForListener, metadata *dtos.Metadata) error { + args := m.Called(imps, metadata) + return args.Error(0) +} + +func (m *mockImpressionBulkListener) Start() error { + args := m.Called() + return args.Error(0) +} + +func (m *mockImpressionBulkListener) Stop(blocking bool) error { + args := m.Called(blocking) + return args.Error(0) +} + +func TestSendImpressionsToListener(t *testing.T) { + // Create a mock listener + mockListener := new(mockImpressionBulkListener) + + // Setup expectations + mockListener.On("Submit", mock.MatchedBy(func(imps []impressionlistener.ImpressionsForListener) bool { + if len(imps) != 1 { + return false + } + if len(imps[0].KeyImpressions) != 1 { + return false + } + imp := imps[0].KeyImpressions[0] + return imps[0].TestName == "test-feature" && + imp.KeyName == "test-key" && + imp.Treatment == "on" && + imp.Time == int64(123) && + imp.Properties == "{'prop':'val'}" && + imp.Label == "test-label" && + imp.BucketingKey == "test-bucket" && + imp.ChangeNumber == int64(456) && + imp.Pt == int64(789) + }), mock.MatchedBy(func(metadata *dtos.Metadata) bool { + return metadata.SDKVersion == "go-1.1.1" && + metadata.MachineIP == "1.2.3.4" && + metadata.MachineName == "test-machine" + })).Return(nil).Once() + + // Create a worker with the mock listener + w, err := NewImpressionWorker(&ImpressionWorkerConfig{ + EvictionMonitor: evcalc.New(1), + Logger: logging.NewLogger(nil), + ImpressionsListener: mockListener, + Storage: mocks.MockImpressionStorage{}, + URL: "http://test", + Apikey: "someApikey", + FetchSize: 100, + ImpressionManager: provisional.NewImpressionManager(strategy.NewOptimizedImpl(nil, nil, &inmemory.TelemetryStorage{}, false)), + }) + assert.NoError(t, err) + + // Create test impressions + batches := newImpBatches(w.pool) + + // Add test impressions + batches.add(&dtos.ImpressionQueueObject{ + Metadata: dtos.Metadata{ + SDKVersion: "go-1.1.1", + MachineIP: "1.2.3.4", + MachineName: "test-machine", + }, + Impression: dtos.Impression{ + FeatureName: "test-feature", + KeyName: "test-key", + Treatment: "on", + Time: 123, + Properties: "{'prop':'val'}", + Label: "test-label", + BucketingKey: "test-bucket", + ChangeNumber: 456, + Pt: 789, + }, + }) + + // Send impressions to listener + w.sendImpressionsToListener(batches) + + // Verify that all expected calls were made + mockListener.AssertExpectations(t) +} + func TestImpressionsIntegration(t *testing.T) { var mtx sync.Mutex diff --git a/splitio/producer/task/uniquekeys.go b/splitio/producer/task/uniquekeys.go index 0b26d61d..09ff8e63 100644 --- a/splitio/producer/task/uniquekeys.go +++ b/splitio/producer/task/uniquekeys.go @@ -6,9 +6,9 @@ import ( "fmt" "net/http" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/provisional/strategy" - "github.com/splitio/go-split-commons/v8/storage" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/provisional/strategy" + "github.com/splitio/go-split-commons/v9/storage" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/producer/task/uniquekeys_test.go b/splitio/producer/task/uniquekeys_test.go index 3d01effc..da6a8726 100644 --- a/splitio/producer/task/uniquekeys_test.go +++ b/splitio/producer/task/uniquekeys_test.go @@ -4,9 +4,9 @@ import ( "encoding/json" "testing" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/provisional/strategy" - "github.com/splitio/go-split-commons/v8/storage/mocks" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/provisional/strategy" + "github.com/splitio/go-split-commons/v9/storage/mocks" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/producer/util.go b/splitio/producer/util.go index f4781d59..d85c576e 100644 --- a/splitio/producer/util.go +++ b/splitio/producer/util.go @@ -18,12 +18,12 @@ import ( hcServicesCounter "github.com/splitio/split-synchronizer/v5/splitio/provisional/healthcheck/services/counter" "github.com/splitio/split-synchronizer/v5/splitio/util" - config "github.com/splitio/go-split-commons/v8/conf" - "github.com/splitio/go-split-commons/v8/provisional" - "github.com/splitio/go-split-commons/v8/provisional/strategy" - "github.com/splitio/go-split-commons/v8/service" - storageCommon "github.com/splitio/go-split-commons/v8/storage" - "github.com/splitio/go-split-commons/v8/storage/redis" + config "github.com/splitio/go-split-commons/v9/conf" + "github.com/splitio/go-split-commons/v9/provisional" + "github.com/splitio/go-split-commons/v9/provisional/strategy" + "github.com/splitio/go-split-commons/v9/service" + storageCommon "github.com/splitio/go-split-commons/v9/storage" + "github.com/splitio/go-split-commons/v9/storage/redis" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/producer/worker/impcounts.go b/splitio/producer/worker/impcounts.go index 99e7eaf8..1041c945 100644 --- a/splitio/producer/worker/impcounts.go +++ b/splitio/producer/worker/impcounts.go @@ -1,8 +1,8 @@ package worker import ( - "github.com/splitio/go-split-commons/v8/provisional/strategy" - "github.com/splitio/go-split-commons/v8/storage" + "github.com/splitio/go-split-commons/v9/provisional/strategy" + "github.com/splitio/go-split-commons/v9/storage" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/producer/worker/telemetry.go b/splitio/producer/worker/telemetry.go index 10eebc1b..686ac5ab 100644 --- a/splitio/producer/worker/telemetry.go +++ b/splitio/producer/worker/telemetry.go @@ -5,8 +5,8 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/producer/storage" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/service" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/service" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/producer/worker/telemetry_test.go b/splitio/producer/worker/telemetry_test.go index 16ba9fcc..74eb29ec 100644 --- a/splitio/producer/worker/telemetry_test.go +++ b/splitio/producer/worker/telemetry_test.go @@ -6,9 +6,9 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/producer/storage" storageMocks "github.com/splitio/split-synchronizer/v5/splitio/producer/storage/mocks" - "github.com/splitio/go-split-commons/v8/dtos" - serviceMocks "github.com/splitio/go-split-commons/v8/service/mocks" - "github.com/splitio/go-split-commons/v8/telemetry" + "github.com/splitio/go-split-commons/v9/dtos" + serviceMocks "github.com/splitio/go-split-commons/v9/service/mocks" + "github.com/splitio/go-split-commons/v9/telemetry" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/provisional/healthcheck/application/monitor.go b/splitio/provisional/healthcheck/application/monitor.go index 913bd5dd..2ce6cdf2 100644 --- a/splitio/provisional/healthcheck/application/monitor.go +++ b/splitio/provisional/healthcheck/application/monitor.go @@ -7,7 +7,7 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/provisional/healthcheck/application/counter" - hc "github.com/splitio/go-split-commons/v8/healthcheck/application" + hc "github.com/splitio/go-split-commons/v9/healthcheck/application" "github.com/splitio/go-toolkit/v5/logging" toolkitsync "github.com/splitio/go-toolkit/v5/sync" ) diff --git a/splitio/provisional/healthcheck/application/monitor_test.go b/splitio/provisional/healthcheck/application/monitor_test.go index 085c3237..26bca0e0 100644 --- a/splitio/provisional/healthcheck/application/monitor_test.go +++ b/splitio/provisional/healthcheck/application/monitor_test.go @@ -6,7 +6,7 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/provisional/healthcheck/application/counter" - "github.com/splitio/go-split-commons/v8/healthcheck/application" + "github.com/splitio/go-split-commons/v9/healthcheck/application" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/provisional/healthcheck/services/counter/bypercentage.go b/splitio/provisional/healthcheck/services/counter/bypercentage.go index df15c9fc..1acb2ca4 100644 --- a/splitio/provisional/healthcheck/services/counter/bypercentage.go +++ b/splitio/provisional/healthcheck/services/counter/bypercentage.go @@ -6,9 +6,9 @@ import ( "sync" "time" - "github.com/splitio/go-split-commons/v8/conf" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/service/api" + "github.com/splitio/go-split-commons/v9/conf" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/service/api" "github.com/splitio/go-toolkit/v5/asynctask" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/provisional/observability/segment_wrapper.go b/splitio/provisional/observability/segment_wrapper.go index 17c1fb8a..65dbcdd1 100644 --- a/splitio/provisional/observability/segment_wrapper.go +++ b/splitio/provisional/observability/segment_wrapper.go @@ -5,7 +5,7 @@ import ( "fmt" "sync" - "github.com/splitio/go-split-commons/v8/storage" + "github.com/splitio/go-split-commons/v9/storage" "github.com/splitio/go-toolkit/v5/datastructures/set" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/provisional/observability/segment_wrapper_test.go b/splitio/provisional/observability/segment_wrapper_test.go index 62e55d6b..89058346 100644 --- a/splitio/provisional/observability/segment_wrapper_test.go +++ b/splitio/provisional/observability/segment_wrapper_test.go @@ -4,7 +4,7 @@ import ( "reflect" "testing" - "github.com/splitio/go-split-commons/v8/storage/mocks" + "github.com/splitio/go-split-commons/v9/storage/mocks" "github.com/splitio/go-toolkit/v5/datastructures/set" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/provisional/observability/split_wrapper.go b/splitio/provisional/observability/split_wrapper.go index f6e9f19d..67ea5cfc 100644 --- a/splitio/provisional/observability/split_wrapper.go +++ b/splitio/provisional/observability/split_wrapper.go @@ -4,9 +4,9 @@ import ( "errors" "sync" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/storage" - "github.com/splitio/go-split-commons/v8/storage/redis" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/storage" + "github.com/splitio/go-split-commons/v9/storage/redis" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/provisional/observability/split_wrapper_test.go b/splitio/provisional/observability/split_wrapper_test.go index e0a6f300..6eac7417 100644 --- a/splitio/provisional/observability/split_wrapper_test.go +++ b/splitio/provisional/observability/split_wrapper_test.go @@ -4,9 +4,9 @@ import ( "errors" "testing" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/storage/mocks" - "github.com/splitio/go-split-commons/v8/storage/redis" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/storage/mocks" + "github.com/splitio/go-split-commons/v9/storage/redis" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/proxy/caching/caching.go b/splitio/proxy/caching/caching.go index 958b7dca..2d456314 100644 --- a/splitio/proxy/caching/caching.go +++ b/splitio/proxy/caching/caching.go @@ -4,7 +4,7 @@ import ( "strings" "github.com/splitio/gincache" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/gin-gonic/gin" ) diff --git a/splitio/proxy/caching/caching_test.go b/splitio/proxy/caching/caching_test.go index 62f02b2f..ed18af12 100644 --- a/splitio/proxy/caching/caching_test.go +++ b/splitio/proxy/caching/caching_test.go @@ -5,7 +5,7 @@ import ( "net/url" "testing" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/gin-gonic/gin" diff --git a/splitio/proxy/caching/mocks/mock.go b/splitio/proxy/caching/mocks/mock.go index 24a01556..d56d2939 100644 --- a/splitio/proxy/caching/mocks/mock.go +++ b/splitio/proxy/caching/mocks/mock.go @@ -2,11 +2,11 @@ package mocks import ( "github.com/splitio/gincache" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/storage" - "github.com/splitio/go-split-commons/v8/synchronizer/worker/largesegment" - "github.com/splitio/go-split-commons/v8/synchronizer/worker/segment" - "github.com/splitio/go-split-commons/v8/synchronizer/worker/split" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/storage" + "github.com/splitio/go-split-commons/v9/synchronizer/worker/largesegment" + "github.com/splitio/go-split-commons/v9/synchronizer/worker/segment" + "github.com/splitio/go-split-commons/v9/synchronizer/worker/split" "github.com/splitio/go-toolkit/v5/datastructures/set" "github.com/stretchr/testify/mock" diff --git a/splitio/proxy/caching/workers.go b/splitio/proxy/caching/workers.go index c7614475..0e207e21 100644 --- a/splitio/proxy/caching/workers.go +++ b/splitio/proxy/caching/workers.go @@ -2,15 +2,15 @@ package caching import ( "github.com/splitio/gincache" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/engine/grammar" - "github.com/splitio/go-split-commons/v8/flagsets" - "github.com/splitio/go-split-commons/v8/healthcheck/application" - "github.com/splitio/go-split-commons/v8/service" - "github.com/splitio/go-split-commons/v8/storage" - "github.com/splitio/go-split-commons/v8/synchronizer/worker/largesegment" - "github.com/splitio/go-split-commons/v8/synchronizer/worker/segment" - "github.com/splitio/go-split-commons/v8/synchronizer/worker/split" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/engine/grammar" + "github.com/splitio/go-split-commons/v9/flagsets" + "github.com/splitio/go-split-commons/v9/healthcheck/application" + "github.com/splitio/go-split-commons/v9/service" + "github.com/splitio/go-split-commons/v9/storage" + "github.com/splitio/go-split-commons/v9/synchronizer/worker/largesegment" + "github.com/splitio/go-split-commons/v9/synchronizer/worker/segment" + "github.com/splitio/go-split-commons/v9/synchronizer/worker/split" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/proxy/caching/workers_test.go b/splitio/proxy/caching/workers_test.go index e3893e3f..3c3d0361 100644 --- a/splitio/proxy/caching/workers_test.go +++ b/splitio/proxy/caching/workers_test.go @@ -5,10 +5,10 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/caching/mocks" - "github.com/splitio/go-split-commons/v8/dtos" - commons "github.com/splitio/go-split-commons/v8/storage/mocks" - "github.com/splitio/go-split-commons/v8/synchronizer/worker/segment" - "github.com/splitio/go-split-commons/v8/synchronizer/worker/split" + "github.com/splitio/go-split-commons/v9/dtos" + commons "github.com/splitio/go-split-commons/v9/storage/mocks" + "github.com/splitio/go-split-commons/v9/synchronizer/worker/segment" + "github.com/splitio/go-split-commons/v9/synchronizer/worker/split" "github.com/splitio/go-toolkit/v5/datastructures/set" "github.com/stretchr/testify/assert" diff --git a/splitio/proxy/conf/sections.go b/splitio/proxy/conf/sections.go index 1e131785..e88d65bb 100644 --- a/splitio/proxy/conf/sections.go +++ b/splitio/proxy/conf/sections.go @@ -3,8 +3,8 @@ package conf import ( "github.com/splitio/split-synchronizer/v5/splitio/common/conf" - cconf "github.com/splitio/go-split-commons/v8/conf" - "github.com/splitio/go-split-commons/v8/service/api/specs" + cconf "github.com/splitio/go-split-commons/v9/conf" + "github.com/splitio/go-split-commons/v9/service/api/specs" ) // Main configuration options diff --git a/splitio/proxy/controllers/events.go b/splitio/proxy/controllers/events.go index 447525bb..15a41c6c 100644 --- a/splitio/proxy/controllers/events.go +++ b/splitio/proxy/controllers/events.go @@ -9,7 +9,7 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/internal" "github.com/splitio/split-synchronizer/v5/splitio/proxy/tasks" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/splitio/go-toolkit/v5/logging" "github.com/gin-gonic/gin" @@ -281,6 +281,7 @@ func (c *EventsServerController) submitImpressionsToListener(raw []byte, metadat Label: ki.Label, BucketingKey: ki.BucketingKey, Pt: ki.Pt, + Properties: ki.Properties, }) } forListener = append(forListener, impressionlistener.ImpressionsForListener{ diff --git a/splitio/proxy/controllers/events_test.go b/splitio/proxy/controllers/events_test.go index 4d48678f..12e016da 100644 --- a/splitio/proxy/controllers/events_test.go +++ b/splitio/proxy/controllers/events_test.go @@ -6,14 +6,17 @@ import ( "net/http" "net/http/httptest" "testing" + "time" "github.com/splitio/split-synchronizer/v5/splitio/common/impressionlistener" ilMock "github.com/splitio/split-synchronizer/v5/splitio/common/impressionlistener/mocks" mw "github.com/splitio/split-synchronizer/v5/splitio/proxy/controllers/middleware" "github.com/splitio/split-synchronizer/v5/splitio/proxy/internal" "github.com/splitio/split-synchronizer/v5/splitio/proxy/tasks/mocks" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/splitio/go-toolkit/v5/logging" "github.com/gin-gonic/gin" @@ -121,6 +124,100 @@ func TestPostImpressionsbulk(t *testing.T) { } } +func TestPostImpressionsbulkWithProperties(t *testing.T) { + gin.SetMode(gin.TestMode) + resp := httptest.NewRecorder() + ctx, router := gin.CreateTestContext(resp) + + logger := logging.NewLogger(nil) + apikeyValidator := mw.NewAPIKeyValidator([]string{"someApiKey"}) + + impressionsSink := mocks.DeferredRecordingTaskMock{} + listener := ilMock.MockImpressionBulkListener{} + group := router.Group("/api") + controller := NewEventsServerController( + logger, + &impressionsSink, // impssions + &mocks.DeferredRecordingTaskMock{}, // imp counts + &mocks.DeferredRecordingTaskMock{}, // events + &listener, + apikeyValidator.IsValid, + ) + controller.Register(group, group) + + // Set up expectations for impressionsSink + impressionsSink.On("Stage", mock.Anything).Return(nil, nil) + + // Set up expectations for listener + listener.On("Submit", mock.MatchedBy(func(imps []impressionlistener.ImpressionsForListener) bool { + // Verify the structure and content of impressions + assert.Equal(t, 2, len(imps), "Should have 2 impression groups") + + // Check test1 impressions + assert.Equal(t, "test1", imps[0].TestName, "First group should be test1") + assert.Equal(t, 3, len(imps[0].KeyImpressions), "test1 should have 3 impressions") + + // Verify properties for test1 + assert.Equal(t, "{'prop':'val'}", imps[0].KeyImpressions[0].Properties, "First impression of test1 should have properties") + assert.Equal(t, "{'prop':'val'}", imps[0].KeyImpressions[1].Properties, "Second impression of test1 should have properties") + + // Check test2 impressions + assert.Equal(t, "test2", imps[1].TestName, "Second group should be test2") + assert.Equal(t, 4, len(imps[1].KeyImpressions), "test2 should have 4 impressions") + + // Verify properties for test2 + assert.Equal(t, "{'prop':'val'}", imps[1].KeyImpressions[0].Properties, "First impression of test2 should have properties") + assert.Equal(t, "{'prop':'val'}", imps[1].KeyImpressions[1].Properties, "Second impression of test2 should have properties") + + return true + }), mock.MatchedBy(func(metadata *dtos.Metadata) bool { + expected := dtos.Metadata{SDKVersion: "go-1.1.1", MachineIP: "1.2.3.4", MachineName: "ip-1-2-3-4"} + assert.Equal(t, expected, *metadata, "Metadata should match expected values") + return true + })).Return(nil, nil) + + serialized, err := json.Marshal([]dtos.ImpressionsDTO{ + { + TestName: "test1", + KeyImpressions: []dtos.ImpressionDTO{ + {KeyName: "k1", Treatment: "on", Time: 1, ChangeNumber: 2, Label: "l1", BucketingKey: "b1", Pt: 0, Properties: "{'prop':'val'}"}, + {KeyName: "k2", Treatment: "on", Time: 2, ChangeNumber: 3, Label: "l2", BucketingKey: "b2", Pt: 0, Properties: "{'prop':'val'}"}, + {KeyName: "k3", Treatment: "on", Time: 3, ChangeNumber: 4, Label: "l3", BucketingKey: "b3", Pt: 0}, + }, + }, + { + TestName: "test2", + KeyImpressions: []dtos.ImpressionDTO{ + {KeyName: "k1", Treatment: "off", Time: 1, ChangeNumber: 2, Label: "l1", BucketingKey: "b1", Pt: 0, Properties: "{'prop':'val'}"}, + {KeyName: "k2", Treatment: "off", Time: 2, ChangeNumber: 3, Label: "l2", BucketingKey: "b2", Pt: 0, Properties: "{'prop':'val'}"}, + {KeyName: "k3", Treatment: "off", Time: 3, ChangeNumber: 4, Label: "l3", BucketingKey: "b3", Pt: 0}, + {KeyName: "k4", Treatment: "off", Time: 4, ChangeNumber: 5, Label: "l4", BucketingKey: "b4", Pt: 0}, + }, + }, + }) + + if err != nil { + t.Error("should not have errors when serializing: ", err) + } + + ctx.Request, _ = http.NewRequest(http.MethodPost, "/api/testImpressions/bulk", bytes.NewBuffer(serialized)) + ctx.Request.Header.Set("Authorization", "Bearer someApiKey") + ctx.Request.Header.Set("SplitSDKImpressionsMode", "optimized") + ctx.Request.Header.Set("SplitSDKVersion", "go-1.1.1") + ctx.Request.Header.Set("SplitSDKMachineIp", "1.2.3.4") + ctx.Request.Header.Set("SplitSDKMachineName", "ip-1-2-3-4") + router.ServeHTTP(resp, ctx.Request) + + assert.Equal(t, 200, resp.Code, "Status code should be 200") + + // Add a small delay to allow the goroutine to complete + time.Sleep(50 * time.Millisecond) + + // Verify that all expectations were met + listener.AssertExpectations(t) + impressionsSink.AssertExpectations(t) +} + func TestPostEventsBulk(t *testing.T) { gin.SetMode(gin.TestMode) resp := httptest.NewRecorder() diff --git a/splitio/proxy/controllers/sdk.go b/splitio/proxy/controllers/sdk.go index ae3f07dd..b4b3eda5 100644 --- a/splitio/proxy/controllers/sdk.go +++ b/splitio/proxy/controllers/sdk.go @@ -11,11 +11,11 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/flagsets" "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/engine/validator" - "github.com/splitio/go-split-commons/v8/service" - "github.com/splitio/go-split-commons/v8/service/api/specs" - cmnStorage "github.com/splitio/go-split-commons/v8/storage" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/engine/validator" + "github.com/splitio/go-split-commons/v9/service" + "github.com/splitio/go-split-commons/v9/service/api/specs" + cmnStorage "github.com/splitio/go-split-commons/v9/storage" "github.com/splitio/go-toolkit/v5/common" "github.com/splitio/go-toolkit/v5/logging" diff --git a/splitio/proxy/controllers/sdk_test.go b/splitio/proxy/controllers/sdk_test.go index 1f454602..cb9aad09 100644 --- a/splitio/proxy/controllers/sdk_test.go +++ b/splitio/proxy/controllers/sdk_test.go @@ -12,14 +12,14 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage" psmocks "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage/mocks" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/engine/evaluator/impressionlabels" - "github.com/splitio/go-split-commons/v8/engine/grammar" - "github.com/splitio/go-split-commons/v8/engine/grammar/constants" - "github.com/splitio/go-split-commons/v8/service" - "github.com/splitio/go-split-commons/v8/service/api/specs" - "github.com/splitio/go-split-commons/v8/service/mocks" - cmnStorage "github.com/splitio/go-split-commons/v8/storage" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/engine/evaluator/impressionlabels" + "github.com/splitio/go-split-commons/v9/engine/grammar" + "github.com/splitio/go-split-commons/v9/engine/grammar/constants" + "github.com/splitio/go-split-commons/v9/service" + "github.com/splitio/go-split-commons/v9/service/api/specs" + "github.com/splitio/go-split-commons/v9/service/mocks" + cmnStorage "github.com/splitio/go-split-commons/v9/storage" "github.com/splitio/go-toolkit/v5/common" "github.com/splitio/go-toolkit/v5/logging" diff --git a/splitio/proxy/controllers/telemetry.go b/splitio/proxy/controllers/telemetry.go index f6f90d4d..44eed9f2 100644 --- a/splitio/proxy/controllers/telemetry.go +++ b/splitio/proxy/controllers/telemetry.go @@ -8,7 +8,7 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/internal" "github.com/splitio/split-synchronizer/v5/splitio/proxy/tasks" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/splitio/go-toolkit/v5/logging" "github.com/gin-gonic/gin" diff --git a/splitio/proxy/controllers/telemetry_test.go b/splitio/proxy/controllers/telemetry_test.go index 73b75b76..454fd1d5 100644 --- a/splitio/proxy/controllers/telemetry_test.go +++ b/splitio/proxy/controllers/telemetry_test.go @@ -11,7 +11,7 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/internal" "github.com/splitio/split-synchronizer/v5/splitio/proxy/tasks/mocks" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/splitio/go-toolkit/v5/logging" "github.com/gin-gonic/gin" diff --git a/splitio/proxy/controllers/util.go b/splitio/proxy/controllers/util.go index a33f904e..e9cd5675 100644 --- a/splitio/proxy/controllers/util.go +++ b/splitio/proxy/controllers/util.go @@ -1,8 +1,8 @@ package controllers import ( - "github.com/splitio/go-split-commons/v8/conf" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/conf" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/gin-gonic/gin" ) diff --git a/splitio/proxy/initialization.go b/splitio/proxy/initialization.go index 4fbd890e..fa3ca325 100644 --- a/splitio/proxy/initialization.go +++ b/splitio/proxy/initialization.go @@ -26,14 +26,14 @@ import ( pTasks "github.com/splitio/split-synchronizer/v5/splitio/proxy/tasks" "github.com/splitio/split-synchronizer/v5/splitio/util" - "github.com/splitio/go-split-commons/v8/conf" - "github.com/splitio/go-split-commons/v8/engine/grammar" - "github.com/splitio/go-split-commons/v8/flagsets" - "github.com/splitio/go-split-commons/v8/service/api" - inmemory "github.com/splitio/go-split-commons/v8/storage/inmemory/mutexmap" - "github.com/splitio/go-split-commons/v8/synchronizer" - "github.com/splitio/go-split-commons/v8/tasks" - "github.com/splitio/go-split-commons/v8/telemetry" + "github.com/splitio/go-split-commons/v9/conf" + "github.com/splitio/go-split-commons/v9/engine/grammar" + "github.com/splitio/go-split-commons/v9/flagsets" + "github.com/splitio/go-split-commons/v9/service/api" + inmemory "github.com/splitio/go-split-commons/v9/storage/inmemory/mutexmap" + "github.com/splitio/go-split-commons/v9/synchronizer" + "github.com/splitio/go-split-commons/v9/tasks" + "github.com/splitio/go-split-commons/v9/telemetry" "github.com/splitio/go-toolkit/v5/backoff" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/proxy/initialization_test.go b/splitio/proxy/initialization_test.go index 4a6d4d7e..ed2d6f8c 100644 --- a/splitio/proxy/initialization_test.go +++ b/splitio/proxy/initialization_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - "github.com/splitio/go-split-commons/v8/synchronizer" + "github.com/splitio/go-split-commons/v9/synchronizer" ) type syncManagerMock struct { diff --git a/splitio/proxy/internal/dtos.go b/splitio/proxy/internal/dtos.go index 6beda649..658183ad 100644 --- a/splitio/proxy/internal/dtos.go +++ b/splitio/proxy/internal/dtos.go @@ -1,7 +1,7 @@ package internal import ( - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" ) // RawData represents the raw data submitted by an sdk when posting data with associated metadata diff --git a/splitio/proxy/proxy.go b/splitio/proxy/proxy.go index da56dc9a..7020efe6 100644 --- a/splitio/proxy/proxy.go +++ b/splitio/proxy/proxy.go @@ -14,8 +14,8 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/tasks" "github.com/splitio/gincache" - "github.com/splitio/go-split-commons/v8/service" - cmnStorage "github.com/splitio/go-split-commons/v8/storage" + "github.com/splitio/go-split-commons/v9/service" + cmnStorage "github.com/splitio/go-split-commons/v9/storage" "github.com/splitio/go-toolkit/v5/logging" "github.com/gin-contrib/cors" diff --git a/splitio/proxy/proxy_test.go b/splitio/proxy/proxy_test.go index bb39a674..1c41d705 100644 --- a/splitio/proxy/proxy_test.go +++ b/splitio/proxy/proxy_test.go @@ -16,8 +16,8 @@ import ( pstorageMocks "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage/mocks" taskMocks "github.com/splitio/split-synchronizer/v5/splitio/proxy/tasks/mocks" - "github.com/splitio/go-split-commons/v8/dtos" - serviceMocks "github.com/splitio/go-split-commons/v8/service/mocks" + "github.com/splitio/go-split-commons/v9/dtos" + serviceMocks "github.com/splitio/go-split-commons/v9/service/mocks" "github.com/splitio/go-toolkit/v5/logging" "github.com/stretchr/testify/assert" diff --git a/splitio/proxy/storage/mocks/mocks.go b/splitio/proxy/storage/mocks/mocks.go index de6ebf2c..c3943cec 100644 --- a/splitio/proxy/storage/mocks/mocks.go +++ b/splitio/proxy/storage/mocks/mocks.go @@ -1,7 +1,7 @@ package mocks import ( - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/stretchr/testify/mock" ) diff --git a/splitio/proxy/storage/mocks/rbsstorage.go b/splitio/proxy/storage/mocks/rbsstorage.go index 14c56fb3..da3c2a8a 100644 --- a/splitio/proxy/storage/mocks/rbsstorage.go +++ b/splitio/proxy/storage/mocks/rbsstorage.go @@ -1,7 +1,7 @@ package mocks import ( - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage" "github.com/stretchr/testify/mock" ) diff --git a/splitio/proxy/storage/optimized/historic.go b/splitio/proxy/storage/optimized/historic.go index e4b26d87..aa87c062 100644 --- a/splitio/proxy/storage/optimized/historic.go +++ b/splitio/proxy/storage/optimized/historic.go @@ -6,7 +6,7 @@ import ( "strings" "sync" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" ) type HistoricChanges interface { diff --git a/splitio/proxy/storage/optimized/historic_test.go b/splitio/proxy/storage/optimized/historic_test.go index f6061749..f41a8077 100644 --- a/splitio/proxy/storage/optimized/historic_test.go +++ b/splitio/proxy/storage/optimized/historic_test.go @@ -6,7 +6,7 @@ import ( "testing" "time" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/stretchr/testify/assert" ) diff --git a/splitio/proxy/storage/optimized/mocks/mocks.go b/splitio/proxy/storage/optimized/mocks/mocks.go index 6af1a4a5..3ec353f7 100644 --- a/splitio/proxy/storage/optimized/mocks/mocks.go +++ b/splitio/proxy/storage/optimized/mocks/mocks.go @@ -1,7 +1,7 @@ package mocks import ( - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage/optimized" "github.com/stretchr/testify/mock" ) diff --git a/splitio/proxy/storage/optimized/rbshistoric.go b/splitio/proxy/storage/optimized/rbshistoric.go index 8ac0650d..343bc45f 100644 --- a/splitio/proxy/storage/optimized/rbshistoric.go +++ b/splitio/proxy/storage/optimized/rbshistoric.go @@ -4,7 +4,7 @@ import ( "sort" "sync" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" ) type HistoricChangesRB interface { diff --git a/splitio/proxy/storage/optimized/rbshistoric_test.go b/splitio/proxy/storage/optimized/rbshistoric_test.go index e1cc289a..2d1c5fa2 100644 --- a/splitio/proxy/storage/optimized/rbshistoric_test.go +++ b/splitio/proxy/storage/optimized/rbshistoric_test.go @@ -3,7 +3,7 @@ package optimized import ( "testing" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/stretchr/testify/assert" ) diff --git a/splitio/proxy/storage/persistent/rulebasedsegments.go b/splitio/proxy/storage/persistent/rulebasedsegments.go index 8361a302..d4f22140 100644 --- a/splitio/proxy/storage/persistent/rulebasedsegments.go +++ b/splitio/proxy/storage/persistent/rulebasedsegments.go @@ -6,7 +6,7 @@ import ( "encoding/json" "sync" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/proxy/storage/persistent/rulebasedsegments_test.go b/splitio/proxy/storage/persistent/rulebasedsegments_test.go index 512eba75..04b39a68 100644 --- a/splitio/proxy/storage/persistent/rulebasedsegments_test.go +++ b/splitio/proxy/storage/persistent/rulebasedsegments_test.go @@ -3,7 +3,7 @@ package persistent import ( "testing" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/proxy/storage/persistent/splits.go b/splitio/proxy/storage/persistent/splits.go index 73cad538..76c5dafd 100644 --- a/splitio/proxy/storage/persistent/splits.go +++ b/splitio/proxy/storage/persistent/splits.go @@ -6,7 +6,7 @@ import ( "encoding/json" "sync" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/proxy/storage/persistent/splits_test.go b/splitio/proxy/storage/persistent/splits_test.go index 8294476b..556dc29c 100644 --- a/splitio/proxy/storage/persistent/splits_test.go +++ b/splitio/proxy/storage/persistent/splits_test.go @@ -3,7 +3,7 @@ package persistent import ( "testing" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/proxy/storage/rulebasedsegments.go b/splitio/proxy/storage/rulebasedsegments.go index 4f71d6f1..81c985e6 100644 --- a/splitio/proxy/storage/rulebasedsegments.go +++ b/splitio/proxy/storage/rulebasedsegments.go @@ -7,10 +7,10 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage/optimized" "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage/persistent" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/engine/grammar/constants" - "github.com/splitio/go-split-commons/v8/storage" - "github.com/splitio/go-split-commons/v8/storage/inmemory/mutexmap" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/engine/grammar/constants" + "github.com/splitio/go-split-commons/v9/storage" + "github.com/splitio/go-split-commons/v9/storage/inmemory/mutexmap" "github.com/splitio/go-toolkit/v5/datastructures/set" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/proxy/storage/rulebasedsegments_test.go b/splitio/proxy/storage/rulebasedsegments_test.go index bccfc534..2104891f 100644 --- a/splitio/proxy/storage/rulebasedsegments_test.go +++ b/splitio/proxy/storage/rulebasedsegments_test.go @@ -5,7 +5,7 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage/persistent" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/splitio/go-toolkit/v5/datastructures/set" "github.com/splitio/go-toolkit/v5/logging" diff --git a/splitio/proxy/storage/segments.go b/splitio/proxy/storage/segments.go index e543494e..62b8dfac 100644 --- a/splitio/proxy/storage/segments.go +++ b/splitio/proxy/storage/segments.go @@ -8,8 +8,8 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage/optimized" "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage/persistent" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/storage" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/storage" "github.com/splitio/go-toolkit/v5/datastructures/set" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/proxy/storage/splits.go b/splitio/proxy/storage/splits.go index a67d1028..28207bec 100644 --- a/splitio/proxy/storage/splits.go +++ b/splitio/proxy/storage/splits.go @@ -9,11 +9,11 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage/optimized" "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage/persistent" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/engine/grammar/constants" - "github.com/splitio/go-split-commons/v8/flagsets" - "github.com/splitio/go-split-commons/v8/storage" - "github.com/splitio/go-split-commons/v8/storage/inmemory/mutexmap" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/engine/grammar/constants" + "github.com/splitio/go-split-commons/v9/flagsets" + "github.com/splitio/go-split-commons/v9/storage" + "github.com/splitio/go-split-commons/v9/storage/inmemory/mutexmap" "github.com/splitio/go-toolkit/v5/datastructures/set" "github.com/splitio/go-toolkit/v5/logging" ) diff --git a/splitio/proxy/storage/splits_test.go b/splitio/proxy/storage/splits_test.go index 59356ab4..8b0b3edd 100644 --- a/splitio/proxy/storage/splits_test.go +++ b/splitio/proxy/storage/splits_test.go @@ -7,8 +7,8 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage/optimized/mocks" "github.com/splitio/split-synchronizer/v5/splitio/proxy/storage/persistent" - "github.com/splitio/go-split-commons/v8/dtos" - "github.com/splitio/go-split-commons/v8/flagsets" + "github.com/splitio/go-split-commons/v9/dtos" + "github.com/splitio/go-split-commons/v9/flagsets" "github.com/splitio/go-toolkit/v5/logging" "github.com/stretchr/testify/assert" @@ -257,15 +257,15 @@ func TestChangesSince(t *testing.T) { toAdd := []dtos.SplitDTO{{Name: "split3", ChangeNumber: 15, Status: "ACTIVE", TrafficTypeName: "user"}} toRemove := []dtos.SplitDTO{ { - Name: "split2", - ChangeNumber: 15, - Status: "ARCHIVED", - TrafficTypeName: "user", - TrafficAllocation: 100, - Algo: 1, - DefaultTreatment: "off", - Conditions: []dtos.ConditionDTO{}, - Sets: []string{}, + Name: "split2", + ChangeNumber: 15, + Status: "ARCHIVED", + TrafficTypeName: "user", + TrafficAllocation: 100, + Algo: 1, + DefaultTreatment: "off", + Conditions: []dtos.ConditionDTO{}, + Sets: []string{}, }, } @@ -279,25 +279,25 @@ func TestChangesSince(t *testing.T) { // Should include both the new active split and the archived one expectedSplits := []dtos.SplitDTO{ { - Name: "split3", - ChangeNumber: 15, - Status: "ACTIVE", - TrafficTypeName: "user", - TrafficAllocation: 0, - Algo: 0, - Conditions: nil, - Sets: nil, + Name: "split3", + ChangeNumber: 15, + Status: "ACTIVE", + TrafficTypeName: "user", + TrafficAllocation: 0, + Algo: 0, + Conditions: nil, + Sets: nil, }, { - Name: "split2", - ChangeNumber: 15, - Status: "ARCHIVED", - TrafficTypeName: "user", - TrafficAllocation: 100, - Algo: 1, - DefaultTreatment: "off", - Conditions: []dtos.ConditionDTO{}, - Sets: []string{}, + Name: "split2", + ChangeNumber: 15, + Status: "ARCHIVED", + TrafficTypeName: "user", + TrafficAllocation: 100, + Algo: 1, + DefaultTreatment: "off", + Conditions: []dtos.ConditionDTO{}, + Sets: []string{}, }, } assert.ElementsMatch(t, expectedSplits, changes.Splits) diff --git a/splitio/proxy/storage/telemetry.go b/splitio/proxy/storage/telemetry.go index 72325bcc..46b32e54 100644 --- a/splitio/proxy/storage/telemetry.go +++ b/splitio/proxy/storage/telemetry.go @@ -4,9 +4,9 @@ import ( "sync" "time" - "github.com/splitio/go-split-commons/v8/storage" - "github.com/splitio/go-split-commons/v8/storage/inmemory" - "github.com/splitio/go-split-commons/v8/telemetry" + "github.com/splitio/go-split-commons/v9/storage" + "github.com/splitio/go-split-commons/v9/storage/inmemory" + "github.com/splitio/go-split-commons/v9/telemetry" ) // Local telemetry constants diff --git a/splitio/proxy/storage/telemetryts.go b/splitio/proxy/storage/telemetryts.go index 3dbba0d0..d026f768 100644 --- a/splitio/proxy/storage/telemetryts.go +++ b/splitio/proxy/storage/telemetryts.go @@ -5,7 +5,7 @@ import ( "sync" "time" - "github.com/splitio/go-split-commons/v8/storage" + "github.com/splitio/go-split-commons/v9/storage" ) // Granularity selection constants to be used upon component instantiation diff --git a/splitio/proxy/tasks/deferred.go b/splitio/proxy/tasks/deferred.go index b4d483fe..37f67a25 100644 --- a/splitio/proxy/tasks/deferred.go +++ b/splitio/proxy/tasks/deferred.go @@ -4,7 +4,7 @@ import ( "errors" "sync" - "github.com/splitio/go-split-commons/v8/tasks" + "github.com/splitio/go-split-commons/v9/tasks" "github.com/splitio/go-toolkit/v5/asynctask" "github.com/splitio/go-toolkit/v5/logging" gtSync "github.com/splitio/go-toolkit/v5/sync" diff --git a/splitio/proxy/tasks/events.go b/splitio/proxy/tasks/events.go index 17e2ecb3..94709a43 100644 --- a/splitio/proxy/tasks/events.go +++ b/splitio/proxy/tasks/events.go @@ -5,7 +5,7 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/internal" - "github.com/splitio/go-split-commons/v8/service/api" + "github.com/splitio/go-split-commons/v9/service/api" "github.com/splitio/go-toolkit/v5/common" "github.com/splitio/go-toolkit/v5/logging" "github.com/splitio/go-toolkit/v5/workerpool" diff --git a/splitio/proxy/tasks/impcount.go b/splitio/proxy/tasks/impcount.go index cc063a45..4b25d7e5 100644 --- a/splitio/proxy/tasks/impcount.go +++ b/splitio/proxy/tasks/impcount.go @@ -5,7 +5,7 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/internal" - "github.com/splitio/go-split-commons/v8/service/api" + "github.com/splitio/go-split-commons/v9/service/api" "github.com/splitio/go-toolkit/v5/common" "github.com/splitio/go-toolkit/v5/logging" "github.com/splitio/go-toolkit/v5/workerpool" diff --git a/splitio/proxy/tasks/impressions.go b/splitio/proxy/tasks/impressions.go index 3d0f00c6..fa79c69d 100644 --- a/splitio/proxy/tasks/impressions.go +++ b/splitio/proxy/tasks/impressions.go @@ -5,7 +5,7 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/internal" - "github.com/splitio/go-split-commons/v8/service/api" + "github.com/splitio/go-split-commons/v9/service/api" "github.com/splitio/go-toolkit/v5/common" "github.com/splitio/go-toolkit/v5/logging" "github.com/splitio/go-toolkit/v5/workerpool" diff --git a/splitio/proxy/tasks/mocks/deferred.go b/splitio/proxy/tasks/mocks/deferred.go index 002395b2..afb6da00 100644 --- a/splitio/proxy/tasks/mocks/deferred.go +++ b/splitio/proxy/tasks/mocks/deferred.go @@ -1,5 +1,7 @@ package mocks +import "github.com/stretchr/testify/mock" + type MockDeferredRecordingTask struct { StageCall func(rawData interface{}) error StartCall func() @@ -22,3 +24,26 @@ func (t *MockDeferredRecordingTask) Stop(blocking bool) error { func (t *MockDeferredRecordingTask) IsRunning() bool { return t.IsRunningCall() } + +type DeferredRecordingTaskMock struct { + mock.Mock +} + +func (t *DeferredRecordingTaskMock) Stage(rawData interface{}) error { + args := t.Called(rawData) + return args.Error(1) +} + +func (t *DeferredRecordingTaskMock) Start() { + t.Called() +} + +func (t *DeferredRecordingTaskMock) Stop(blocking bool) error { + args := t.Called(blocking) + return args.Error(1) +} + +func (t *DeferredRecordingTaskMock) IsRunning() bool { + args := t.Called() + return args.Get(0).(bool) +} diff --git a/splitio/proxy/tasks/telemetry.go b/splitio/proxy/tasks/telemetry.go index 233a47e5..f3ea36a7 100644 --- a/splitio/proxy/tasks/telemetry.go +++ b/splitio/proxy/tasks/telemetry.go @@ -5,7 +5,7 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio/proxy/internal" - "github.com/splitio/go-split-commons/v8/service/api" + "github.com/splitio/go-split-commons/v9/service/api" "github.com/splitio/go-toolkit/v5/common" "github.com/splitio/go-toolkit/v5/logging" "github.com/splitio/go-toolkit/v5/workerpool" diff --git a/splitio/util/utils.go b/splitio/util/utils.go index 1719395c..be15a1e8 100644 --- a/splitio/util/utils.go +++ b/splitio/util/utils.go @@ -7,7 +7,7 @@ import ( "github.com/splitio/split-synchronizer/v5/splitio" - "github.com/splitio/go-split-commons/v8/dtos" + "github.com/splitio/go-split-commons/v9/dtos" "github.com/splitio/go-toolkit/v5/hasher" "github.com/splitio/go-toolkit/v5/nethelpers" ) diff --git a/splitio/version.go b/splitio/version.go index 9a436d33..3be6029a 100644 --- a/splitio/version.go +++ b/splitio/version.go @@ -2,4 +2,4 @@ package splitio // Version is the version of this Agent -const Version = "5.11.1" +const Version = "5.12.0"