Skip to content

Commit 8e89d64

Browse files
prepare 2.3.0 release (#18)
1 parent 2af5c83 commit 8e89d64

File tree

2 files changed

+65
-5
lines changed

2 files changed

+65
-5
lines changed

ldreason/reason.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ type EvaluationReason struct {
6464
ruleIndex ldvalue.OptionalInt
6565
ruleID string
6666
prerequisiteKey string
67+
inExperiment bool
6768
errorKind EvalErrorKind
6869
}
6970

@@ -111,6 +112,13 @@ func (r EvaluationReason) GetPrerequisiteKey() string {
111112
return r.prerequisiteKey
112113
}
113114

115+
// IsInExperiment describes whether the evaluation was part of an experiment. It returns
116+
// true if the evaluation resulted in an experiment rollout *and* served one of the
117+
// variations in the experiment. Otherwise it returns false.
118+
func (r EvaluationReason) IsInExperiment() bool {
119+
return r.inExperiment
120+
}
121+
114122
// GetErrorKind describes the general category of the error, if the Kind is EvalReasonError.
115123
// Otherwise it returns an empty string.
116124
func (r EvaluationReason) GetErrorKind() EvalErrorKind {
@@ -127,6 +135,13 @@ func NewEvalReasonFallthrough() EvaluationReason {
127135
return EvaluationReason{kind: EvalReasonFallthrough}
128136
}
129137

138+
// NewEvalReasonFallthroughExperiment returns an EvaluationReason whose Kind is
139+
// EvalReasonFallthrough. The inExperiment parameter represents whether the evaluation was
140+
// part of an experiment.
141+
func NewEvalReasonFallthroughExperiment(inExperiment bool) EvaluationReason {
142+
return EvaluationReason{kind: EvalReasonFallthrough, inExperiment: inExperiment}
143+
}
144+
130145
// NewEvalReasonTargetMatch returns an EvaluationReason whose Kind is EvalReasonTargetMatch.
131146
func NewEvalReasonTargetMatch() EvaluationReason {
132147
return EvaluationReason{kind: EvalReasonTargetMatch}
@@ -138,6 +153,18 @@ func NewEvalReasonRuleMatch(ruleIndex int, ruleID string) EvaluationReason {
138153
ruleIndex: ldvalue.NewOptionalInt(ruleIndex), ruleID: ruleID}
139154
}
140155

156+
// NewEvalReasonRuleMatchExperiment returns an EvaluationReason whose Kind is
157+
// EvalReasonRuleMatch. The inExperiment parameter represents whether the evaluation was
158+
// part of an experiment.
159+
func NewEvalReasonRuleMatchExperiment(ruleIndex int, ruleID string, inExperiment bool) EvaluationReason {
160+
return EvaluationReason{
161+
kind: EvalReasonRuleMatch,
162+
ruleIndex: ldvalue.NewOptionalInt(ruleIndex),
163+
ruleID: ruleID,
164+
inExperiment: inExperiment,
165+
}
166+
}
167+
141168
// NewEvalReasonPrerequisiteFailed returns an EvaluationReason whose Kind is EvalReasonPrerequisiteFailed.
142169
func NewEvalReasonPrerequisiteFailed(prereqKey string) EvaluationReason {
143170
return EvaluationReason{kind: EvalReasonPrerequisiteFailed, prerequisiteKey: prereqKey}
@@ -176,6 +203,8 @@ func (r *EvaluationReason) ReadFromJSONReader(reader *jreader.Reader) {
176203
ret.errorKind = EvalErrorKind(reader.String())
177204
case "prerequisiteKey":
178205
ret.prerequisiteKey = reader.String()
206+
case "inExperiment":
207+
ret.inExperiment = reader.Bool()
179208
}
180209
}
181210
if reader.Error() == nil {
@@ -198,6 +227,7 @@ func (r EvaluationReason) WriteToJSONWriter(w *jwriter.Writer) {
198227
obj.Name("ruleIndex").Int(r.ruleIndex.OrElse(0))
199228
obj.Maybe("ruleId", r.ruleID != "").String(r.ruleID)
200229
}
230+
obj.Maybe("inExperiment", r.inExperiment).Bool(r.inExperiment)
201231
if r.kind == EvalReasonPrerequisiteFailed {
202232
obj.Name("prerequisiteKey").String(r.prerequisiteKey)
203233
}

ldreason/reason_test.go

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,21 @@ func TestReasonIsDefined(t *testing.T) {
1515
assert.False(t, EvaluationReason{}.IsDefined())
1616
assert.True(t, NewEvalReasonOff().IsDefined())
1717
assert.True(t, NewEvalReasonFallthrough().IsDefined())
18+
assert.True(t, NewEvalReasonFallthroughExperiment(true).IsDefined())
1819
assert.True(t, NewEvalReasonTargetMatch().IsDefined())
1920
assert.True(t, NewEvalReasonRuleMatch(0, "").IsDefined())
21+
assert.True(t, NewEvalReasonRuleMatchExperiment(0, "", true).IsDefined())
2022
assert.True(t, NewEvalReasonPrerequisiteFailed("").IsDefined())
2123
assert.True(t, NewEvalReasonError(EvalErrorFlagNotFound).IsDefined())
2224
}
2325

2426
func TestReasonKind(t *testing.T) {
2527
assert.Equal(t, EvalReasonOff, NewEvalReasonOff().GetKind())
2628
assert.Equal(t, EvalReasonFallthrough, NewEvalReasonFallthrough().GetKind())
29+
assert.Equal(t, EvalReasonFallthrough, NewEvalReasonFallthroughExperiment(true).GetKind())
2730
assert.Equal(t, EvalReasonTargetMatch, NewEvalReasonTargetMatch().GetKind())
2831
assert.Equal(t, EvalReasonRuleMatch, NewEvalReasonRuleMatch(0, "").GetKind())
32+
assert.Equal(t, EvalReasonRuleMatch, NewEvalReasonRuleMatchExperiment(0, "", true).GetKind())
2933
assert.Equal(t, EvalReasonPrerequisiteFailed, NewEvalReasonPrerequisiteFailed("").GetKind())
3034
assert.Equal(t, EvalReasonError, NewEvalReasonError(EvalErrorFlagNotFound).GetKind())
3135
}
@@ -35,8 +39,12 @@ func TestReasonRuleProperties(t *testing.T) {
3539
assert.Equal(t, 1, r.GetRuleIndex())
3640
assert.Equal(t, "id", r.GetRuleID())
3741

42+
r = NewEvalReasonRuleMatchExperiment(1, "id", true)
43+
assert.Equal(t, 1, r.GetRuleIndex())
44+
assert.Equal(t, "id", r.GetRuleID())
45+
3846
for _, r := range []EvaluationReason{
39-
NewEvalReasonOff(), NewEvalReasonFallthrough(), NewEvalReasonTargetMatch(),
47+
NewEvalReasonOff(), NewEvalReasonFallthrough(), NewEvalReasonFallthroughExperiment(true), NewEvalReasonTargetMatch(),
4048
NewEvalReasonPrerequisiteFailed(""), NewEvalReasonError(EvalErrorFlagNotFound),
4149
} {
4250
t.Run(string(r.GetKind()), func(t *testing.T) {
@@ -46,13 +54,31 @@ func TestReasonRuleProperties(t *testing.T) {
4654
}
4755
}
4856

57+
func TestReasonExperimentProperties(t *testing.T) {
58+
r := NewEvalReasonFallthroughExperiment(true)
59+
assert.Equal(t, true, r.IsInExperiment())
60+
61+
r = NewEvalReasonRuleMatchExperiment(1, "id", true)
62+
assert.Equal(t, true, r.IsInExperiment())
63+
64+
for _, r := range []EvaluationReason{
65+
NewEvalReasonOff(), NewEvalReasonFallthrough(), NewEvalReasonFallthroughExperiment(false), NewEvalReasonTargetMatch(),
66+
NewEvalReasonRuleMatch(1, "id"),
67+
NewEvalReasonRuleMatchExperiment(1, "id", false), NewEvalReasonPrerequisiteFailed(""), NewEvalReasonError(EvalErrorFlagNotFound),
68+
} {
69+
t.Run(string(r.GetKind()), func(t *testing.T) {
70+
assert.Equal(t, false, r.IsInExperiment())
71+
})
72+
}
73+
}
74+
4975
func TestReasonPrerequisiteFailedProperties(t *testing.T) {
5076
r := NewEvalReasonPrerequisiteFailed("key")
5177
assert.Equal(t, "key", r.GetPrerequisiteKey())
5278

5379
for _, r := range []EvaluationReason{
54-
NewEvalReasonOff(), NewEvalReasonFallthrough(), NewEvalReasonTargetMatch(),
55-
NewEvalReasonRuleMatch(0, "id"), NewEvalReasonError(EvalErrorFlagNotFound),
80+
NewEvalReasonOff(), NewEvalReasonFallthrough(), NewEvalReasonFallthroughExperiment(true), NewEvalReasonTargetMatch(),
81+
NewEvalReasonRuleMatch(0, "id"), NewEvalReasonRuleMatchExperiment(0, "id", true), NewEvalReasonError(EvalErrorFlagNotFound),
5682
} {
5783
t.Run(string(r.GetKind()), func(t *testing.T) {
5884
assert.Equal(t, "", r.GetPrerequisiteKey())
@@ -65,8 +91,8 @@ func TestReasonErrorProperties(t *testing.T) {
6591
assert.Equal(t, EvalErrorFlagNotFound, r.GetErrorKind())
6692

6793
for _, r := range []EvaluationReason{
68-
NewEvalReasonOff(), NewEvalReasonFallthrough(), NewEvalReasonTargetMatch(),
69-
NewEvalReasonRuleMatch(0, "id"), NewEvalReasonPrerequisiteFailed("key"),
94+
NewEvalReasonOff(), NewEvalReasonFallthrough(), NewEvalReasonFallthroughExperiment(true), NewEvalReasonTargetMatch(),
95+
NewEvalReasonRuleMatch(0, "id"), NewEvalReasonRuleMatchExperiment(0, "id", true), NewEvalReasonPrerequisiteFailed("key"),
7096
} {
7197
t.Run(string(r.GetKind()), func(t *testing.T) {
7298
assert.Equal(t, EvalErrorKind(""), r.GetErrorKind())
@@ -83,8 +109,12 @@ func TestReasonSerializationAndDeserialization(t *testing.T) {
83109
{EvaluationReason{}, "", "null"},
84110
{NewEvalReasonOff(), "OFF", `{"kind":"OFF"}`},
85111
{NewEvalReasonFallthrough(), "FALLTHROUGH", `{"kind":"FALLTHROUGH"}`},
112+
{NewEvalReasonFallthroughExperiment(true), "FALLTHROUGH", `{"kind":"FALLTHROUGH","inExperiment":true}`},
113+
{NewEvalReasonFallthroughExperiment(false), "FALLTHROUGH", `{"kind":"FALLTHROUGH"}`},
86114
{NewEvalReasonTargetMatch(), "TARGET_MATCH", `{"kind":"TARGET_MATCH"}`},
87115
{NewEvalReasonRuleMatch(1, "x"), "RULE_MATCH(1,x)", `{"kind":"RULE_MATCH","ruleIndex":1,"ruleId":"x"}`},
116+
{NewEvalReasonRuleMatchExperiment(1, "x", true), "RULE_MATCH(1,x)", `{"kind":"RULE_MATCH","ruleIndex":1,"ruleId":"x","inExperiment":true}`},
117+
{NewEvalReasonRuleMatchExperiment(1, "x", false), "RULE_MATCH(1,x)", `{"kind":"RULE_MATCH","ruleIndex":1,"ruleId":"x"}`},
88118
{NewEvalReasonPrerequisiteFailed("x"), "PREREQUISITE_FAILED(x)", `{"kind":"PREREQUISITE_FAILED","prerequisiteKey":"x"} `},
89119
{NewEvalReasonError(EvalErrorWrongType), "ERROR(WRONG_TYPE)", `{"kind":"ERROR","errorKind":"WRONG_TYPE"}`},
90120
}

0 commit comments

Comments
 (0)