From 79118788d409abe52cd4d54b9e9f5d76d9060172 Mon Sep 17 00:00:00 2001 From: Craig Pastro Date: Fri, 6 Oct 2023 14:25:46 -0700 Subject: [PATCH 1/2] feature: add timestamp to json evaluator Signed-off-by: Craig Pastro --- core/pkg/eval/json_evaluator.go | 7 ++++-- core/pkg/eval/json_evaluator_test.go | 32 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/core/pkg/eval/json_evaluator.go b/core/pkg/eval/json_evaluator.go index 153a4910f..cc0d992f7 100644 --- a/core/pkg/eval/json_evaluator.go +++ b/core/pkg/eval/json_evaluator.go @@ -9,6 +9,7 @@ import ( "regexp" "strconv" "strings" + "time" "github.com/diegoholiveira/jsonlogic/v3" "github.com/open-feature/flagd/core/pkg/logger" @@ -38,7 +39,8 @@ const ( var regBrace *regexp.Regexp type flagdProperties struct { - FlagKey string `json:"flagKey"` + FlagKey string `json:"flagKey"` + Timestamp time.Time `json:"timestamp"` } func init() { @@ -321,7 +323,8 @@ func (je *JSONEvaluator) evaluateVariant(reqID string, flagKey string, context m } context = je.setFlagdProperties(context, flagdProperties{ - FlagKey: flagKey, + FlagKey: flagKey, + Timestamp: time.Now(), }) b, err := json.Marshal(context) diff --git a/core/pkg/eval/json_evaluator_test.go b/core/pkg/eval/json_evaluator_test.go index 5783691af..6518cf399 100644 --- a/core/pkg/eval/json_evaluator_test.go +++ b/core/pkg/eval/json_evaluator_test.go @@ -1248,4 +1248,36 @@ func TestFlagdAmbientProperties(t *testing.T) { t.Fatalf("expected %s, got %s", model.TargetingMatchReason, reason) } }) + + t.Run("timestampIsInTheContext", func(t *testing.T) { + evaluator := eval.NewJSONEvaluator(logger.NewLogger(nil, false), store.NewFlags()) + + _, _, err := evaluator.SetState(sync.DataSync{FlagData: `{ + "flags": { + "welcome-banner": { + "state": "ENABLED", + "variants": { + "true": true, + "false": false + }, + "defaultVariant": "false", + "targeting": { + "if": [ { "var": ["$flagd.timestamp", false] }, true, false ] + } + } + } + }`}) + if err != nil { + t.Fatal(err) + } + + value, variant, reason, _, err := evaluator.ResolveBooleanValue(context.Background(), "default", "welcome-banner", nil) + if err != nil { + t.Fatal(err) + } + + if !value || variant != "true" || reason != model.TargetingMatchReason { + t.Fatal("timestamp was not in the context") + } + }) } From 96d4e47ce0c84dbf97800eaefd2cc34feff03116 Mon Sep 17 00:00:00 2001 From: Craig Pastro Date: Mon, 9 Oct 2023 19:21:59 -0700 Subject: [PATCH 2/2] Use unix timestamp Signed-off-by: Craig Pastro --- core/pkg/eval/json_evaluator.go | 6 +++--- core/pkg/eval/json_evaluator_test.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/pkg/eval/json_evaluator.go b/core/pkg/eval/json_evaluator.go index cc0d992f7..ac3bf60a7 100644 --- a/core/pkg/eval/json_evaluator.go +++ b/core/pkg/eval/json_evaluator.go @@ -39,8 +39,8 @@ const ( var regBrace *regexp.Regexp type flagdProperties struct { - FlagKey string `json:"flagKey"` - Timestamp time.Time `json:"timestamp"` + FlagKey string `json:"flagKey"` + Timestamp int64 `json:"timestamp"` } func init() { @@ -324,7 +324,7 @@ func (je *JSONEvaluator) evaluateVariant(reqID string, flagKey string, context m context = je.setFlagdProperties(context, flagdProperties{ FlagKey: flagKey, - Timestamp: time.Now(), + Timestamp: time.Now().Unix(), }) b, err := json.Marshal(context) diff --git a/core/pkg/eval/json_evaluator_test.go b/core/pkg/eval/json_evaluator_test.go index 6518cf399..0ea872ea4 100644 --- a/core/pkg/eval/json_evaluator_test.go +++ b/core/pkg/eval/json_evaluator_test.go @@ -1262,7 +1262,7 @@ func TestFlagdAmbientProperties(t *testing.T) { }, "defaultVariant": "false", "targeting": { - "if": [ { "var": ["$flagd.timestamp", false] }, true, false ] + "<": [ 1696904426, { "var": "$flagd.timestamp" } ] } } }