diff --git a/.github/workflows/update_test_app.yml b/.github/workflows/update_test_app.yml new file mode 100644 index 0000000..10d3b26 --- /dev/null +++ b/.github/workflows/update_test_app.yml @@ -0,0 +1,26 @@ +name: Update Test App + +on: + release: + types: [published] +jobs: + updateTestApp: + runs-on: macos-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Build Test App + run: | + set -eo pipefail + echo Building Test App + make build-test-apps + - name: Create Pull Request + uses: peter-evans/create-pull-request@v5 + with: + commit-message: Update test app with new release ${{ github.event.release.tag_name }} + title: Update Test App + body: updates the test app with new release ${{ github.event.release.tag_name }} + branch: update-test-app + base: main + diff --git a/AEPAssurance.podspec b/AEPAssurance.podspec index 25fd671..a63c5ea 100644 --- a/AEPAssurance.podspec +++ b/AEPAssurance.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "AEPAssurance" - s.version = "3.1.1" + s.version = "3.1.2" s.summary = "AEPAssurance SDK for Adobe Experience Platform Mobile SDK. Written and maintained by Adobe." s.description = <<-DESC @@ -15,8 +15,8 @@ Pod::Spec.new do |s| s.swift_version = '5.1' s.pod_target_xcconfig = { 'BUILD_LIBRARY_FOR_DISTRIBUTION' => 'YES' } - s.dependency 'AEPCore', '>= 3.1.0' - s.dependency 'AEPServices', '>= 3.1.0' + s.dependency 'AEPCore', '>= 3.9.0' + s.dependency 'AEPServices', '>= 3.9.0' s.source_files = 'AEPAssurance/Source/**/*.swift' end diff --git a/AEPAssurance.xcodeproj/project.pbxproj b/AEPAssurance.xcodeproj/project.pbxproj index 7175608..c0fc980 100644 --- a/AEPAssurance.xcodeproj/project.pbxproj +++ b/AEPAssurance.xcodeproj/project.pbxproj @@ -1572,9 +1572,10 @@ buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = FKGEE875K4; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; @@ -1644,6 +1645,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = TestApp/TestApp.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_ASSET_PATHS = "\"TestApp/Preview Content\""; DEVELOPMENT_TEAM = FKGEE875K4; @@ -1655,6 +1657,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.adobe.assurance.testApp; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -1667,6 +1670,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = TestApp/TestApp.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_ASSET_PATHS = "\"TestApp/Preview Content\""; DEVELOPMENT_TEAM = FKGEE875K4; @@ -1678,6 +1682,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.adobe.assurance.testApp; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; diff --git a/AEPAssurance/Source/AssuranceConstants.swift b/AEPAssurance/Source/AssuranceConstants.swift index 6ab1c23..4928d0f 100644 --- a/AEPAssurance/Source/AssuranceConstants.swift +++ b/AEPAssurance/Source/AssuranceConstants.swift @@ -15,7 +15,7 @@ import Foundation enum AssuranceConstants { static let EXTENSION_NAME = "com.adobe.assurance" static let FRIENDLY_NAME = "Assurance" - static let EXTENSION_VERSION = "3.1.1" + static let EXTENSION_VERSION = "3.1.2" static let LOG_TAG = FRIENDLY_NAME static let DEFAULT_ENVIRONMENT = AssuranceEnvironment.prod @@ -70,7 +70,8 @@ enum AssuranceConstants { static let TIMESTAMP = "ACPExtensionEventTimestamp" static let NUMBER = "ACPExtensionEventNumber" static let UNIQUE_IDENTIFIER = "ACPExtensionEventUniqueIdentifier" - static let RESPONSE_IDENTIFIER = "ACPExtensionEventResponseIdentifier" // todo new key introduced : convey to UI team + static let RESPONSE_IDENTIFIER = "ACPExtensionEventResponseIdentifier" + static let PARENT_IDENTIFIER = "ACPExtensionEventParentIdentifier" } enum EventDataKey { diff --git a/AEPAssurance/Source/AssuranceEvent.swift b/AEPAssurance/Source/AssuranceEvent.swift index a86991e..23929fe 100644 --- a/AEPAssurance/Source/AssuranceEvent.swift +++ b/AEPAssurance/Source/AssuranceEvent.swift @@ -86,6 +86,11 @@ struct AssuranceEvent: Codable { if let responseID = event.responseID { payload[AssuranceConstants.ACPExtensionEventKey.RESPONSE_IDENTIFIER] = AnyCodable.init(responseID.uuidString) } + + // if available, add parentID + if let parentID = event.parentID { + payload[AssuranceConstants.ACPExtensionEventKey.PARENT_IDENTIFIER] = AnyCodable.init(parentID.uuidString) + } return AssuranceEvent(type: AssuranceConstants.EventType.GENERIC, payload: payload) } diff --git a/AEPAssurance/UnitTests/AssuranceEventTests.swift b/AEPAssurance/UnitTests/AssuranceEventTests.swift index 21b2a1c..5a82a1b 100644 --- a/AEPAssurance/UnitTests/AssuranceEventTests.swift +++ b/AEPAssurance/UnitTests/AssuranceEventTests.swift @@ -24,7 +24,7 @@ class AssuranceEventTests: XCTestCase { /*-------------------------------------------------- Initializer --------------------------------------------------*/ - func test_init() throws { + func test_init() { // test let event = AssuranceEvent(type: "generic", payload: SAMPLE_PAYLOAD) @@ -35,7 +35,7 @@ class AssuranceEventTests: XCTestCase { XCTAssertEqual(AssuranceConstants.Vendor.MOBILE, event.vendor, "vendor should default to Mobile") } - func test_init_withTimestamp() throws { + func test_init_withTimestamp() { // test let event = AssuranceEvent(type: "generic", payload: SAMPLE_PAYLOAD, timestamp: SAMPLE_TIMESTAMP) @@ -47,7 +47,7 @@ class AssuranceEventTests: XCTestCase { XCTAssertEqual(SAMPLE_TIMESTAMP, event.timestamp, "Inaccurate event timestamp") } - func test_init_withVendor() throws { + func test_init_withVendor() { // test let event = AssuranceEvent(type: "generic", payload: SAMPLE_PAYLOAD, vendor: AssuranceConstants.Vendor.SDK) @@ -59,7 +59,7 @@ class AssuranceEventTests: XCTestCase { XCTAssertEqual(Date().getUnixTimeInSeconds(), event.timestamp?.getUnixTimeInSeconds()) } - func test_init_withVendorAndTimestamp() throws { + func test_init_withVendorAndTimestamp() { // test let event = AssuranceEvent(type: "generic", payload: SAMPLE_PAYLOAD, timestamp: SAMPLE_TIMESTAMP, vendor: AssuranceConstants.Vendor.SDK) @@ -72,7 +72,7 @@ class AssuranceEventTests: XCTestCase { XCTAssertNil(event.metadata, "Metadata should be nil") } - func test_init_withMetaData() throws { + func test_init_withMetaData() { let event = AssuranceEvent(type: "generic", payload: SAMPLE_PAYLOAD, timestamp: SAMPLE_TIMESTAMP, metadata: SAMPLE_METADATA) // verify @@ -84,7 +84,7 @@ class AssuranceEventTests: XCTestCase { XCTAssertEqual(SAMPLE_METADATA, event.metadata, "Inaccurate metadata") } - func test_init_withNilAndEmptyPayload() throws { + func test_init_withNilAndEmptyPayload() { // test let event1 = AssuranceEvent(type: "generic", payload: nil) let event2 = AssuranceEvent(type: "generic", payload: [:]) @@ -96,7 +96,7 @@ class AssuranceEventTests: XCTestCase { XCTAssertEqual(event2.payload, [:], "event payload should be empty") } - func test_init_eventNumberIncrements() throws { + func test_init_eventNumberIncrements() { // test let event1 = AssuranceEvent(type: "generic", payload: nil) let event2 = AssuranceEvent(type: "generic", payload: nil) @@ -113,7 +113,7 @@ class AssuranceEventTests: XCTestCase { InitFromJSONData --------------------------------------------------*/ - func test_initFromJSONData() throws { + func test_initFromJSONData() { // setup let data = """ { @@ -147,7 +147,7 @@ class AssuranceEventTests: XCTestCase { XCTAssertEqual("20", metadataValue?.stringValue) } - func test_initFromJSONData_withoutPayload() throws { + func test_initFromJSONData_withoutPayload() { // setup let data = """ { @@ -166,7 +166,7 @@ class AssuranceEventTests: XCTestCase { XCTAssertNil(event.payload, "Assurance event's payload should be nil") } - func test_initWithJSONData_InvalidData() throws { + func test_initWithJSONData_InvalidData() { // setup let data1 = "".data(using: .utf8)! let data2 = "I am meaningless".data(using: .utf8)! @@ -215,7 +215,7 @@ class AssuranceEventTests: XCTestCase { GetCommandEventType --------------------------------------------------*/ - func test_getCommandEventType() throws { + func test_getCommandEventType() { // setup let data = """ { @@ -234,7 +234,7 @@ class AssuranceEventTests: XCTestCase { XCTAssertEqual("screenshot", event?.commandType, "Inaccurate command type") } - func test_getCommandEventType_whenNotACommand() throws { + func test_getCommandEventType_whenNotACommand() { // setup let data = """ { @@ -253,7 +253,7 @@ class AssuranceEventTests: XCTestCase { XCTAssertNil(event?.commandType, "Command type should be nil") } - func test_getCommandEventType_whenTypeUnavailable() throws { + func test_getCommandEventType_whenTypeUnavailable() { // setup let data = """ { @@ -272,7 +272,7 @@ class AssuranceEventTests: XCTestCase { XCTAssertNil(event?.commandType, "command type should be nil") } - func test_getCommandEventType_whenTypeNotAString() throws { + func test_getCommandEventType_whenTypeNotAString() { // setup let data = """ { @@ -297,7 +297,7 @@ class AssuranceEventTests: XCTestCase { getCommandEventDetail --------------------------------------------------*/ - func test_getCommandEventDetail() throws { + func test_getCommandEventDetail() { // setup let data = """ { @@ -319,7 +319,7 @@ class AssuranceEventTests: XCTestCase { XCTAssertEqual("value", event?.commandDetails!["key"] as? String, "Inaccurate command type") } - func test_getCommandEventDetail_whenNotACommand() throws { + func test_getCommandEventDetail_whenNotACommand() { // setup let data = """ { @@ -341,7 +341,7 @@ class AssuranceEventTests: XCTestCase { XCTAssertNil(event?.commandDetails, "command details should be nil") } - func test_getCommandEventDetail_whenDetailNotADictionary() throws { + func test_getCommandEventDetail_whenDetailNotADictionary() { // setup let data = """ { @@ -363,7 +363,7 @@ class AssuranceEventTests: XCTestCase { /*-------------------------------------------------- fromMobileCoreEvent --------------------------------------------------*/ - func test_fromMobileCoreEvent() throws { + func test_fromMobileCoreEvent() { // setup let sampleEventData: Dictionary = ["oneKey": "oneValue"] let coreEvent = Event(name: "coreEvent", type: "coreType", source: "coreSource", data: sampleEventData) @@ -386,4 +386,27 @@ class AssuranceEventTests: XCTestCase { // verify if the responseId is captured XCTAssertEqual(responseCoreEvent.responseID?.uuidString, assuranceEventForResponse.payload?[AssuranceConstants.ACPExtensionEventKey.RESPONSE_IDENTIFIER]?.stringValue) } + + func test_fromMobileCoreParentEvent() { + let sampleEventData: Dictionary = ["oneKey": "oneValue"] + let coreEvent = Event(name: "coreEvent", type: "coreType", source: "coreSource", data: sampleEventData) + let childCoreEvent = coreEvent.createChainedEvent(name: "chainedEvent", type: "chainedEventType", source: "chainedEventSource", data: nil) + + // test + let assuranceEvent = AssuranceEvent.from(event: coreEvent) + let assuranceEventForChild = AssuranceEvent.from(event: childCoreEvent) + + // verify + XCTAssertEqual(AssuranceConstants.EventType.GENERIC, assuranceEvent.type) + XCTAssertEqual(AssuranceConstants.Vendor.MOBILE, assuranceEvent.vendor) + XCTAssertEqual("coreEvent", assuranceEvent.payload?[AssuranceConstants.ACPExtensionEventKey.NAME]?.stringValue) + XCTAssertEqual("coresource", assuranceEvent.payload?[AssuranceConstants.ACPExtensionEventKey.SOURCE]?.stringValue) + XCTAssertEqual("coretype", assuranceEvent.payload?[AssuranceConstants.ACPExtensionEventKey.TYPE]?.stringValue) + XCTAssertEqual(sampleEventData, assuranceEvent.payload?[AssuranceConstants.ACPExtensionEventKey.DATA]?.dictionaryValue as! [String: String]) + XCTAssertEqual(coreEvent.id.uuidString, assuranceEvent.payload?[AssuranceConstants.ACPExtensionEventKey.UNIQUE_IDENTIFIER]?.stringValue) + XCTAssertEqual(coreEvent.timestamp, assuranceEvent.payload?[AssuranceConstants.ACPExtensionEventKey.TIMESTAMP]?.value as! Date) + + // verify if the responseId is captured + XCTAssertEqual(childCoreEvent.parentID?.uuidString, assuranceEventForChild.payload?[AssuranceConstants.ACPExtensionEventKey.PARENT_IDENTIFIER]?.stringValue) + } } diff --git a/AEPAssurance/UnitTests/Mocks/MockUIService.swift b/AEPAssurance/UnitTests/Mocks/MockUIService.swift index 9e95db5..deae885 100644 --- a/AEPAssurance/UnitTests/Mocks/MockUIService.swift +++ b/AEPAssurance/UnitTests/Mocks/MockUIService.swift @@ -103,6 +103,10 @@ class MockFullScreenMessage: FullscreenMessage { } class MockMessageMonitor: MessageMonitoring { + func show(message: AEPServices.Showable, delegateControl: Bool) -> Bool { + return true + } + func isMessageDisplayed() -> Bool { return false } diff --git a/Makefile b/Makefile index 62db966..7adef05 100644 --- a/Makefile +++ b/Makefile @@ -57,9 +57,12 @@ lint-autocorrect: lint: (./Pods/SwiftLint/swiftlint lint Sources TestApp/) -build-test-apps: - xcodebuild -workspace $(PROJECT_NAME).xcworkspace -scheme $(APP_NAME) -destination 'platform=iOS Simulator,name=iPhone 8' - xcodebuild -workspace $(PROJECT_NAME).xcworkspace -scheme $(APP_NAME_OBJC) -destination 'platform=iOS Simulator,name=iPhone 8' +# Builds the test apps +build-test-apps: pod-install + xcodebuild -workspace $(PROJECT_NAME).xcworkspace -scheme $(APP_NAME) -derivedDataPath ./build -sdk iphonesimulator build + xcodebuild -workspace $(PROJECT_NAME).xcworkspace -scheme $(APP_NAME_OBJC) -derivedDataPath ./build -sdk iphonesimulator build + (cd build/Build/Products/Debug-iphonesimulator/ && zip -r AEPAssuranceTestApp.zip TestApp.app/) + (cp build/Build/Products/Debug-iphonesimulator/AEPAssuranceTestApp.zip TestAppBinaries/) swift-build: swift build -Xswiftc "-sdk" -Xswiftc "`xcrun --sdk iphonesimulator --show-sdk-path`" -Xswiftc "-target" -Xswiftc "x86_64-apple-ios10.0-simulator" diff --git a/Package.swift b/Package.swift index e380f09..db453b3 100644 --- a/Package.swift +++ b/Package.swift @@ -22,7 +22,7 @@ let package = Package( .library(name: "AEPAssurance", targets: ["AEPAssurance"]) ], dependencies: [ - .package(url: "https://github.com/adobe/aepsdk-core-ios.git", .upToNextMajor(from: "3.1.0")) + .package(url: "https://github.com/adobe/aepsdk-core-ios.git", .upToNextMajor(from: "3.9.0")) ], targets: [ .target(name: "AEPAssurance", diff --git a/Podfile.lock b/Podfile.lock index aacf649..4c1eb62 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -2,34 +2,34 @@ PODS: - AEPAnalytics (3.2.0): - AEPCore (>= 3.7.0) - AEPServices (>= 3.7.0) - - AEPCore (3.7.1): - - AEPRulesEngine (>= 1.1.0) - - AEPServices (>= 3.7.1) - - AEPEdge (1.4.1): - - AEPCore (>= 3.5.0) - - AEPEdgeIdentity - - AEPEdgeConsent (1.0.1): - - AEPCore (>= 3.5.0) - - AEPEdge (>= 1.4.0) - - AEPEdgeIdentity (1.1.0): - - AEPCore (>= 3.6.0) - - AEPIdentity (3.7.1): - - AEPCore (>= 3.7.1) - - AEPLifecycle (3.7.1): - - AEPCore (>= 3.7.1) - - AEPMessaging (1.0.0): - - AEPCore - - AEPEdge (>= 1.1.0) - - AEPEdgeIdentity (>= 1.0.0) - - AEPServices - - AEPPlaces (3.0.1): - - AEPCore - - AEPServices - - AEPRulesEngine (1.2.0) - - AEPServices (3.7.1) - - AEPSignal (3.7.1): - - AEPCore (>= 3.7.1) - - AEPTarget (3.2.0): + - AEPCore (3.9.0): + - AEPRulesEngine (>= 1.2.3) + - AEPServices (>= 3.9.0) + - AEPEdge (1.6.0): + - AEPCore (>= 3.7.0) + - AEPEdgeIdentity (>= 1.2.0) + - AEPEdgeConsent (1.1.0): + - AEPCore (>= 3.7.0) + - AEPEdge (>= 1.6.0) + - AEPEdgeIdentity (1.2.0): + - AEPCore (>= 3.7.0) + - AEPIdentity (3.9.0): + - AEPCore (>= 3.9.0) + - AEPLifecycle (3.9.0): + - AEPCore (>= 3.9.0) + - AEPMessaging (1.1.4): + - AEPCore (>= 3.8.1) + - AEPEdge (>= 1.5.0) + - AEPEdgeIdentity (>= 1.1.0) + - AEPServices (>= 3.8.1) + - AEPPlaces (3.0.3): + - AEPCore (>= 3.0.0) + - AEPServices (>= 3.0.0) + - AEPRulesEngine (1.2.3) + - AEPServices (3.9.0) + - AEPSignal (3.9.0): + - AEPCore (>= 3.9.0) + - AEPTarget (3.3.1): - AEPCore (>= 3.1.0) - AEPUserProfile (3.0.1): - AEPCore @@ -71,18 +71,18 @@ SPEC REPOS: SPEC CHECKSUMS: AEPAnalytics: b83efee29b4323537cbce4b8f146d26cee6cdc80 - AEPCore: 412fe933382892ab6c6af958d2f69ebcbca11216 - AEPEdge: 6faf60328f9e5ae7a107fd61f9a968f46ebf2928 - AEPEdgeConsent: a23b35ab331d2aa2013fcef49c9d6b80085d5597 - AEPEdgeIdentity: 47f0c6ecbec5857b2a8cb9b7bf717c2424c6bae0 - AEPIdentity: 7cd5a51d8012aeaeee769e99597db016ad68b0d1 - AEPLifecycle: 94c36a54f7e5466c5274bc822c53eaa410b74888 - AEPMessaging: 661cc08435254f3c9cc0899785c20a7952952e95 - AEPPlaces: 04294020832c78249732c80aec86928114698cbf - AEPRulesEngine: 71228dfdac24c9ded09be13e3257a7eb22468ccc - AEPServices: 7284c30359c789cd16bf366b4ea81094a66d21ab - AEPSignal: c9b3c239120190fae8e8479d584d54b60af37d99 - AEPTarget: 7aa8a2c8e4a2fd36862911581b420380709e5578 + AEPCore: 7c1d0a9465e2d27a8d2bd68afb3185d72c1ed27b + AEPEdge: e4364a56d358c517f7d4cef87570ac4e7652d3a2 + AEPEdgeConsent: d10d4232615b880d484050edf47b2e3fbfb787bb + AEPEdgeIdentity: 6bb2c1e62d48cdc988b4d492e8e6d563f0ced73d + AEPIdentity: efcd67b2a130cf47ddd927288db2896768a727d8 + AEPLifecycle: f84b5e7ebb443309475df19f77ac6ebcdabd6a66 + AEPMessaging: bc711037b3989843f925649874225f8f3a4d8462 + AEPPlaces: 561e22d5ee6570fcb0b721a47aa7cda2c4f00ec0 + AEPRulesEngine: f8d6eb0fa5a83d791f57867ed02f25fdf99894ec + AEPServices: 8637166edaa8db23806eda2ad5bd2fa8faa0f259 + AEPSignal: 5e3f2d6f2e57535adbf50f1263841228b68256c8 + AEPTarget: 90c732ef32cee5733897e395afdab7242df9762d AEPUserProfile: 2ddb5ba8e2c22dd8f942992306b050f4be2c2403 SwiftLint: e96c0a8c770c7ebbc4d36c55baf9096bb65c4584 diff --git a/TestApp/AppDelegate.swift b/TestApp/AppDelegate.swift index 22cb9de..70965e0 100644 --- a/TestApp/AppDelegate.swift +++ b/TestApp/AppDelegate.swift @@ -48,10 +48,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD Places.self, Messaging.self ] + let appState = application.applicationState MobileCore.registerExtensions(extensions, { MobileCore.configureWith(appId: "94f571f308d5/f986c2be4925/launch-e96cdeaddea9-development") + if appState != .background { + MobileCore.lifecycleStart(additionalContextData: nil) + } }) - MobileCore.lifecycleStart(additionalContextData: nil) //MobileCore.updateConfigurationWith(configDict: ["experienceCloud.org": "056F3DD059CB22060A494021@AdobeOrg"]) // MobileCore.configureWith(appId: "launch-EN516bfbc0fe2b42449bf171a4f8cb9cef-development") diff --git a/TestApp/ContentView.swift b/TestApp/ContentView.swift index 6c2f4bd..2f82f8e 100644 --- a/TestApp/ContentView.swift +++ b/TestApp/ContentView.swift @@ -85,7 +85,7 @@ struct AssuranceCard: View { Assurance.startSession() } }, label: { - Text("Connect") + Text("Start Session") }).buttonStyle(YellowButtonStyle()).padding().onReceive(NotificationCenter.default.publisher(for: .deviceDidShakeNotification)) { _ in #if DEBUG Assurance.startSession() diff --git a/TestAppBinaries/AEPAssuranceTestApp.zip b/TestAppBinaries/AEPAssuranceTestApp.zip new file mode 100644 index 0000000..cb4f767 Binary files /dev/null and b/TestAppBinaries/AEPAssuranceTestApp.zip differ