diff --git a/.sdk_metadata.json b/.sdk_metadata.json index 0c7130f8..1a43c3ba 100644 --- a/.sdk_metadata.json +++ b/.sdk_metadata.json @@ -15,6 +15,7 @@ "bigSegments": { "introduced": "1.0" }, "contexts": { "introduced": "4.0" }, "experimentation": { "introduced": "2.9" }, + "fdv2": { "introduced": "5.13" }, "flagChanges": { "introduced": "1.0" }, "hooks": { "introduced": "5.8" }, "inlineContextCustomEvents": { "introduced": "5.7" }, diff --git a/Makefile b/Makefile index a3ef4777..ed9965b7 100644 --- a/Makefile +++ b/Makefile @@ -18,19 +18,11 @@ run-contract-tests: @echo "Running SDK contract test v2..." @curl $${GITHUB_TOKEN:+ -H "Authorization: Token $${GITHUB_TOKEN}"} \ -s https://raw.githubusercontent.com/launchdarkly/sdk-test-harness/v2/downloader/run.sh \ - | VERSION=v2 PARAMS="-url http://localhost:8001 -host 10.0.2.2 -debug -stop-service-at-end -skip-from $(SUPPRESSION_FILE) $(TEST_HARNESS_PARAMS_V2)" sh - -# Uncomment this, update v3 version, and replace existing run-contract-tests once sdk-test-harness releases a version that includes FDv2 client contract tests. -# -# run-contract-tests: -# @echo "Running SDK contract test v2..." -# @curl $${GITHUB_TOKEN:+ -H "Authorization: Token $${GITHUB_TOKEN}"} \ -# -s https://raw.githubusercontent.com/launchdarkly/sdk-test-harness/v2/downloader/run.sh \ -# | VERSION=v2 PARAMS="-url http://localhost:8001 -host 10.0.2.2 -debug -skip-from $(SUPPRESSION_FILE) $(TEST_HARNESS_PARAMS_V2)" sh -# @echo "Running SDK contract test v3..." -# @curl $${GITHUB_TOKEN:+ -H "Authorization: Token $${GITHUB_TOKEN}"} \ -# -s https://raw.githubusercontent.com/launchdarkly/sdk-test-harness/v3.0.0-alpha.4/downloader/run.sh \ -# | VERSION=v3.0.0-alpha.4 PARAMS="-url http://localhost:8001 -host 10.0.2.2 -debug -stop-service-at-end -skip-from $(SUPPRESSION_FILE_FDV2) $(TEST_HARNESS_PARAMS_V3)" sh + | VERSION=v2 PARAMS="-url http://localhost:8001 -host 10.0.2.2 -debug -skip-from $(SUPPRESSION_FILE) $(TEST_HARNESS_PARAMS_V2)" sh + @echo "Running SDK contract test v3..." + @curl $${GITHUB_TOKEN:+ -H "Authorization: Token $${GITHUB_TOKEN}"} \ + -s https://raw.githubusercontent.com/launchdarkly/sdk-test-harness/v3.1.0-alpha.6/downloader/run.sh \ + | VERSION=v3.1.0-alpha.6 PARAMS="-url http://localhost:8001 -host 10.0.2.2 -debug -stop-service-at-end -skip-from $(SUPPRESSION_FILE_FDV2) $(TEST_HARNESS_PARAMS_V3)" sh contract-tests: build-contract-tests start-emulator start-contract-test-service run-contract-tests diff --git a/contract-tests/src/main/java/com/launchdarkly/sdk/android/InternalDataSystemAccess.java b/contract-tests/src/main/java/com/launchdarkly/sdk/android/InternalDataSystemAccess.java deleted file mode 100644 index 792a0ea2..00000000 --- a/contract-tests/src/main/java/com/launchdarkly/sdk/android/InternalDataSystemAccess.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.launchdarkly.sdk.android; - -import com.launchdarkly.sdk.android.integrations.DataSystemBuilder; - -/** - * For LaunchDarkly internal use only. Do not use this class or its methods unless - * you are maintaining LaunchDarkly-produced code for this SDK (for example the contract-tests - * harness). - *

- * Forwards to the package-private data system entry points on {@link LDConfig.Builder} and - * {@link Components}. Application developers outside LaunchDarkly must not depend on this type; - * it is not part of the supported public Android SDK API and will be removed in a future release. - */ -public final class InternalDataSystemAccess { - - private InternalDataSystemAccess() { - } - - public static DataSystemBuilder newBuilder() { - return Components.dataSystem(); - } - - public static LDConfig.Builder applyToConfig( - LDConfig.Builder builder, - DataSystemBuilder dataSystem) { - return builder.dataSystem(dataSystem); - } -} diff --git a/contract-tests/src/main/java/com/launchdarkly/sdktest/SdkClientEntity.java b/contract-tests/src/main/java/com/launchdarkly/sdktest/SdkClientEntity.java index 36280fb9..f9627704 100644 --- a/contract-tests/src/main/java/com/launchdarkly/sdktest/SdkClientEntity.java +++ b/contract-tests/src/main/java/com/launchdarkly/sdktest/SdkClientEntity.java @@ -12,7 +12,6 @@ import com.launchdarkly.sdk.android.ConnectionMode; import com.launchdarkly.sdk.android.DataSystemComponents; import com.launchdarkly.sdk.android.LaunchDarklyException; -import com.launchdarkly.sdk.android.InternalDataSystemAccess; import com.launchdarkly.sdk.android.LDClient; import com.launchdarkly.sdk.android.LDConfig; @@ -394,13 +393,13 @@ private LDConfig buildSdkConfig(SdkConfigParams params, LDLogAdapter logAdapter, private void configureDataSystem(LDConfig.Builder builder, SdkConfigDataSystemParams dataSystem) { if (Boolean.TRUE.equals(dataSystem.useDefaultDataSystem)) { - InternalDataSystemAccess.applyToConfig(builder, InternalDataSystemAccess.newBuilder()); + builder.dataSystem(Components.dataSystem()); return; } SdkConfigConnectionModeConfig connModeConfig = dataSystem.connectionModeConfig; - DataSystemBuilder dsBuilder = InternalDataSystemAccess.newBuilder(); + DataSystemBuilder dsBuilder = Components.dataSystem(); // at the time of writing this, we did not have contract tests that could test platform state changes, // disabling automatic mode simplifies the behavior being tested @@ -425,7 +424,7 @@ private void configureDataSystem(LDConfig.Builder builder, SdkConfigDataSystemPa dsBuilder.customizeConnectionMode(ConnectionMode.STREAMING, buildConnectionModeBuilder(topLevel)); } - InternalDataSystemAccess.applyToConfig(builder, dsBuilder); + builder.dataSystem(dsBuilder); } private static boolean hasTopLevelDataSystemPipelines(SdkConfigDataSystemParams dataSystem) { diff --git a/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/Components.java b/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/Components.java index f1c2aadf..20d72483 100644 --- a/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/Components.java +++ b/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/Components.java @@ -304,7 +304,7 @@ public static PluginsConfigurationBuilder plugins() { * @see DataSystemComponents * @see LDConfig.Builder#dataSystem(DataSystemBuilder) */ - static DataSystemBuilder dataSystem() { + public static DataSystemBuilder dataSystem() { return new DataSystemBuilder(); } diff --git a/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/LDConfig.java b/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/LDConfig.java index d5f1af13..5b66347f 100644 --- a/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/LDConfig.java +++ b/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/LDConfig.java @@ -458,7 +458,7 @@ public Builder dataSource(ComponentConfigurer dataSourceConfigurer) * @see Components#dataSystem() * @see DataSystemBuilder */ - Builder dataSystem(DataSystemBuilder dataSystemBuilder) { + public Builder dataSystem(DataSystemBuilder dataSystemBuilder) { this.dataSystemBuilder = dataSystemBuilder; this.dataSource = null; return this; diff --git a/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/integrations/InitializerEntry.java b/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/integrations/InitializerEntry.java index 1c38cc00..385ecc61 100644 --- a/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/integrations/InitializerEntry.java +++ b/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/integrations/InitializerEntry.java @@ -7,4 +7,7 @@ * This type is part of the early-access data system API and is not stable. */ public abstract class InitializerEntry { + + InitializerEntry() { + } } diff --git a/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/integrations/SynchronizerEntry.java b/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/integrations/SynchronizerEntry.java index aa279264..6c856bb3 100644 --- a/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/integrations/SynchronizerEntry.java +++ b/launchdarkly-android-client-sdk/src/main/java/com/launchdarkly/sdk/android/integrations/SynchronizerEntry.java @@ -7,4 +7,7 @@ * This type is part of the early-access data system API and is not stable. */ public abstract class SynchronizerEntry { + + SynchronizerEntry() { + } } diff --git a/launchdarkly-android-client-sdk/src/test/java/com/launchdarkly/sdk/android/FDv2EntryConverterTest.java b/launchdarkly-android-client-sdk/src/test/java/com/launchdarkly/sdk/android/FDv2EntryConverterTest.java index bb1f6693..7065d6d7 100644 --- a/launchdarkly-android-client-sdk/src/test/java/com/launchdarkly/sdk/android/FDv2EntryConverterTest.java +++ b/launchdarkly-android-client-sdk/src/test/java/com/launchdarkly/sdk/android/FDv2EntryConverterTest.java @@ -65,18 +65,6 @@ public void cacheInitializer_buildWithPlainInputs_emptyChangeSet() throws Except assertEquals(ChangeSetType.None, result.getChangeSet().getType()); } - @Test - public void unsupportedInitializer_throwsIllegalArgumentException() { - InitializerEntry unsupported = new InitializerEntry() {}; - try { - FDv2EntryConverter.toInitializerBuilder(unsupported); - org.junit.Assert.fail("expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertTrue(e.getMessage().contains("Unsupported InitializerEntry")); - assertTrue(e.getMessage().contains(unsupported.getClass().getName())); - } - } - @Test public void pollingSynchronizer_converts() { DataSourceBuilder builder = FDv2EntryConverter.toSynchronizerBuilder( @@ -91,18 +79,6 @@ public void streamingSynchronizer_converts() { assertNotNull(builder); } - @Test - public void unsupportedSynchronizer_throwsIllegalArgumentException() { - SynchronizerEntry unsupported = new SynchronizerEntry() {}; - try { - FDv2EntryConverter.toSynchronizerBuilder(unsupported); - org.junit.Assert.fail("expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertTrue(e.getMessage().contains("Unsupported SynchronizerEntry")); - assertTrue(e.getMessage().contains(unsupported.getClass().getName())); - } - } - @Test public void toInitializerBuilders_preservesOrderAndKinds() { List entries = Arrays.asList(