Skip to content

Commit 0decafb

Browse files
runnerrunner
authored andcommitted
Release 4.3.0
1 parent 5054534 commit 0decafb

File tree

135 files changed

+3520
-907
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

135 files changed

+3520
-907
lines changed

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "com.unity3d.ads.example"
88
minSdkVersion 19
99
targetSdkVersion 30
10-
versionCode = 4210
11-
versionName = "4.2.1"
10+
versionCode = 4300
11+
versionName = "4.3.0"
1212
}
1313

1414
buildTypes {

unity-ads/build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ if (project.rootProject.file('local.properties').exists()) {
1010
ext {
1111
GROUP_ID = "com.unity3d.ads"
1212
ARTIFACT_ID = "unity-ads"
13-
VERSION_ID = "4.2.1"
14-
VERSION_CODE = 4210
13+
VERSION_ID = "4.3.0"
14+
VERSION_CODE = 4300
1515
SIGN_AAR = properties.getProperty("SIGN_AAR") ?: false
1616
}
1717

@@ -51,8 +51,8 @@ android {
5151

5252
buildTypes {
5353
release {
54-
minifyEnabled false
55-
proguardFiles getDefaultProguardFile('proguard-android.txt')
54+
minifyEnabled true
55+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
5656
consumerProguardFiles 'proguard-rules.pro'
5757
}
5858
debug {

unity-ads/proguard-rules.pro

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,31 @@
44
# Keep JavascriptInterface for WebView bridge
55
-keepattributes JavascriptInterface
66

7-
# Sometimes keepattributes is not enough to keep annotations
8-
-keep class android.webkit.JavascriptInterface {
9-
*;
10-
}
11-
12-
# Keep all classes in Unity Ads package
13-
-keep class com.unity3d.ads.** {
14-
*;
15-
}
16-
17-
# Keep all classes in Unity Services package
18-
-keep class com.unity3d.services.** {
19-
*;
20-
}
7+
-keepattributes Signature,Exceptions
8+
9+
# Keep the parameter names for our Public APIs
10+
-keepparameternames
11+
12+
-keeppackagenames
13+
14+
# Keep Javascript annotation class name
15+
-keep public class android.webkit.JavascriptInterface
16+
17+
# Keep publicly exposed SDK APIs.
18+
-keep public class com.unity3d.ads.* { public *; }
19+
-keep public class com.unity3d.ads.metadata.* { *; }
20+
-keep public class com.unity3d.services.banners.* { public *; }
21+
22+
# Keep internal libraries from being removed in optimization.
23+
-keep public class com.unity3d.scar.** { public *; }
24+
25+
# Keep webview accessed APIs
26+
-keep public class com.unity3d.services.**.api.** { public *; }
27+
-keep public class com.unity3d.services.**.configuration.** { public *; }
28+
-keep public class com.unity3d.services.core.webview.bridge.WebViewExposed
29+
30+
-keep public class com.unity3d.services.core.webview.WebView
31+
32+
# Don't warn about compile time depencencies
33+
-dontwarn com.google.ar.core.**
34+
-dontwarn com.google.android.gms.ads.**

unity-ads/src/androidTest/java/com/unity3d/ads/test/InstrumentationTestSuite.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,35 @@
1111
import com.unity3d.ads.test.instrumentation.services.ads.webplayer.WebPlayerViewCacheTest;
1212
import com.unity3d.ads.test.instrumentation.services.ads.webplayer.WebPlayerViewSettingsCacheTest;
1313
import com.unity3d.ads.test.instrumentation.services.banners.BannerViewCacheTests;
14+
import com.unity3d.ads.test.instrumentation.services.core.configuration.ExperimentsReaderTest;
1415
import com.unity3d.ads.test.instrumentation.services.core.configuration.ExperimentsTest;
1516
import com.unity3d.ads.test.instrumentation.services.core.configuration.InitializationNotificationCenterTest;
17+
import com.unity3d.ads.test.instrumentation.services.core.configuration.PrivacyConfigStatusTest;
18+
import com.unity3d.ads.test.instrumentation.services.core.configuration.PrivacyConfigStorageTest;
19+
import com.unity3d.ads.test.instrumentation.services.core.configuration.PrivacyConfigTest;
1620
import com.unity3d.ads.test.instrumentation.services.core.device.AsyncTokenStorageTest;
1721
import com.unity3d.ads.test.instrumentation.services.core.device.DeviceInfoReaderCompressorTest;
1822
import com.unity3d.ads.test.instrumentation.services.core.device.DeviceInfoReaderFilterProviderTest;
19-
import com.unity3d.ads.test.instrumentation.services.core.device.DeviceInfoReaderTest;
20-
import com.unity3d.ads.test.instrumentation.services.core.device.DeviceInfoReaderUrlEncoderTest;
2123
import com.unity3d.ads.test.instrumentation.services.core.device.DeviceInfoReaderWithFilterTest;
2224
import com.unity3d.ads.test.instrumentation.services.core.device.DeviceInfoReaderWithPIITest;
2325
import com.unity3d.ads.test.instrumentation.services.core.device.DeviceInfoReaderWithStorageInfoTest;
2426
import com.unity3d.ads.test.instrumentation.services.core.device.NativeTokenGeneratorTest;
2527
import com.unity3d.ads.test.instrumentation.services.core.device.pii.PiiDataSelectorTest;
2628
import com.unity3d.ads.test.instrumentation.services.core.device.pii.PiiDecisionDataTest;
2729
import com.unity3d.ads.test.instrumentation.services.core.device.pii.PiiTrackingStatusReaderTest;
30+
import com.unity3d.ads.test.instrumentation.services.core.misc.IntervalTimerTest;
2831
import com.unity3d.ads.test.instrumentation.services.core.misc.JsonFlattenerTest;
2932
import com.unity3d.ads.test.instrumentation.services.core.webview.WebViewUrlBuilderTest;
3033
import com.unity3d.ads.test.instrumentation.services.core.webview.bridge.WebViewBridgeSharedObjectTests;
3134
import com.unity3d.ads.test.instrumentation.services.core.webview.bridge.invocation.WebViewBridgeInvocationRunnableTests;
3235
import com.unity3d.ads.test.instrumentation.services.core.webview.bridge.invocation.WebViewBridgeInvocationTests;
36+
import com.unity3d.ads.test.instrumentation.services.store.gpbl.bridges.PurchasesResultBridgeTest;
3337
import com.unity3d.ads.test.legacy.ConfigurationTest;
3438
import com.unity3d.services.analytics.AcquisitionTypeTest;
3539
import com.unity3d.services.analytics.UnityAnalyticsTest;
40+
import com.unity3d.services.core.request.metrics.MetricCommonTagsTest;
41+
import com.unity3d.services.core.request.metrics.MetricsContainerTest;
42+
import com.unity3d.services.core.timer.BaseTimerTest;
3643

3744
import org.junit.runner.RunWith;
3845
import org.junit.runners.Suite;
@@ -43,6 +50,10 @@
4350
AcquisitionTypeTest.class,
4451
InitializationNotificationCenterTest.class,
4552
ExperimentsTest.class,
53+
ExperimentsReaderTest.class,
54+
PrivacyConfigStatusTest.class,
55+
PrivacyConfigStorageTest.class,
56+
PrivacyConfigTest.class,
4657
WebViewUrlBuilderTest.class,
4758
WebPlayerViewSettingsCacheTest.class,
4859
WebPlayerViewCacheTest.class,
@@ -64,14 +75,17 @@
6475
PiiTrackingStatusReaderTest.class,
6576
PiiDecisionDataTest.class,
6677
PiiDataSelectorTest.class,
67-
DeviceInfoReaderTest.class,
6878
DeviceInfoReaderCompressorTest.class,
69-
DeviceInfoReaderUrlEncoderTest.class,
7079
DeviceInfoReaderFilterProviderTest.class,
7180
DeviceInfoReaderWithStorageInfoTest.class,
7281
DeviceInfoReaderWithPIITest.class,
7382
DeviceInfoReaderWithFilterTest.class,
74-
JsonFlattenerTest.class
83+
JsonFlattenerTest.class,
84+
PurchasesResultBridgeTest.class,
85+
MetricCommonTagsTest.class,
86+
MetricsContainerTest.class,
87+
IntervalTimerTest.class,
88+
BaseTimerTest.class
7589
})
7690

7791
public class InstrumentationTestSuite {}

unity-ads/src/androidTest/java/com/unity3d/ads/test/hybrid/HybridTestModuleConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.unity3d.ads.test.hybrid;
22

33
import com.unity3d.services.core.configuration.Configuration;
4+
import com.unity3d.services.core.configuration.ErrorState;
45
import com.unity3d.services.core.configuration.IModuleConfiguration;
56

67
public class HybridTestModuleConfiguration implements IModuleConfiguration {
@@ -16,7 +17,7 @@ public boolean resetState(Configuration configuration) {
1617
public boolean initModuleState(Configuration configuration) {
1718
return true;
1819
}
19-
public boolean initErrorState(Configuration configuration, String state, String message) {
20+
public boolean initErrorState(Configuration configuration, ErrorState state, String message) {
2021
return true;
2122
}
2223
public boolean initCompleteState(Configuration configuration) {

unity-ads/src/androidTest/java/com/unity3d/ads/test/instrumentation/services/ads/operation/LoadModuleDecoratorInitializationBufferTests.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
import com.unity3d.services.ads.operation.load.LoadModuleDecoratorInitializationBuffer;
1212
import com.unity3d.services.ads.operation.load.LoadOperationState;
1313
import com.unity3d.services.core.configuration.Configuration;
14+
import com.unity3d.services.core.configuration.ErrorState;
1415
import com.unity3d.services.core.configuration.IInitializationNotificationCenter;
1516
import com.unity3d.services.core.properties.SdkProperties;
17+
import com.unity3d.services.core.request.metrics.ISDKMetrics;
1618
import com.unity3d.services.core.webview.bridge.IWebViewBridgeInvoker;
1719

1820
import org.junit.Before;
@@ -27,13 +29,15 @@ public class LoadModuleDecoratorInitializationBufferTests {
2729
private IInitializationNotificationCenter initializationNotificationCenterMock;
2830
private IWebViewBridgeInvoker webViewBridgeInvokerMock;
2931
private LoadOperationState loadOperationStateMock;
32+
private ISDKMetrics sdkMetrics;
3033

3134
@Before
3235
public void beforeEachTest() {
3336
loadModuleMock = mock(ILoadModule.class);
3437
initializationNotificationCenterMock = mock(IInitializationNotificationCenter.class);
3538
webViewBridgeInvokerMock = mock(IWebViewBridgeInvoker.class);
3639
loadOperationStateMock = mock(LoadOperationState.class);
40+
sdkMetrics = mock(ISDKMetrics.class);
3741
}
3842

3943
@Test
@@ -48,6 +52,7 @@ public void executeAdOperationCallsLoadModuleExecuteAdOperationWhenSdkIsInitiali
4852

4953
@Test
5054
public void executeAdOperationCallsListenerOnUnityAdsFailedToLoadWhenInitHasFailed() {
55+
Mockito.when(loadModuleMock.getMetricSender()).thenReturn(sdkMetrics);
5156
IUnityAdsLoadListener loadListenerMock = mock(IUnityAdsLoadListener.class);
5257
LoadOperationState loadOperationState = new LoadOperationState(testPlacementId, loadListenerMock, new UnityAdsLoadOptions(), new Configuration());
5358
LoadModuleDecoratorInitializationBuffer loadModuleInitBuffer = new LoadModuleDecoratorInitializationBuffer(loadModuleMock, initializationNotificationCenterMock);
@@ -94,6 +99,7 @@ public void loadModuleExecuteAdOperationIsNotCalledWhenOnSdkInitializedIsCalledA
9499

95100
@Test
96101
public void onUnityAdsFailedToLoadIsCalledWhenOnSdkInitializationFailedIsCalledAfterCallingExecuteAdOperation() {
102+
Mockito.when(loadModuleMock.getMetricSender()).thenReturn(sdkMetrics);
97103
IUnityAdsLoadListener loadListenerMock = mock(IUnityAdsLoadListener.class);
98104
LoadOperationState loadOperationStateMock = new LoadOperationState(testPlacementId, loadListenerMock, new UnityAdsLoadOptions(), new Configuration());
99105
LoadModuleDecoratorInitializationBuffer loadModuleInitBuffer = new LoadModuleDecoratorInitializationBuffer(loadModuleMock, initializationNotificationCenterMock);
@@ -102,7 +108,7 @@ public void onUnityAdsFailedToLoadIsCalledWhenOnSdkInitializationFailedIsCalledA
102108
loadModuleInitBuffer.executeAdOperation(webViewBridgeInvokerMock, loadOperationStateMock);
103109
Mockito.verify(initializationNotificationCenterMock, times(1)).addListener(loadModuleInitBuffer);
104110

105-
loadModuleInitBuffer.onSdkInitializationFailed("UntestableMessage", 0);
111+
loadModuleInitBuffer.onSdkInitializationFailed("UntestableMessage", ErrorState.InitModules, 0);
106112
Mockito.verify(loadListenerMock, timeout(maxWaitTime).times(1)).onUnityAdsFailedToLoad(testPlacementId, UnityAds.UnityAdsLoadError.INITIALIZE_FAILED, "[UnityAds] SDK Initialization Failure");
107113
}
108114
}

unity-ads/src/androidTest/java/com/unity3d/ads/test/instrumentation/services/ads/operation/LoadModuleDecoratorTimeoutTests.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
import com.unity3d.services.ads.operation.load.ILoadModule;
1414
import com.unity3d.services.ads.operation.load.LoadModuleDecoratorTimeout;
1515
import com.unity3d.services.ads.operation.load.LoadOperationState;
16+
import com.unity3d.services.core.configuration.Configuration;
17+
import com.unity3d.services.core.configuration.ConfigurationReader;
18+
import com.unity3d.services.core.request.metrics.ISDKMetrics;
1619
import com.unity3d.services.core.webview.bridge.IWebViewBridgeInvoker;
1720

1821
import org.junit.Before;
@@ -31,26 +34,34 @@ public class LoadModuleDecoratorTimeoutTests {
3134

3235
private IUnityAdsLoadListener loadListenerMock;
3336
private ILoadModule loadModuleMock;
37+
private ISDKMetrics sdkMetricsMock;
38+
private ConfigurationReader configurationReaderMock;
3439

3540
@Before
3641
public void beforeEachTest() {
3742
loadListenerMock = mock(IUnityAdsLoadListener.class);
3843
loadModuleMock = mock(ILoadModule.class);
44+
sdkMetricsMock = mock(ISDKMetrics.class);
45+
configurationReaderMock = mock(ConfigurationReader.class);
46+
47+
Mockito.when(configurationReaderMock.getCurrentConfiguration()).thenReturn(new Configuration());
3948
}
4049

4150
@Test
4251
public void onUnityAdsFailedToLoadIsCalledWhenTimeoutIsReached() {
52+
Mockito.when(loadModuleMock.getMetricSender()).thenReturn(sdkMetricsMock);
4353
LoadOperationState loadOperationState = new LoadOperationState(placementId, loadListenerMock, loadOptions, OperationTestUtilities.createConfigurationWithLoadTimeout(loadTimeout));
44-
LoadModuleDecoratorTimeout timeoutDecorator = new LoadModuleDecoratorTimeout(loadModuleMock);
54+
LoadModuleDecoratorTimeout timeoutDecorator = new LoadModuleDecoratorTimeout(loadModuleMock, configurationReaderMock);
4555

4656
timeoutDecorator.executeAdOperation(mock(IWebViewBridgeInvoker.class), loadOperationState);
4757
Mockito.verify(loadListenerMock, timeout(maxWaitTime).times(1)).onUnityAdsFailedToLoad(placementId, UnityAds.UnityAdsLoadError.TIMEOUT, "[UnityAds] Timeout while loading " + placementId);
4858
}
4959

5060
@Test
5161
public void onUnityAdsAdLoadedAndOnUnityAdsAdFailedToLoadIsNotCalledAgainWhenTimeoutHasBeenReached() {
62+
Mockito.when(loadModuleMock.getMetricSender()).thenReturn(sdkMetricsMock);
5263
LoadOperationState loadOperationState = new LoadOperationState(placementId, loadListenerMock, loadOptions, OperationTestUtilities.createConfigurationWithLoadTimeout(loadTimeout));
53-
LoadModuleDecoratorTimeout timeoutDecorator = new LoadModuleDecoratorTimeout(loadModuleMock);
64+
LoadModuleDecoratorTimeout timeoutDecorator = new LoadModuleDecoratorTimeout(loadModuleMock, configurationReaderMock);
5465

5566
timeoutDecorator.executeAdOperation(mock(IWebViewBridgeInvoker.class), loadOperationState);
5667
TestUtilities.SleepCurrentThread(loadTimeoutExpireMs);
@@ -63,8 +74,9 @@ public void onUnityAdsAdLoadedAndOnUnityAdsAdFailedToLoadIsNotCalledAgainWhenTim
6374

6475
@Test
6576
public void onUnityAdsAdFailedToLoadIsNotCalledWhenOnUnityAdsAdLoadedIsCalledBeforeTimeout() {
77+
Mockito.when(loadModuleMock.getMetricSender()).thenReturn(sdkMetricsMock);
6678
LoadOperationState loadOperationState = new LoadOperationState(placementId, loadListenerMock, loadOptions, OperationTestUtilities.createConfigurationWithLoadTimeout(loadTimeout));
67-
LoadModuleDecoratorTimeout timeoutDecorator = new LoadModuleDecoratorTimeout(loadModuleMock);
79+
LoadModuleDecoratorTimeout timeoutDecorator = new LoadModuleDecoratorTimeout(loadModuleMock, configurationReaderMock);
6880

6981
timeoutDecorator.executeAdOperation(mock(IWebViewBridgeInvoker.class), loadOperationState);
7082
TestUtilities.SleepCurrentThread(25);
@@ -76,14 +88,14 @@ public void onUnityAdsAdFailedToLoadIsNotCalledWhenOnUnityAdsAdLoadedIsCalledBef
7688

7789
@Test
7890
public void noNPEIsThrownWhenOnUnityAdsAdLoadedIsCalledWithoutCallingExecuteAdOperation() {
79-
LoadModuleDecoratorTimeout timeoutDecorator = new LoadModuleDecoratorTimeout(loadModuleMock);
91+
LoadModuleDecoratorTimeout timeoutDecorator = new LoadModuleDecoratorTimeout(loadModuleMock, configurationReaderMock);
8092
timeoutDecorator.onUnityAdsAdLoaded(placementId);
8193
Mockito.verify(loadModuleMock, times(0)).onUnityAdsFailedToLoad(anyString(), any(UnityAds.UnityAdsLoadError.class), anyString());
8294
}
8395

8496
@Test
8597
public void noNPEIsThrownWhenOnUnityAdsAdFailedToLoadIsCalledWithoutCallingExecuteAdOperation() {
86-
LoadModuleDecoratorTimeout timeoutDecorator = new LoadModuleDecoratorTimeout(loadModuleMock);
98+
LoadModuleDecoratorTimeout timeoutDecorator = new LoadModuleDecoratorTimeout(loadModuleMock, configurationReaderMock);
8799
timeoutDecorator.onUnityAdsFailedToLoad(placementId, loadError, loadErrorMessage);
88100
Mockito.verify(loadModuleMock, times(0)).onUnityAdsAdLoaded(anyString());
89101
}

unity-ads/src/androidTest/java/com/unity3d/ads/test/instrumentation/services/ads/operation/LoadModuleTests.java

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,32 @@
22

33
import static org.mockito.ArgumentMatchers.any;
44
import static org.mockito.ArgumentMatchers.anyString;
5-
import static org.mockito.ArgumentMatchers.eq;
65
import static org.mockito.Mockito.doAnswer;
76
import static org.mockito.Mockito.mock;
87
import static org.mockito.Mockito.timeout;
9-
import static org.mockito.Mockito.times;
108

119
import com.unity3d.ads.IUnityAdsLoadListener;
1210
import com.unity3d.ads.UnityAds;
1311
import com.unity3d.ads.UnityAdsLoadOptions;
1412
import com.unity3d.services.ads.operation.load.LoadModule;
1513
import com.unity3d.services.ads.operation.load.LoadOperation;
1614
import com.unity3d.services.ads.operation.load.LoadOperationState;
17-
import com.unity3d.services.core.request.metrics.ISDKMetricSender;
18-
import com.unity3d.services.core.request.metrics.SDKMetricEvents;
15+
import com.unity3d.services.core.request.metrics.AdOperationError;
16+
import com.unity3d.services.core.request.metrics.AdOperationMetric;
17+
import com.unity3d.services.core.request.metrics.ISDKMetrics;
18+
import com.unity3d.services.core.request.metrics.Metric;
1919
import com.unity3d.services.core.webview.bridge.IWebViewBridgeInvoker;
2020
import com.unity3d.services.core.webview.bridge.invocation.IWebViewBridgeInvocation;
2121

22+
import org.junit.Assert;
2223
import org.junit.Before;
2324
import org.junit.Test;
25+
import org.mockito.ArgumentCaptor;
2426
import org.mockito.Mockito;
2527
import org.mockito.invocation.InvocationOnMock;
2628
import org.mockito.stubbing.Answer;
2729

2830
import java.lang.reflect.Method;
29-
import java.util.HashMap;
3031

3132
public class LoadModuleTests {
3233
private static final String placementId = "TestPlacementId";
@@ -39,15 +40,15 @@ public class LoadModuleTests {
3940

4041
private IWebViewBridgeInvoker webViewBridgeInvokerMock;
4142
private IUnityAdsLoadListener loadListenerMock;
42-
private ISDKMetricSender sdkMetricSender;
4343
private LoadModule loadModule;
44+
private ISDKMetrics sdkMetrics;
4445

4546
@Before
4647
public void beforeEachTest() {
4748
webViewBridgeInvokerMock = mock(IWebViewBridgeInvoker.class);
4849
loadListenerMock = mock(IUnityAdsLoadListener.class);
49-
sdkMetricSender = mock(ISDKMetricSender.class);
50-
loadModule = new LoadModule(sdkMetricSender);
50+
sdkMetrics = mock(ISDKMetrics.class);
51+
loadModule = new LoadModule(sdkMetrics);
5152
}
5253

5354
@Test
@@ -60,6 +61,8 @@ public void executeAdOperationCallsOnUnityAdsFailedToLoadWhenPlacementNotSet() {
6061

6162
@Test
6263
public void executeAdOperationCallsOnUnityAdsFailedToLoadWhenWebViewBridgeInvocationFails() {
64+
final ArgumentCaptor<Metric> metricsCaptor = ArgumentCaptor.forClass(Metric.class);
65+
final Metric desiredMetric = AdOperationMetric.newAdLoadFailure(AdOperationError.callback_error, 0L);
6366
LoadOperationState loadOperationState = new LoadOperationState(placementId, loadListenerMock, unityAdsLoadOptions, OperationTestUtilities.createConfigurationWithWebviewTimeout(webViewTimeout));
6467

6568
doAnswer(new Answer() {
@@ -72,13 +75,15 @@ public Object answer(InvocationOnMock invocation) {
7275
loadModule.executeAdOperation(webViewBridgeInvokerMock, loadOperationState);
7376

7477
Mockito.verify(loadListenerMock, timeout(maxWaitTime).times(1)).onUnityAdsFailedToLoad(placementId, UnityAds.UnityAdsLoadError.INTERNAL_ERROR, "[UnityAds] Internal communication failure");
75-
Mockito.verify(sdkMetricSender, times(1)).sendSDKMetricEventWithTag(SDKMetricEvents.native_load_callback_error, new HashMap<String, String> (){{
76-
put("cbs", "invocationFailure");
77-
}});
78+
Mockito.verify(sdkMetrics, timeout(maxWaitTime).times(1)).sendMetricWithInitState(metricsCaptor.capture());
79+
final Metric capturedMetric = metricsCaptor.getValue();
80+
Assert.assertEquals(desiredMetric.getName(), capturedMetric.getName());
7881
}
7982

8083
@Test
8184
public void executeAdOperationCallsOnUnityAdsFailedToLoadWhenWebViewBridgeInvocationTimesOut() {
85+
final ArgumentCaptor<Metric> metricsCaptor = ArgumentCaptor.forClass((Class) Metric.class);
86+
final Metric desiredMetric = AdOperationMetric.newAdLoadFailure(AdOperationError.callback_timeout, 0L);
8287
LoadOperationState loadOperationState = new LoadOperationState(placementId, loadListenerMock, unityAdsLoadOptions, OperationTestUtilities.createConfigurationWithWebviewTimeout(50));
8388

8489
doAnswer(new Answer() {
@@ -91,7 +96,10 @@ public Object answer(InvocationOnMock invocation) {
9196
loadModule.executeAdOperation(webViewBridgeInvokerMock, loadOperationState);
9297

9398
Mockito.verify(loadListenerMock, timeout(maxWaitTime).times(1)).onUnityAdsFailedToLoad(placementId, UnityAds.UnityAdsLoadError.INTERNAL_ERROR, "[UnityAds] Internal communication timeout");
94-
Mockito.verify(sdkMetricSender, times(1)).sendSDKMetricEvent(eq(SDKMetricEvents.native_load_callback_timeout));
99+
Mockito.verify(sdkMetrics, timeout(maxWaitTime).times(1)).sendMetricWithInitState(metricsCaptor.capture());
100+
final Metric capturedMetric = metricsCaptor.getValue();
101+
Assert.assertEquals(desiredMetric.getName(), capturedMetric.getName());
102+
95103
}
96104

97105
@Test

0 commit comments

Comments
 (0)