From e5a2bc11f54b6d6dd7dfd45a697a9c511c4e1cba Mon Sep 17 00:00:00 2001 From: Christian Lutnik Date: Tue, 18 Mar 2025 12:12:54 +0100 Subject: [PATCH 1/4] add tests for metadata compatibility Signed-off-by: christian.lutnik --- flags/selector-flag-combined-metadata.json | 29 ++++++++++++ flags/selector-flag-metadata.json | 19 ++++++++ flags/selector-flag-set-metadata.json | 19 ++++++++ gherkin/metadata.feature | 52 ++++++++++++++++++++++ launchpad/configs/default.json | 12 +++++ launchpad/pkg/json.go | 8 +++- 6 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 flags/selector-flag-combined-metadata.json create mode 100644 flags/selector-flag-metadata.json create mode 100644 flags/selector-flag-set-metadata.json create mode 100644 gherkin/metadata.feature diff --git a/flags/selector-flag-combined-metadata.json b/flags/selector-flag-combined-metadata.json new file mode 100644 index 0000000..06ea972 --- /dev/null +++ b/flags/selector-flag-combined-metadata.json @@ -0,0 +1,29 @@ +{ + "flags": { + "metadata-flag": { + "state": "ENABLED", + "variants": { + "true": true, + "false": false + }, + "defaultVariant": "false", + "targeting": {}, + "metadata": { + "string": "a", + "integer": 1, + "float": 1.2, + "boolean": true + } + } + }, + "metadata": { + "string": "b", + "integer": 2, + "float": 2.2, + "boolean": false, + "flag-set-string": "c", + "flag-set-integer": 3, + "flag-set-float": 3.2, + "flag-set-boolean": false + } +} \ No newline at end of file diff --git a/flags/selector-flag-metadata.json b/flags/selector-flag-metadata.json new file mode 100644 index 0000000..60ce1a0 --- /dev/null +++ b/flags/selector-flag-metadata.json @@ -0,0 +1,19 @@ +{ + "flags": { + "metadata-flag": { + "state": "ENABLED", + "variants": { + "true": true, + "false": false + }, + "defaultVariant": "false", + "targeting": {}, + "metadata": { + "string": "a", + "integer": 1, + "float": 1.2, + "boolean": true + } + } + } +} \ No newline at end of file diff --git a/flags/selector-flag-set-metadata.json b/flags/selector-flag-set-metadata.json new file mode 100644 index 0000000..dd979e6 --- /dev/null +++ b/flags/selector-flag-set-metadata.json @@ -0,0 +1,19 @@ +{ + "flags": { + "metadata-flag": { + "state": "ENABLED", + "variants": { + "true": true, + "false": false + }, + "defaultVariant": "false", + "targeting": {} + } + }, + "metadata": { + "string": "a", + "integer": 1, + "float": 1.2, + "boolean": true + } +} \ No newline at end of file diff --git a/gherkin/metadata.feature b/gherkin/metadata.feature new file mode 100644 index 0000000..597ea08 --- /dev/null +++ b/gherkin/metadata.feature @@ -0,0 +1,52 @@ +@in-process @metadata @file +Feature: flag and flag set metadata + + # This test suite contains scenarios to test flagd providers. + # It's associated with the flags configured in flags. + # It should be used in conjunction with the suites supplied by the OpenFeature specification. + + Scenario: Returns metadata + Given an option "selector" of type "String" with value "rawflags/selector-flag-metadata.json" + And a stable flagd provider + And a Boolean-flag with key "metadata-flag" and a default value "true" + When the flag was evaluated with details + Then the resolved metadata should contain + | key | metadata_type | value | + | string | String | a | + | integer | Integer | 1 | + | float | Float | 1.2 | + | boolean | Boolean | true | + + Scenario: Returns flag set metadata + Given an option "selector" of type "String" with value "rawflags/selector-flag-set-metadata.json" + And a stable flagd provider + And a Boolean-flag with key "metadata-flag" and a default value "true" + When the flag was evaluated with details + Then the resolved metadata should contain + | key | metadata_type | value | + | string | String | a | + | integer | Integer | 1 | + | float | Float | 1.2 | + | boolean | Boolean | true | + + Scenario: Flag metadata overwrites flag set metadata + Given an option "selector" of type "String" with value "rawflags/selector-flag-combined-metadata.json" + And a stable flagd provider + And a Boolean-flag with key "metadata-flag" and a default value "true" + When the flag was evaluated with details + Then the resolved metadata should contain + | key | metadata_type | value | + | string | String | a | + | integer | Integer | 1 | + | float | Float | 1.2 | + | boolean | Boolean | true | + | flag-set-string | String | c | + | flag-set-integer | Integer | 3 | + | flag-set-float | Float | 3.2 | + | flag-set-boolean | Boolean | false | + + Scenario: Returns no metadata + Given a Boolean-flag with key "boolean-flag" and a default value "true" + And a stable flagd provider + When the flag was evaluated with details + Then the resolved metadata is empty diff --git a/launchpad/configs/default.json b/launchpad/configs/default.json index 484d2be..f0fbb32 100644 --- a/launchpad/configs/default.json +++ b/launchpad/configs/default.json @@ -7,6 +7,18 @@ { "uri": "rawflags/selector-flags.json", "provider": "file" + }, + { + "uri": "rawflags/selector-flag-metadata.json", + "provider": "file" + }, + { + "uri": "rawflags/selector-flag-set-metadata.json", + "provider": "file" + }, + { + "uri": "rawflags/selector-flag-combined-metadata.json", + "provider": "file" } ], "context-value": { diff --git a/launchpad/pkg/json.go b/launchpad/pkg/json.go index 440dd07..d5c4642 100644 --- a/launchpad/pkg/json.go +++ b/launchpad/pkg/json.go @@ -6,12 +6,13 @@ import ( "io/ioutil" "os" "path/filepath" + "strings" "sync" ) var ( mu sync.Mutex - InputDir = "./rawflags" + InputDir = "./rawflags" //"Z:\\Workspaces\\chrfwow\\python-sdk-contrib\\providers\\openfeature-provider-flagd\\openfeature\\test-harness\\flags" // outputDir = "./flags" OutputFile = filepath.Join(outputDir, "allFlags.json") ) @@ -28,7 +29,7 @@ func CombineJSONFiles(inputDir string) error { combinedData := make(map[string]interface{}) for _, file := range files { - if filepath.Ext(file.Name()) == ".json" { + if filepath.Ext(file.Name()) == ".json" && !strings.HasPrefix(file.Name(), "selector-") { filePath := filepath.Join(inputDir, file.Name()) content, err := ioutil.ReadFile(filePath) if err != nil { @@ -58,6 +59,9 @@ func CombineJSONFiles(inputDir string) error { func deepMerge(dst, src map[string]interface{}) map[string]interface{} { for key, srcValue := range src { + if key == "basic-flag" { + print("aaaa") + } if dstValue, exists := dst[key]; exists { if srcMap, ok := srcValue.(map[string]interface{}); ok { if dstMap, ok := dstValue.(map[string]interface{}); ok { From bd53a21127cdf3995395475c60364b1c5e871431 Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Tue, 18 Mar 2025 13:35:01 +0100 Subject: [PATCH 2/4] add tests for metadata compatibility Signed-off-by: christian.lutnik --- launchpad/pkg/json.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/launchpad/pkg/json.go b/launchpad/pkg/json.go index d5c4642..79e2854 100644 --- a/launchpad/pkg/json.go +++ b/launchpad/pkg/json.go @@ -12,7 +12,7 @@ import ( var ( mu sync.Mutex - InputDir = "./rawflags" //"Z:\\Workspaces\\chrfwow\\python-sdk-contrib\\providers\\openfeature-provider-flagd\\openfeature\\test-harness\\flags" // + InputDir = "./rawflags" outputDir = "./flags" OutputFile = filepath.Join(outputDir, "allFlags.json") ) @@ -59,9 +59,6 @@ func CombineJSONFiles(inputDir string) error { func deepMerge(dst, src map[string]interface{}) map[string]interface{} { for key, srcValue := range src { - if key == "basic-flag" { - print("aaaa") - } if dstValue, exists := dst[key]; exists { if srcMap, ok := srcValue.(map[string]interface{}); ok { if dstMap, ok := dstValue.(map[string]interface{}); ok { From bef1067db094beb1a57bb18a9163616db898473f Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Tue, 18 Mar 2025 13:36:22 +0100 Subject: [PATCH 3/4] add tests for metadata compatibility Signed-off-by: christian.lutnik --- flags/selector-flag-combined-metadata.json | 2 +- flags/selector-flag-metadata.json | 2 +- flags/selector-flag-set-metadata.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flags/selector-flag-combined-metadata.json b/flags/selector-flag-combined-metadata.json index 06ea972..cdefb50 100644 --- a/flags/selector-flag-combined-metadata.json +++ b/flags/selector-flag-combined-metadata.json @@ -26,4 +26,4 @@ "flag-set-float": 3.2, "flag-set-boolean": false } -} \ No newline at end of file +} diff --git a/flags/selector-flag-metadata.json b/flags/selector-flag-metadata.json index 60ce1a0..3fccde3 100644 --- a/flags/selector-flag-metadata.json +++ b/flags/selector-flag-metadata.json @@ -16,4 +16,4 @@ } } } -} \ No newline at end of file +} diff --git a/flags/selector-flag-set-metadata.json b/flags/selector-flag-set-metadata.json index dd979e6..e048dd2 100644 --- a/flags/selector-flag-set-metadata.json +++ b/flags/selector-flag-set-metadata.json @@ -16,4 +16,4 @@ "float": 1.2, "boolean": true } -} \ No newline at end of file +} From a8872baf95a5e194de5ffb99adf167398dc164c7 Mon Sep 17 00:00:00 2001 From: "christian.lutnik" Date: Tue, 18 Mar 2025 13:36:45 +0100 Subject: [PATCH 4/4] add tests for metadata compatibility Signed-off-by: christian.lutnik --- launchpad/configs/ssl.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/launchpad/configs/ssl.json b/launchpad/configs/ssl.json index 550c2a7..5e306dd 100644 --- a/launchpad/configs/ssl.json +++ b/launchpad/configs/ssl.json @@ -9,6 +9,18 @@ { "uri": "rawflags/selector-flags.json", "provider": "file" + }, + { + "uri": "rawflags/selector-flag-metadata.json", + "provider": "file" + }, + { + "uri": "rawflags/selector-flag-set-metadata.json", + "provider": "file" + }, + { + "uri": "rawflags/selector-flag-combined-metadata.json", + "provider": "file" } ], "context-value": {