Skip to content

Commit e4fa588

Browse files
gh-worker-dd-mergequeue-cf854d[bot]satweenaleksandr-gringauzabrooksvleoromanovsky
authored
Merge pull request #3702 from DataDog/tvaleev/feature/timeseries-upd-develop
Merge `develop` into `feature/timeseries` Co-authored-by: satween <timur.valeev@datadoghq.com> Co-authored-by: aleksandr-gringauz <aleksandr.gringauz@datadoghq.com> Co-authored-by: abrooksv <abrooksv@users.noreply.github.com> Co-authored-by: leoromanovsky <leo.romanovsky@datadoghq.com> Co-authored-by: ambushwork <luyi1022@outlook.com>
2 parents 5d39d28 + 828648b commit e4fa588

15 files changed

Lines changed: 443 additions & 126 deletions

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
issuer: https://gitlab.ddbuild.io
2+
3+
subject_pattern: "project_path:DataDog/dd-sdk-android:ref_type:tag:ref:[0-9]+\\.[0-9]+\\.[0-9]+.*"
4+
5+
claim_pattern:
6+
ci_config_ref_uri: 'gitlab\.ddbuild\.io/DataDog/dd-sdk-android//\.gitlab-ci\.yml@refs/tags/.*'
7+
pipeline_source: "push"
8+
project_path: "DataDog/dd-sdk-android"
9+
ref_path: 'refs/tags/[0-9]+\.[0-9]+\.[0-9]+.*'
10+
11+
permissions:
12+
contents: write

.gitlab-ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
variables:
2-
CURRENT_CI_IMAGE: "26"
2+
CURRENT_CI_IMAGE: "28"
33
CI_IMAGE_DOCKER: registry.ddbuild.io/ci/dd-sdk-android:$CURRENT_CI_IMAGE
44
GIT_DEPTH: 5
55

ci/Dockerfile.gitlab

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ RUN set -x \
1818
curl \
1919
git \
2020
unzip \
21-
wget \
2221
openssh-client \
2322
expect \
2423
python3-distutils \
@@ -65,7 +64,7 @@ RUN mkdir /root/.android \
6564

6665
# Android SDK
6766
RUN \
68-
wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip && \
67+
curl -fsSLo android-sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip && \
6968
mkdir -p android-sdk-linux/cmdline-tools && \
7069
unzip -d android-sdk-linux/cmdline-tools android-sdk.zip && \
7170
mv android-sdk-linux/cmdline-tools/cmdline-tools android-sdk-linux/cmdline-tools/latest && \
@@ -76,12 +75,6 @@ RUN \
7675
echo y | android-sdk-linux/cmdline-tools/latest/bin/sdkmanager --install "cmake;${CMAKE_VERSION}" >/dev/null && \
7776
(yes || true) | android-sdk-linux/cmdline-tools/latest/bin/sdkmanager --licenses
7877

79-
RUN set -x \
80-
&& curl -OL https://s3.amazonaws.com/dd-package-public/dd-package.deb && dpkg -i dd-package.deb && rm dd-package.deb \
81-
&& apt-get update \
82-
&& apt-get -y clean \
83-
&& rm -rf /var/lib/apt/lists/*
84-
8578
ENV ANDROID_SDK_ROOT $PWD/android-sdk-linux
8679
ENV ANDROID_HOME $PWD/android-sdk-linux
8780
ENV GRADLE_HOME /usr/local/gradle-${GRADLE_VERSION}
@@ -90,23 +83,44 @@ ENV PATH $PATH:$GRADLE_HOME/bin
9083
ENV PATH $PATH:$ANDROID_HOME/platform-tools
9184
ENV PATH $PATH:$ANDROID_SDK_ROOT/build-tools/${ANDROID_BUILD_TOOLS}:$ANDROID_NDK
9285

93-
# Install Node
94-
ENV NODENV_VERSION 22.19.0
95-
ENV NODENV_ROOT /root/.nodenv
96-
ENV PATH "$NODENV_ROOT/shims:$NODENV_ROOT/bin:$PATH"
97-
RUN set -x \
98-
&& curl -fsSL https://github.com/nodenv/nodenv-installer/raw/master/bin/nodenv-installer | bash \
99-
&& nodenv install $NODENV_VERSION \
100-
&& nodenv rehash
101-
10286
# Install Datadog CI
103-
RUN npm install -g npm@9.6.5
104-
RUN npm install -g @datadog/datadog-ci
87+
ARG GITHUB_RELEASES_BASE=https://depot-read-api-github-releases.us1.ddbuild.io/internal/mirror/github-releases
88+
ENV DATADOG_CI_VERSION=5.21.2
89+
ENV DATADOG_CI_SHA256_amd64=b163d332679b677410e05389700874a7e73b8fcb4d29dbc94c904637a9665b79
90+
ENV DATADOG_CI_SHA256_arm64=526d92541ef6990211f9da96d828394db956a3b12bdadc68a687b114f21918f7
91+
RUN set -x \
92+
&& case "${TARGETARCH}" in \
93+
amd64) sha256="${DATADOG_CI_SHA256_amd64}"; arch=x64 ;; \
94+
arm64) sha256="${DATADOG_CI_SHA256_arm64}"; arch=arm64 ;; \
95+
esac \
96+
&& curl -fsSLo /usr/local/bin/datadog-ci \
97+
"${GITHUB_RELEASES_BASE}/DataDog/datadog-ci/releases/download/v${DATADOG_CI_VERSION}/datadog-ci_linux-${arch}" \
98+
&& echo "${sha256} /usr/local/bin/datadog-ci" | sha256sum -c \
99+
&& chmod +x /usr/local/bin/datadog-ci \
100+
&& datadog-ci version
105101

106102
# Install Datadog Java tracer
107103
ENV DD_TRACER_FOLDER $PWD/dd-java-agent
108104
RUN mkdir -p $DD_TRACER_FOLDER
109-
RUN wget -O $DD_TRACER_FOLDER/dd-java-agent.jar https://repo1.maven.org/maven2/com/datadoghq/dd-java-agent/$DD_TRACER_VERSION/dd-java-agent-$DD_TRACER_VERSION.jar
105+
RUN curl -fsSLo $DD_TRACER_FOLDER/dd-java-agent.jar https://repo1.maven.org/maven2/com/datadoghq/dd-java-agent/$DD_TRACER_VERSION/dd-java-agent-$DD_TRACER_VERSION.jar
106+
107+
# Install GitHub CLI
108+
ENV GH_CLI_VERSION=2.97.0
109+
ENV GH_CLI_SHA256_amd64=a2c9b8497e1f85b1ad0dfcb78b5a622e098801b8e461e459e88e1ee12f018112
110+
ENV GH_CLI_SHA256_arm64=73ea440ecad9c9e284429997ee6f93577bc6f7bc6fba357ef62c53ad8fb641a5
111+
RUN set -x \
112+
&& case "${TARGETARCH}" in \
113+
amd64) sha256="${GH_CLI_SHA256_amd64}"; arch=amd64 ;; \
114+
arm64) sha256="${GH_CLI_SHA256_arm64}"; arch=arm64 ;; \
115+
esac \
116+
&& curl -fsSLo gh.tar.gz \
117+
"${GITHUB_RELEASES_BASE}/cli/cli/releases/download/v${GH_CLI_VERSION}/gh_${GH_CLI_VERSION}_linux_${arch}.tar.gz" \
118+
&& echo "${sha256} gh.tar.gz" | sha256sum -c \
119+
&& mkdir gh-cli \
120+
&& tar -xzf gh.tar.gz -C gh-cli \
121+
&& mv "$(find gh-cli -type f -name gh)" /usr/local/bin/gh \
122+
&& rm -rf gh.tar.gz gh-cli \
123+
&& gh --version
110124

111125
COPY --from=registry.ddbuild.io/dd-octo-sts:v1.8.2 /usr/local/bin/dd-octo-sts /usr/local/bin/dd-octo-sts
112126
COPY --from=registry.ddbuild.io/commit-headless:v2.0.1 /commit-headless /usr/local/bin/commit-headless

ci/pipelines/default-pipeline.yml

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,6 @@ test:kover:
253253
script:
254254
- !reference [.snippets, source-secrets]
255255
- !reference [.snippets, setup-gradle]
256-
- pip3 install datadog
257256
- export DD_AGENT_HOST="$BUILDENV_HOST_IP"
258257
- export DD_API_KEY=$(get_secret $DD_ANDROID_SECRET__API_KEY)
259258
- export DD_APP_KEY=$(get_secret $DD_ANDROID_SECRET__APP_KEY)
@@ -265,8 +264,7 @@ test:kover:
265264
:koverReportFeatures
266265
:koverReportIntegrations
267266
- bash <(cat ./ci/scripts/codecov.sh) -t $CODECOV_TOKEN
268-
- npm install -g @datadog/datadog-ci
269-
- datadog-ci coverage upload --format=jacoco . || true
267+
- datadog-ci coverage upload . || true
270268
artifacts:
271269
when: always
272270
expire_in: 1 week
@@ -487,9 +485,7 @@ test-pyramid:publish-e2e-synthetics:
487485
- export E2E_MOBILE_APP_ID=$(get_secret $DD_ANDROID_SECRET__E2E_MOBILE_APP_ID)
488486
- !reference [ .snippets, setup-gradle ]
489487
- ./gradlew :sample:kotlin:packageUs1Release
490-
- npm update -g @datadog/datadog-ci
491-
- echo "Using datadog-ci $(npx @datadog/datadog-ci version)"
492-
- npx @datadog/datadog-ci synthetics upload-application --appKey "$E2E_DD_APP_KEY" --apiKey "$E2E_DD_API_KEY" --mobileApp "sample/kotlin/build/outputs/apk/us1/release/kotlin-us1-release.apk" --mobileApplicationId "$E2E_MOBILE_APP_ID" --versionName "$CI_COMMIT_SHORT_SHA" --latest
488+
- datadog-ci synthetics upload-application --appKey "$E2E_DD_APP_KEY" --apiKey "$E2E_DD_API_KEY" --mobileApp "sample/kotlin/build/outputs/apk/us1/release/kotlin-us1-release.apk" --mobileApplicationId "$E2E_MOBILE_APP_ID" --versionName "$CI_COMMIT_SHORT_SHA" --latest
493489
artifacts:
494490
when: always
495491
expire_in: 1 week
@@ -516,9 +512,7 @@ test-pyramid:publish-webview-synthetics:
516512
- export E2E_MOBILE_APP_ID=$(get_secret $DD_ANDROID_SECRET__WEBVIEW_MOBILE_APP_ID)
517513
- !reference [ .snippets, setup-gradle ]
518514
- ./gradlew :sample:kotlin:packageUs1Release
519-
- npm update -g @datadog/datadog-ci
520-
- echo "Using datadog-ci $(npx @datadog/datadog-ci version)"
521-
- npx @datadog/datadog-ci synthetics upload-application --appKey "$E2E_DD_APP_KEY" --apiKey "$E2E_DD_API_KEY" --mobileApp "sample/kotlin/build/outputs/apk/us1/release/kotlin-us1-release.apk" --mobileApplicationId "$E2E_MOBILE_APP_ID" --versionName "$CI_COMMIT_SHORT_SHA" --latest
515+
- datadog-ci synthetics upload-application --appKey "$E2E_DD_APP_KEY" --apiKey "$E2E_DD_API_KEY" --mobileApp "sample/kotlin/build/outputs/apk/us1/release/kotlin-us1-release.apk" --mobileApplicationId "$E2E_MOBILE_APP_ID" --versionName "$CI_COMMIT_SHORT_SHA" --latest
522516
artifacts:
523517
when: always
524518
expire_in: 1 week
@@ -545,9 +539,7 @@ test-pyramid:publish-staging-synthetics:
545539
- export E2E_MOBILE_APP_ID=$(get_secret $DD_ANDROID_SECRET__E2E_STAGING_APP_ID)
546540
- !reference [ .snippets, setup-gradle ]
547541
- ./gradlew :sample:kotlin:packageStagingRelease
548-
- npm update -g @datadog/datadog-ci
549-
- echo "Using datadog-ci $(npx @datadog/datadog-ci version)"
550-
- npx @datadog/datadog-ci synthetics upload-application --appKey "$E2E_DD_APP_KEY" --apiKey "$E2E_DD_API_KEY" --mobileApp "sample/kotlin/build/outputs/apk/staging/release/kotlin-staging-release.apk" --mobileApplicationId "$E2E_MOBILE_APP_ID" --versionName "$CI_COMMIT_SHORT_SHA" --latest --datadogSite "datad0g.com"
542+
- datadog-ci synthetics upload-application --appKey "$E2E_DD_APP_KEY" --apiKey "$E2E_DD_API_KEY" --mobileApp "sample/kotlin/build/outputs/apk/staging/release/kotlin-staging-release.apk" --mobileApplicationId "$E2E_MOBILE_APP_ID" --versionName "$CI_COMMIT_SHORT_SHA" --latest --datadogSite "datad0g.com"
551543
artifacts:
552544
when: always
553545
expire_in: 1 week
@@ -574,9 +566,7 @@ test-pyramid:publish-benchmark-synthetics:
574566
- export BM_MOBILE_APP_ID=$(get_secret $DD_ANDROID_SECRET__BENCHMARK_MOBILE_APP_ID)
575567
- !reference [ .snippets, setup-gradle ]
576568
- ./gradlew :sample:benchmark:packageRelease
577-
- npm update -g @datadog/datadog-ci
578-
- echo "Using datadog-ci $(npx @datadog/datadog-ci version)"
579-
- npx @datadog/datadog-ci synthetics upload-application --appKey "$BM_DD_APP_KEY" --apiKey "$BM_DD_API_KEY" --mobileApp "sample/benchmark/build/outputs/apk/release/benchmark-release.apk" --mobileApplicationId "$BM_MOBILE_APP_ID" --versionName "$CI_COMMIT_SHORT_SHA" --latest
569+
- datadog-ci synthetics upload-application --appKey "$BM_DD_APP_KEY" --apiKey "$BM_DD_API_KEY" --mobileApp "sample/benchmark/build/outputs/apk/release/benchmark-release.apk" --mobileApplicationId "$BM_MOBILE_APP_ID" --versionName "$CI_COMMIT_SHORT_SHA" --latest
580570
artifacts:
581571
when: always
582572
expire_in: 1 week
@@ -720,3 +710,34 @@ notify:merge-verification-metadata:
720710
paths:
721711
- verification-metadata.xml
722712

713+
notify:github-release:
714+
tags: [ "arch:amd64" ]
715+
interruptible: false
716+
only:
717+
- tags
718+
image: $CI_IMAGE_DOCKER
719+
id_tokens:
720+
DDOCTOSTS_ID_TOKEN:
721+
aud: dd-octo-sts
722+
stage: notify
723+
when: on_success
724+
needs:
725+
- notify:merge-verification-metadata
726+
script:
727+
- export GITHUB_TOKEN=$(dd-octo-sts token --scope DataDog/dd-sdk-android --policy self.gitlab.release.create-release)
728+
- >-
729+
if gh release view "$CI_COMMIT_TAG" --repo DataDog/dd-sdk-android >/dev/null 2>&1; then
730+
gh release upload "$CI_COMMIT_TAG" --repo DataDog/dd-sdk-android --clobber verification-metadata.xml;
731+
else
732+
# Extract out the tag's changelog entry
733+
start_line=$(grep -Fn "# ${CI_COMMIT_TAG} /" CHANGELOG.md | head -1 | cut -d: -f1 || true);
734+
if [ -n "$start_line" ]; then
735+
tail -n "+$((start_line + 1))" CHANGELOG.md | sed -n '/^# /q;p' > release-notes.md || true;
736+
else
737+
echo "No CHANGELOG.md entry found for tag $CI_COMMIT_TAG" >&2;
738+
echo "Fill this in" > release-notes.md;
739+
fi;
740+
741+
gh release create "$CI_COMMIT_TAG" --repo DataDog/dd-sdk-android --draft --verify-tag --title "$CI_COMMIT_TAG" --notes-file release-notes.md verification-metadata.xml;
742+
fi
743+

features/dd-sdk-android-flags-openfeature/src/test/kotlin/com/datadog/android/flags/openfeature/internal/adapters/ConvertersTest.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,30 @@ internal class ConvertersTest {
115115
assertThat(result.errorMessage).isNull()
116116
}
117117

118+
@Test
119+
fun `M convert SPLIT reason W toProviderEvaluation() {resolution with SPLIT reason}`(
120+
@StringForgery variant: String,
121+
forge: Forge
122+
) {
123+
// Given
124+
val value = forge.aBool()
125+
val resolution = ResolutionDetails(
126+
value = value,
127+
variant = variant,
128+
reason = ResolutionReason.SPLIT
129+
)
130+
131+
// When
132+
val result = resolution.toProviderEvaluation()
133+
134+
// Then
135+
assertThat(result.value).isEqualTo(value)
136+
assertThat(result.variant).isEqualTo(variant)
137+
assertThat(result.reason).isEqualTo("SPLIT")
138+
assertThat(result.errorCode).isNull()
139+
assertThat(result.errorMessage).isNull()
140+
}
141+
118142
@Test
119143
fun `M convert error resolution W toProviderEvaluation() {with error code}`(@StringForgery errorMessage: String) {
120144
// Given

features/dd-sdk-android-flags/api/apiSurface

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ enum com.datadog.android.flags.model.ResolutionReason
6161
- STATIC
6262
- DEFAULT
6363
- TARGETING_MATCH
64+
- SPLIT
6465
- RULE_MATCH
6566
- PREREQUISITE_FAILED
6667
- ERROR

features/dd-sdk-android-flags/api/dd-sdk-android-flags.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,7 @@ public final class com/datadog/android/flags/model/ResolutionReason : java/lang/
483483
public static final field ERROR Lcom/datadog/android/flags/model/ResolutionReason;
484484
public static final field PREREQUISITE_FAILED Lcom/datadog/android/flags/model/ResolutionReason;
485485
public static final field RULE_MATCH Lcom/datadog/android/flags/model/ResolutionReason;
486+
public static final field SPLIT Lcom/datadog/android/flags/model/ResolutionReason;
486487
public static final field STATIC Lcom/datadog/android/flags/model/ResolutionReason;
487488
public static final field TARGETING_MATCH Lcom/datadog/android/flags/model/ResolutionReason;
488489
public static fun valueOf (Ljava/lang/String;)Lcom/datadog/android/flags/model/ResolutionReason;

features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/ExposureEventsProcessor.kt

Lines changed: 19 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,52 +18,36 @@ internal class ExposureEventsProcessor(private val writer: RecordWriter, private
1818

1919
private data class CacheKey(
2020
val targetingKey: String,
21-
val flagKey: String,
21+
val flagKey: String
22+
)
23+
24+
private data class CacheValue(
2225
val allocationKey: String,
2326
val variationKey: String
2427
)
2528

2629
@Suppress("UnsafeThirdPartyFunctionCall") // maxSize > 0
27-
private val exposuresSentCache = object : LruCache<CacheKey, Boolean>(MAX_CACHE_SIZE_BYTES) {
28-
override fun sizeOf(key: CacheKey, value: Boolean): Int {
29-
// Calculate approximate memory footprint of the cache entry
30-
// String overhead: ~40 bytes + (2 bytes per character for UTF-16)
31-
// Object overhead for CacheKey: ~16 bytes
32-
// Boolean: ~1 byte
33-
val keySize = OBJECT_OVERHEAD +
34-
(STRING_OVERHEAD + key.targetingKey.length * CHAR_SIZE) +
35-
(STRING_OVERHEAD + key.flagKey.length * CHAR_SIZE) +
36-
(STRING_OVERHEAD + key.allocationKey.length * CHAR_SIZE) +
37-
(STRING_OVERHEAD + key.variationKey.length * CHAR_SIZE)
38-
val valueSize = BOOLEAN_SIZE
39-
return keySize + valueSize
40-
}
41-
}
30+
private val exposuresSentCache = LruCache<CacheKey, CacheValue>(MAX_CACHE_ENTRIES)
4231

4332
override fun processEvent(flagKey: String, context: EvaluationContext, data: UnparsedFlag) {
4433
val cacheKey = CacheKey(
4534
targetingKey = context.targetingKey,
46-
flagKey = flagKey,
35+
flagKey = flagKey
36+
)
37+
val cacheValue = CacheValue(
4738
allocationKey = data.allocationKey,
4839
variationKey = data.variationKey
4940
)
5041

51-
// Atomically check and mark to prevent duplicate writes
52-
// Only write to cache on first access to avoid refreshing LRU position
53-
val isFirstTime = synchronized(exposuresSentCache) {
54-
val alreadySent = exposuresSentCache[cacheKey]
55-
if (alreadySent == null) {
56-
exposuresSentCache.put(cacheKey, true)
57-
true
58-
} else {
59-
false
42+
synchronized(exposuresSentCache) {
43+
val lastSentValue = exposuresSentCache[cacheKey]
44+
if (lastSentValue != cacheValue) {
45+
val event = buildExposureEvent(flagKey, context, data)
46+
writeExposureEvent(event)
47+
@Suppress("UnsafeThirdPartyFunctionCall") // safe - non-null key and value
48+
exposuresSentCache.put(cacheKey, cacheValue)
6049
}
6150
}
62-
63-
if (isFirstTime) {
64-
val event = buildExposureEvent(flagKey, context, data)
65-
writeExposureEvent(event)
66-
}
6751
}
6852

6953
private fun buildExposureEvent(flagKey: String, context: EvaluationContext, data: UnparsedFlag): ExposureEvent {
@@ -87,13 +71,9 @@ internal class ExposureEventsProcessor(private val writer: RecordWriter, private
8771
}
8872

8973
companion object {
90-
// Maximum cache size in bytes (4MB)
91-
private const val MAX_CACHE_SIZE_BYTES = 4 * 1024 * 1024 // 4MB
92-
93-
// Memory overhead constants for size calculation
94-
private const val OBJECT_OVERHEAD = 16 // bytes for object header
95-
private const val STRING_OVERHEAD = 40 // bytes for String object overhead
96-
private const val CHAR_SIZE = 2 // bytes per character (UTF-16)
97-
private const val BOOLEAN_SIZE = 1 // byte
74+
// Supports the expected high-water mark of two subjects evaluating
75+
// 2,500 flags each. Normal flag keys are typically tens of characters,
76+
// so entry count is easier to reason about than object-size estimates.
77+
private const val MAX_CACHE_ENTRIES = 5_000
9878
}
9979
}

features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/model/ResolutionReason.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ enum class ResolutionReason {
3030
*/
3131
TARGETING_MATCH,
3232

33+
/**
34+
* A traffic split selected the resolved value.
35+
*/
36+
SPLIT,
37+
3338
/**
3439
* The resolved value matched a specific evaluation rule.
3540
*/

features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/DatadogFlagsClientTest.kt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,36 @@ internal class DatadogFlagsClientTest {
979979
assertThat(result.errorMessage).isNull()
980980
}
981981

982+
@Test
983+
fun `M return ResolutionDetails with SPLIT reason W resolve() { flag has SPLIT reason }`(forge: Forge) {
984+
// Given
985+
val fakeFlagKey = forge.anAlphabeticalString()
986+
val fakeDefaultValue = forge.aBool()
987+
val fakeFlagValue = !fakeDefaultValue
988+
val fakeVariationKey = forge.anAlphabeticalString()
989+
val fakeFlag = forge.getForgery<PrecomputedFlag>().copy(
990+
variationType = VariationType.BOOLEAN.value,
991+
variationValue = fakeFlagValue.toString(),
992+
variationKey = fakeVariationKey,
993+
reason = "SPLIT"
994+
)
995+
val fakeContext = EvaluationContext(
996+
targetingKey = forge.anAlphabeticalString(),
997+
attributes = emptyMap()
998+
)
999+
whenever(mockFlagsRepository.getPrecomputedFlagWithContext(fakeFlagKey)) doReturn (fakeFlag to fakeContext)
1000+
1001+
// When
1002+
val result = testedClient.resolve(fakeFlagKey, fakeDefaultValue)
1003+
1004+
// Then
1005+
assertThat(result.value).isEqualTo(fakeFlagValue)
1006+
assertThat(result.variant).isEqualTo(fakeVariationKey)
1007+
assertThat(result.reason).isEqualTo(ResolutionReason.SPLIT)
1008+
assertThat(result.errorCode).isNull()
1009+
assertThat(result.errorMessage).isNull()
1010+
}
1011+
9821012
@Test
9831013
fun `M return ResolutionDetails with error W resolve() { type mismatch }`(forge: Forge) {
9841014
// Given

0 commit comments

Comments
 (0)