diff --git a/.github/workflows/maven-release.yml b/.github/workflows/maven-release.yml index 16055c27..60a4b72f 100644 --- a/.github/workflows/maven-release.yml +++ b/.github/workflows/maven-release.yml @@ -40,10 +40,11 @@ jobs: publish: permissions: contents: write - uses: adobe/aepsdk-commons/.github/workflows/android-maven-release.yml@gha-android-3.3.0 + uses: adobe/aepsdk-commons/.github/workflows/android-maven-release.yml@gha-android-3.4.2 with: tag: ${{ github.event.inputs.tag }} create-github-release: ${{ github.event.inputs.create-github-release == 'true' }} version-validation-paths: code/gradle.properties, code/optimize/src/main/java/com/adobe/marketing/mobile/optimize/OptimizeConstants.java version-validation-dependencies: Core ${{ github.event.inputs.core-dependency }}, Edge ${{ github.event.inputs.edge-dependency }} + staging-dir: code/optimize/build/staging-deploy secrets: inherit \ No newline at end of file diff --git a/.github/workflows/maven-snapshot.yml b/.github/workflows/maven-snapshot.yml index 5e29380b..0380d85f 100644 --- a/.github/workflows/maven-snapshot.yml +++ b/.github/workflows/maven-snapshot.yml @@ -14,10 +14,18 @@ name: Publish Snapshot on: workflow_dispatch: + inputs: + ref: + description: "Git reference (branch, tag, or SHA) to check out when publishing the snapshot. Defaults to 'main'." + required: false + default: "staging" jobs: publish: permissions: contents: write - uses: adobe/aepsdk-commons/.github/workflows/android-maven-snapshot.yml@gha-android-3.3.0 - secrets: inherit \ No newline at end of file + uses: adobe/aepsdk-commons/.github/workflows/android-maven-snapshot.yml@gha-android-3.4.2 + secrets: inherit + with: + ref: ${{ inputs.ref }} + staging-dir: code/optimize/build/staging-deploy \ No newline at end of file diff --git a/Makefile b/Makefile index ddb5f0d5..58976fd4 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,7 @@ ci-publish-maven-local-jitpack: assemble-phone-release (./code/gradlew -p code/$(EXTENSION-LIBRARY-FOLDER-NAME) publishReleasePublicationToMavenLocal -Pjitpack -x signReleasePublication) ci-publish-staging: assemble-phone-release - (./code/gradlew -p code/$(EXTENSION-LIBRARY-FOLDER-NAME) publishReleasePublicationToSonatypeRepository) + (./code/gradlew -p code/$(EXTENSION-LIBRARY-FOLDER-NAME) publish --stacktrace) ci-publish: assemble-phone-release - (./code/gradlew -p code/$(EXTENSION-LIBRARY-FOLDER-NAME) publishReleasePublicationToSonatypeRepository -Prelease) + (./code/gradlew -p code/$(EXTENSION-LIBRARY-FOLDER-NAME) publish -Prelease) diff --git a/code/build.gradle.kts b/code/build.gradle.kts index 0a4b7a14..b4a4d942 100644 --- a/code/build.gradle.kts +++ b/code/build.gradle.kts @@ -19,6 +19,6 @@ buildscript { mavenLocal() } dependencies { - classpath("com.github.adobe:aepsdk-commons:gp-3.0.2") + classpath("com.github.adobe:aepsdk-commons:gp-3.4.1") } } \ No newline at end of file diff --git a/code/gradle.properties b/code/gradle.properties index 202031c1..dd2f3f42 100644 --- a/code/gradle.properties +++ b/code/gradle.properties @@ -16,7 +16,7 @@ org.gradle.caching=true android.useAndroidX=true moduleName=optimize -moduleVersion=3.6.0 +moduleVersion=3.6.1 #Maven artifact mavenRepoName=AdobeMobileOptimizeSdk @@ -24,6 +24,6 @@ mavenRepoDescription=Adobe Experience Platform Optimize extension for the Adobe mavenUploadDryRunFlag=false # production versions for production build -mavenCoreVersion=3.3.0 -mavenEdgeVersion=3.0.1 +mavenCoreVersion=3.5.0 +mavenEdgeVersion=3.0.2 functionalTestEdgeVersion=3.0.1 diff --git a/code/optimize/build.gradle.kts b/code/optimize/build.gradle.kts index 11a49a54..60889a59 100644 --- a/code/optimize/build.gradle.kts +++ b/code/optimize/build.gradle.kts @@ -23,6 +23,7 @@ aepLibrary { enableDokkaDoc = true enableSpotless = true enableCheckStyle = true + enablePlayConsoleVerification = false publishing { gitRepoName = "aepsdk-optimize-android" diff --git a/code/optimize/src/androidTest/java/com/adobe/marketing/mobile/optimize/OptimizeTestConstants.java b/code/optimize/src/androidTest/java/com/adobe/marketing/mobile/optimize/OptimizeTestConstants.java index dcc597c2..1a5d9176 100644 --- a/code/optimize/src/androidTest/java/com/adobe/marketing/mobile/optimize/OptimizeTestConstants.java +++ b/code/optimize/src/androidTest/java/com/adobe/marketing/mobile/optimize/OptimizeTestConstants.java @@ -13,7 +13,7 @@ public class OptimizeTestConstants { - static final String EXTENSION_VERSION = "3.6.0"; + static final String EXTENSION_VERSION = "3.6.1"; public static final String LOG_TAG = "OptimizeTest"; static final String CONFIG_DATA_STORE = "AdobeMobile_ConfigState"; diff --git a/code/optimize/src/main/java/com/adobe/marketing/mobile/optimize/Optimize.java b/code/optimize/src/main/java/com/adobe/marketing/mobile/optimize/Optimize.java index 1474998e..0f661c61 100644 --- a/code/optimize/src/main/java/com/adobe/marketing/mobile/optimize/Optimize.java +++ b/code/optimize/src/main/java/com/adobe/marketing/mobile/optimize/Optimize.java @@ -234,15 +234,6 @@ public void call(final Event event) { AEPOptimizeError.Companion.getUnexpectedError(); failWithOptimizeError(callback, aepOptimizeError); } - return; - } - - if (!eventData.containsKey( - OptimizeConstants.EventDataKeys.PROPOSITIONS)) { - AEPOptimizeError aepOptimizeError = - AEPOptimizeError.Companion.getUnexpectedError(); - failWithOptimizeError(callback, aepOptimizeError); - return; } final List> propositionsList; diff --git a/code/optimize/src/main/java/com/adobe/marketing/mobile/optimize/OptimizeConstants.java b/code/optimize/src/main/java/com/adobe/marketing/mobile/optimize/OptimizeConstants.java index a673959d..027faef6 100644 --- a/code/optimize/src/main/java/com/adobe/marketing/mobile/optimize/OptimizeConstants.java +++ b/code/optimize/src/main/java/com/adobe/marketing/mobile/optimize/OptimizeConstants.java @@ -13,7 +13,7 @@ class OptimizeConstants { static final String LOG_TAG = "Optimize"; - static final String EXTENSION_VERSION = "3.6.0"; + static final String EXTENSION_VERSION = "3.6.1"; static final String EXTENSION_NAME = "com.adobe.optimize"; static final String FRIENDLY_NAME = "Optimize"; static final double GET_RESPONSE_CALLBACK_TIMEOUT = 10; diff --git a/code/optimize/src/test/java/com/adobe/marketing/mobile/optimize/OptimizeTests.java b/code/optimize/src/test/java/com/adobe/marketing/mobile/optimize/OptimizeTests.java index 11b8798d..c045f2b7 100644 --- a/code/optimize/src/test/java/com/adobe/marketing/mobile/optimize/OptimizeTests.java +++ b/code/optimize/src/test/java/com/adobe/marketing/mobile/optimize/OptimizeTests.java @@ -41,11 +41,13 @@ public class OptimizeTests { private Map responseMap; private AdobeError responseError; + private AEPOptimizeError optimizeError; @After public void teardown() { responseMap = null; responseError = null; + optimizeError = null; } @Test @@ -222,6 +224,111 @@ public void call(Map propositionsMap) { } } + @Test + public void testUpdatePropositionsWithCallback_SuccessWithError() throws Exception { + try (MockedStatic mobileCoreMockedStatic = + Mockito.mockStatic(MobileCore.class); + MockedStatic base64MockedStatic = Mockito.mockStatic(Base64.class)) { + // setup + base64MockedStatic + .when( + () -> + Base64.decode( + ArgumentMatchers.anyString(), + ArgumentMatchers.anyInt())) + .thenAnswer( + (Answer) + invocation -> + java.util.Base64.getDecoder() + .decode((String) invocation.getArguments()[0])); + + // test + final List scopes = new ArrayList<>(); + scopes.add( + new DecisionScope( + "eyJhY3Rpdml0eUlkIjoieGNvcmU6b2ZmZXItYWN0aXZpdHk6MTExMTExMTExMTExMTExMSIsInBsYWNlbWVudElkIjoieGNvcmU6b2ZmZXItcGxhY2VtZW50OjExMTExMTExMTExMTExMTEifQ==")); + + Optimize.updatePropositions( + scopes, + null, + null, + new AdobeCallbackWithOptimizeError>() { + @Override + public void fail(AEPOptimizeError adobeError) { + optimizeError = adobeError; + } + + @Override + public void call(Map propositionsMap) { + responseMap = propositionsMap; + } + }); + + final ArgumentCaptor eventCaptor = ArgumentCaptor.forClass(Event.class); + final ArgumentCaptor> callbackCaptor = + ArgumentCaptor.forClass(AdobeCallbackWithError.class); + + mobileCoreMockedStatic.verify( + () -> + MobileCore.dispatchEventWithResponseCallback( + eventCaptor.capture(), + ArgumentMatchers.anyLong(), + callbackCaptor.capture())); + + final Event event = eventCaptor.getValue(); + final AdobeCallbackWithError callbackWithError = callbackCaptor.getValue(); + + Assert.assertNotNull(event); + Assert.assertEquals("com.adobe.eventType.optimize", event.getType()); + Assert.assertEquals("com.adobe.eventSource.requestContent", event.getSource()); + + final Map eventData = event.getEventData(); + Assert.assertEquals("updatepropositions", eventData.get("requesttype")); + + final List> scopesList = + (List>) eventData.get("decisionscopes"); + Assert.assertEquals(1, scopesList.size()); + + final Map scopeData = scopesList.get(0); + Assert.assertNotNull(scopeData); + Assert.assertEquals(1, scopeData.size()); + Assert.assertEquals( + "eyJhY3Rpdml0eUlkIjoieGNvcmU6b2ZmZXItYWN0aXZpdHk6MTExMTExMTExMTExMTExMSIsInBsYWNlbWVudElkIjoieGNvcmU6b2ZmZXItcGxhY2VtZW50OjExMTExMTExMTExMTExMTEifQ==", + scopeData.get("name")); + + // verify callback response + final Map propositionData = + new ObjectMapper() + .readValue( + getClass() + .getClassLoader() + .getResource("json/PROPOSITION_VALID_ODE.json"), + HashMap.class); + final OptimizeProposition optimizeProposition = + OptimizeProposition.fromEventData(propositionData); + Assert.assertNotNull(optimizeProposition); + + final List> propositionsList = new ArrayList<>(); + propositionsList.add(optimizeProposition.toEventData()); + + final Map responseEventData = new HashMap<>(); + responseEventData.put("propositions", propositionsList); + responseEventData.put( + "responseerror", AEPOptimizeError.Companion.getUnexpectedError().toEventData()); + final Event responseEvent = + new Event.Builder( + "Optimize Response", + "com.adobe.eventType.optimize", + "com.adobe.eventSource.responseContent") + .setEventData(responseEventData) + .build(); + callbackWithError.call(responseEvent); + + Assert.assertNotNull(optimizeError); + Assert.assertNotNull(responseMap); + } + } + @Test public void testUpdatePropositions_validDecisionScopeWithXDMAndData() { try (MockedStatic mobileCoreMockedStatic = diff --git a/code/settings.gradle.kts b/code/settings.gradle.kts index 3a5d9e55..d19991d7 100755 --- a/code/settings.gradle.kts +++ b/code/settings.gradle.kts @@ -24,7 +24,7 @@ dependencyResolutionManagement { google() mavenCentral() mavenLocal() - maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots/") } + maven { url = uri("https://central.sonatype.com/repository/maven-snapshots/") } maven { url = uri("https://jitpack.io") } } } diff --git a/code/testapp/build.gradle.kts b/code/testapp/build.gradle.kts index 8bb410c5..f264f905 100644 --- a/code/testapp/build.gradle.kts +++ b/code/testapp/build.gradle.kts @@ -54,7 +54,7 @@ android { dependencies { implementation(project(":optimize")) - implementation(platform("com.adobe.marketing.mobile:sdk-bom:3.8.0")) + implementation(platform("com.adobe.marketing.mobile:sdk-bom:3.13.0")) implementation("com.adobe.marketing.mobile:edge") implementation("com.adobe.marketing.mobile:core") implementation("com.adobe.marketing.mobile:edgeidentity")