Skip to content
This repository was archived by the owner on Dec 6, 2024. It is now read-only.

Commit 0cecc8d

Browse files
authored
Fix more AllFlagsState contract tests & much needed unit test refactoring (#213)
* Fix a couple more AllFlagsState contract tests (excluding experimentation test) * Refactor AllFlagsState tests to stop using internal interfaces, add comments.
1 parent 292f12d commit 0cecc8d

File tree

8 files changed

+331
-538
lines changed

8 files changed

+331
-538
lines changed

src/all_flags_state.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ LDi_newFlagState(const char* key) {
6161
state->debugEventsUntilDate = 0;
6262
state->trackEvents = LDBooleanFalse;
6363
state->version = 0;
64+
state->omitDetails = LDBooleanFalse;
6465

6566
return state;
6667
}
@@ -261,13 +262,15 @@ static LDBoolean buildFlagState(const struct LDAllFlagsState *const flags, struc
261262
}
262263

263264

264-
if (!LDObjectSetNumber(flagObj, "version", flag->version)) {
265-
LD_LOG(LD_LOG_ERROR, "set key");
265+
if (!flag->omitDetails) {
266+
if (!LDObjectSetNumber(flagObj, "version", flag->version)) {
267+
LD_LOG(LD_LOG_ERROR, "set key");
266268

267-
return LDBooleanFalse;
269+
return LDBooleanFalse;
270+
}
268271
}
269272

270-
if (flag->details.reason != LD_UNKNOWN) {
273+
if (flag->details.reason != LD_UNKNOWN && !flag->omitDetails) {
271274
struct LDJSON* reason = NULL;
272275

273276
if (!(reason = LDReasonToJSON(&flag->details))) {
@@ -370,22 +373,19 @@ LDi_freeAllFlagsBuilder(struct LDAllFlagsBuilder *const builder) {
370373
LDBoolean
371374
LDi_allFlagsBuilderAdd(struct LDAllFlagsBuilder *const b, struct LDFlagState *const flag)
372375
{
373-
LDBoolean wantReason;
374376

375377
LD_ASSERT(b);
376378

377-
wantReason = b->includeReasons;
378-
379-
if (wantReason && b->detailsOnlyForTrackedFlags) {
379+
if (b->detailsOnlyForTrackedFlags) {
380380
double now;
381381

382382
LDi_getMonotonicMilliseconds(&now);
383383
if (!flag->trackEvents && !(flag->debugEventsUntilDate != 0 && flag->debugEventsUntilDate > now)) {
384-
wantReason = LDBooleanFalse;
384+
flag->omitDetails = LDBooleanTrue;
385385
}
386386
}
387387

388-
if (!wantReason) {
388+
if (!b->includeReasons) {
389389
if (flag->details.reason == LD_RULE_MATCH) {
390390
LDFree(flag->details.extra.rule.id);
391391
} else if (flag->details.reason == LD_PREREQUISITE_FAILED) {

src/all_flags_state.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ struct LDFlagState
3838
LDBoolean trackEvents;
3939

4040
double debugEventsUntilDate;
41+
42+
/* omitDetails is true if, based on the options passed to AllFlagsState and the flag state, some of the
43+
* metadata can be left out of the JSON representation. */
44+
LDBoolean omitDetails;
4145
};
4246

4347
/** @brief Returns a pointer to an `LDAllFlagsState` with specified validity.

src/evaluate.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ static LDBoolean addValue(
203203
*result = NULL;
204204
details->hasVariation = LDBooleanFalse;
205205
details->reason = LD_ERROR;
206+
details->extra.errorKind = LD_MALFORMED_FLAG;
206207

207208
return LDBooleanFalse;
208209
}

src/variations.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -827,17 +827,14 @@ LDAllFlagsState(struct LDClient *const client, const struct LDUser *const user,
827827

828828
LDJSONFree(eventsUnused);
829829

830-
if (flag->value) {
831-
LDi_flagModelPopulate(&model, flag);
830+
LDi_flagModelPopulate(&model, flag);
832831

833-
if (!LDi_allFlagsBuilderAdd(builder, flag)) {
834-
LDi_freeFlagState(flag);
835-
836-
goto cleanup;
837-
}
838-
} else {
832+
if (!LDi_allFlagsBuilderAdd(builder, flag)) {
839833
LDi_freeFlagState(flag);
834+
835+
goto cleanup;
840836
}
837+
841838
}
842839

843840
success = LDBooleanTrue;

test-utils/include/test-utils/flags.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ setFallthrough(struct LDJSON *const flag, const unsigned int variation);
1515
void
1616
addVariation(struct LDJSON *const flag, struct LDJSON *const variation);
1717

18+
void
19+
addPrerequisite(struct LDJSON *const flag, struct LDJSON *const prereq, unsigned int expectedPrereqVariation);
20+
1821
void
1922
addVariations1(struct LDJSON *const flag);
2023

test-utils/src/flags.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,23 @@ addVariation(struct LDJSON *const flag, struct LDJSON *const variation)
4444
LD_ASSERT(LDArrayPush(variations, variation));
4545
}
4646

47+
void
48+
addPrerequisite(struct LDJSON *const flag, struct LDJSON *const prereq, unsigned int expectedVariation)
49+
{
50+
struct LDJSON *req;
51+
struct LDJSON *reqs;
52+
53+
if (!(reqs = LDObjectLookup(flag, "prerequisites"))) {
54+
reqs = LDNewArray();
55+
LDObjectSetKey(flag, "prerequisites", reqs);
56+
}
57+
58+
req = LDNewObject();
59+
LDObjectSetKey(req, "key", LDNewText(LDGetText(LDObjectLookup(prereq, "key"))));
60+
LDObjectSetKey(req, "variation", LDNewNumber(expectedVariation));
61+
LDArrayPush(reqs, req);
62+
}
63+
4764
void
4865
addVariations1(struct LDJSON *const flag)
4966
{

testharness-suppressions.txt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ evaluation/bucketing/bucket by non-key attribute/rollouts/invalid value type
33
evaluation/bucketing/bucket by non-key attribute/experiments/integer value
44
evaluation/bucketing/bucket by non-key attribute/experiments/invalid value type
55
evaluation/all flags state/experimentation
6-
evaluation/all flags state/error in flag/without reasons
7-
evaluation/all flags state/error in flag/with reasons
8-
evaluation/all flags state/details only for tracked flags
96
events/feature events/full feature event for tracked flag/without reason/non-anonymous user/valid flag/type: bool
107
events/feature events/full feature event for tracked flag/without reason/non-anonymous user/valid flag/type: int
118
events/feature events/full feature event for tracked flag/without reason/non-anonymous user/valid flag/type: double

0 commit comments

Comments
 (0)