Skip to content

Commit 65cd56e

Browse files
mattcreaserjvh-aws
andauthored
Chore: Canary Test Stability (#3234)
Co-authored-by: jvh-aws <jvhoff@amazon.de>
1 parent a798441 commit 65cd56e

14 files changed

Lines changed: 230 additions & 86 deletions

File tree

aws-analytics-pinpoint/src/androidTest/java/com/amplifyframework/analytics/pinpoint/PinpointAnalyticsCanaryTest.kt

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,28 +32,30 @@ import com.amplifyframework.auth.cognito.AWSCognitoAuthPlugin
3232
import com.amplifyframework.core.Amplify
3333
import com.amplifyframework.hub.HubChannel
3434
import com.amplifyframework.hub.HubEvent
35+
import com.amplifyframework.testutils.DeviceFarmTestBase
3536
import com.amplifyframework.testutils.HubAccumulator
3637
import com.amplifyframework.testutils.Resources
3738
import com.amplifyframework.testutils.Sleep
38-
import com.amplifyframework.testutils.rules.CanaryTestRule
39+
import com.amplifyframework.testutils.await
3940
import com.amplifyframework.testutils.sync.SynchronousAuth
4041
import java.util.UUID
41-
import java.util.concurrent.TimeUnit
42+
import kotlin.time.Duration.Companion.minutes
43+
import kotlin.time.Duration.Companion.seconds
4244
import kotlinx.coroutines.runBlocking
4345
import org.json.JSONException
4446
import org.junit.Assert
4547
import org.junit.Before
4648
import org.junit.BeforeClass
47-
import org.junit.Rule
4849
import org.junit.Test
4950

50-
class PinpointAnalyticsCanaryTest {
51+
class PinpointAnalyticsCanaryTest : DeviceFarmTestBase() {
5152
companion object {
5253
private const val CREDENTIALS_RESOURCE_NAME = "credentials"
5354
private const val CONFIGURATION_NAME = "amplifyconfiguration"
54-
private const val COGNITO_CONFIGURATION_TIMEOUT = 5 * 1000L
55-
private const val PINPOINT_ROUNDTRIP_TIMEOUT = 10 * 1000L
56-
private const val TIMEOUT_S = 20
55+
private const val SHORT_TIMEOUT = 5 * 1000L
56+
private const val LONG_TIMEOUT = 10 * 1000L
57+
58+
private val HubTimeout = 20.seconds
5759
private const val UNIQUE_ID_KEY = "UniqueId"
5860
private const val PREFERENCES_AND_FILE_MANAGER_SUFFIX = "515d6767-01b7-49e5-8273-c8d11b0f331d"
5961
private lateinit var synchronousAuth: SynchronousAuth
@@ -75,10 +77,17 @@ class PinpointAnalyticsCanaryTest {
7577
)
7678
setUniqueId()
7779
Amplify.Auth.addPlugin(AWSCognitoAuthPlugin() as AuthPlugin<*>)
78-
Amplify.addPlugin(AWSPinpointAnalyticsPlugin())
80+
Amplify.addPlugin(
81+
AWSPinpointAnalyticsPlugin(
82+
AWSPinpointAnalyticsPlugin.Options {
83+
autoFlushEventsInterval = 60.minutes.inWholeMilliseconds
84+
trackLifecycleEvents = false
85+
}
86+
)
87+
)
7988
Amplify.configure(context)
80-
Sleep.milliseconds(COGNITO_CONFIGURATION_TIMEOUT)
81-
synchronousAuth = SynchronousAuth.delegatingTo(Amplify.Auth)
89+
Sleep.milliseconds(SHORT_TIMEOUT)
90+
synchronousAuth = SynchronousAuth.delegatingTo(Amplify.Auth, 20_000L)
8291
}
8392

8493
private fun setUniqueId() {
@@ -117,9 +126,6 @@ class PinpointAnalyticsCanaryTest {
117126
}
118127
}
119128

120-
@get:Rule
121-
val testRule = CanaryTestRule()
122-
123129
@Before
124130
fun flushEvents() {
125131
val context = ApplicationProvider.getApplicationContext<Context>()
@@ -134,7 +140,7 @@ class PinpointAnalyticsCanaryTest {
134140
val hubAccumulator =
135141
HubAccumulator.create(HubChannel.ANALYTICS, AnalyticsChannelEventName.FLUSH_EVENTS, 1).start()
136142
Amplify.Analytics.flushEvents()
137-
hubAccumulator.await(10, TimeUnit.SECONDS)
143+
hubAccumulator.await(HubTimeout)
138144
pinpointClient = Amplify.Analytics.getPlugin("awsPinpointAnalyticsPlugin").escapeHatch as
139145
PinpointClient
140146
uniqueId = preferences.getString(UNIQUE_ID_KEY, "error-no-unique-id")!!
@@ -144,7 +150,7 @@ class PinpointAnalyticsCanaryTest {
144150
@Test
145151
fun recordEvent_flushEvent() {
146152
val hubAccumulator =
147-
HubAccumulator.create(HubChannel.ANALYTICS, AnalyticsChannelEventName.FLUSH_EVENTS, 2).start()
153+
HubAccumulator.create(HubChannel.ANALYTICS, AnalyticsChannelEventName.FLUSH_EVENTS, 1).start()
148154
val eventName = "Amplify-event" + UUID.randomUUID().toString()
149155
val event = AnalyticsEvent.builder()
150156
.name(eventName)
@@ -155,16 +161,17 @@ class PinpointAnalyticsCanaryTest {
155161
.build()
156162

157163
Amplify.Analytics.recordEvent(event)
164+
Sleep.milliseconds(SHORT_TIMEOUT)
158165
Amplify.Analytics.flushEvents()
159-
val hubEvents = hubAccumulator.await(TIMEOUT_S, TimeUnit.SECONDS)
166+
val hubEvents = hubAccumulator.await(HubTimeout)
160167
val submittedEvents = combineAndFilterEvents(hubEvents)
161168
Assert.assertEquals(1, submittedEvents.size.toLong())
162169
}
163170

164171
@Test
165172
fun registerGlobalProperties() {
166173
val hubAccumulator =
167-
HubAccumulator.create(HubChannel.ANALYTICS, AnalyticsChannelEventName.FLUSH_EVENTS, 2).start()
174+
HubAccumulator.create(HubChannel.ANALYTICS, AnalyticsChannelEventName.FLUSH_EVENTS, 1).start()
168175
val eventName = "Amplify-event" + UUID.randomUUID().toString()
169176
val event = AnalyticsEvent.builder()
170177
.name(eventName)
@@ -180,16 +187,17 @@ class PinpointAnalyticsCanaryTest {
180187
.add("AppStyle", "DarkMode")
181188
.build()
182189
)
190+
Sleep.milliseconds(SHORT_TIMEOUT)
183191
Amplify.Analytics.flushEvents()
184-
val hubEvents = hubAccumulator.await(TIMEOUT_S, TimeUnit.SECONDS)
192+
val hubEvents = hubAccumulator.await(HubTimeout)
185193
val submittedEvents = combineAndFilterEvents(hubEvents)
186194
Assert.assertEquals(1, submittedEvents.size.toLong())
187195
}
188196

189197
@Test
190198
fun unregisterGlobalProperties() {
191199
val hubAccumulator =
192-
HubAccumulator.create(HubChannel.ANALYTICS, AnalyticsChannelEventName.FLUSH_EVENTS, 2).start()
200+
HubAccumulator.create(HubChannel.ANALYTICS, AnalyticsChannelEventName.FLUSH_EVENTS, 1).start()
193201
val eventName = "Amplify-event" + UUID.randomUUID().toString()
194202
val event = AnalyticsEvent.builder()
195203
.name(eventName)
@@ -201,8 +209,9 @@ class PinpointAnalyticsCanaryTest {
201209

202210
Amplify.Analytics.recordEvent(event)
203211
Amplify.Analytics.unregisterGlobalProperties("AppStyle")
212+
Sleep.milliseconds(SHORT_TIMEOUT)
204213
Amplify.Analytics.flushEvents()
205-
val hubEvents = hubAccumulator.await(TIMEOUT_S, TimeUnit.SECONDS)
214+
val hubEvents = hubAccumulator.await(HubTimeout)
206215
val submittedEvents = combineAndFilterEvents(hubEvents)
207216
Assert.assertEquals(1, submittedEvents.size.toLong())
208217
}
@@ -219,7 +228,7 @@ class PinpointAnalyticsCanaryTest {
219228
.customProperties(properties)
220229
.build()
221230
Amplify.Analytics.identifyUser(UUID.randomUUID().toString(), userProfile)
222-
Sleep.milliseconds(PINPOINT_ROUNDTRIP_TIMEOUT)
231+
Sleep.milliseconds(LONG_TIMEOUT)
223232
val endpointResponse = fetchEndpointResponse()
224233
assertCommonEndpointResponseProperties(endpointResponse)
225234
assert(null == endpointResponse.user!!.userAttributes)

aws-analytics-pinpoint/src/androidTest/java/com/amplifyframework/analytics/pinpoint/PinpointAnalyticsInstrumentationTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import com.amplifyframework.hub.HubEvent
3636
import com.amplifyframework.logging.AndroidLoggingPlugin
3737
import com.amplifyframework.logging.LogLevel
3838
import com.amplifyframework.pinpoint.core.endpointProfile.EndpointProfile
39+
import com.amplifyframework.testutils.DeviceFarmTestBase
3940
import com.amplifyframework.testutils.HubAccumulator
4041
import com.amplifyframework.testutils.Resources
4142
import com.amplifyframework.testutils.Sleep
@@ -49,7 +50,7 @@ import org.junit.Before
4950
import org.junit.BeforeClass
5051
import org.junit.Test
5152

52-
class PinpointAnalyticsInstrumentationTest {
53+
class PinpointAnalyticsInstrumentationTest : DeviceFarmTestBase() {
5354
@Before
5455
fun flushEvents() {
5556
val context = ApplicationProvider.getApplicationContext<Context>()

aws-auth-cognito/src/androidTest/java/com/amplifyframework/auth/cognito/AuthCanaryTest.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import com.amplifyframework.auth.options.AuthSignUpOptions
3737
import com.amplifyframework.core.Amplify
3838
import com.amplifyframework.core.AmplifyConfiguration
3939
import com.amplifyframework.core.configuration.AmplifyOutputs
40-
import com.amplifyframework.testutils.rules.CanaryTestRule
40+
import com.amplifyframework.testutils.DeviceFarmTestBase
4141
import com.amplifyframework.testutils.sync.SynchronousApi
4242
import com.amplifyframework.testutils.sync.SynchronousAuth
4343
import io.kotest.assertions.throwables.shouldThrow
@@ -51,10 +51,9 @@ import org.junit.After
5151
import org.junit.Assert.fail
5252
import org.junit.Before
5353
import org.junit.BeforeClass
54-
import org.junit.Rule
5554
import org.junit.Test
5655

57-
class AuthCanaryTest {
56+
class AuthCanaryTest : DeviceFarmTestBase() {
5857
companion object {
5958
private const val TIMEOUT_MS = 20L * 1000
6059
private val TAG = AuthCanaryTest::class.simpleName
@@ -91,9 +90,6 @@ class AuthCanaryTest {
9190
}
9291
}
9392

94-
@get:Rule
95-
val testRule = CanaryTestRule()
96-
9793
private lateinit var username: String
9894
private lateinit var password: String
9995
private lateinit var tempUsername: String

aws-core/src/main/java/com/amplifyframework/auth/CognitoCredentialsProvider.kt

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import aws.smithy.kotlin.runtime.auth.awscredentials.Credentials
1919
import aws.smithy.kotlin.runtime.collections.Attributes
2020
import com.amplifyframework.AmplifyException
2121
import com.amplifyframework.annotations.InternalAmplifyApi
22+
import com.amplifyframework.auth.result.AuthSessionResult
2223
import com.amplifyframework.core.Amplify
2324
import com.amplifyframework.core.Consumer
2425
import kotlin.coroutines.resume
@@ -63,15 +64,22 @@ open class CognitoCredentialsProvider @InternalAmplifyApi constructor(
6364
override suspend fun getIdentityId(): String = suspendCoroutine { continuation ->
6465
authCategory.fetchAuthSession(
6566
{ authSession ->
66-
authSession.toAWSAuthSession()?.identityIdResult?.value?.let {
67-
continuation.resume(it)
68-
} ?: continuation.resumeWithException(
69-
AuthException(
70-
"Failed to get identity ID. " +
71-
"Check if you are signed in and configured identity pools correctly.",
72-
AmplifyException.TODO_RECOVERY_SUGGESTION
67+
val awsSession = authSession.toAWSAuthSession()
68+
69+
if (awsSession == null) {
70+
continuation.resumeWithException(
71+
AuthException(
72+
"Auth Session is not an AWS session",
73+
AmplifyException.REPORT_BUG_TO_AWS_SUGGESTION
74+
)
7375
)
74-
)
76+
} else {
77+
val result = awsSession.identityIdResult
78+
when (result.type) {
79+
AuthSessionResult.Type.SUCCESS -> continuation.resume(result.value!!)
80+
AuthSessionResult.Type.FAILURE -> continuation.resumeWithException(result.error!!)
81+
}
82+
}
7583
},
7684
{
7785
continuation.resumeWithException(it)

aws-datastore/src/androidTest/java/com/amplifyframework/datastore/DatastoreCanaryTest.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,27 @@ import com.amplifyframework.hub.HubChannel
2222
import com.amplifyframework.testmodels.commentsblog.AmplifyModelProvider
2323
import com.amplifyframework.testmodels.commentsblog.Post
2424
import com.amplifyframework.testmodels.commentsblog.PostStatus
25+
import com.amplifyframework.testutils.DeviceFarmTestBase
2526
import com.amplifyframework.testutils.HubAccumulator
26-
import com.amplifyframework.testutils.rules.CanaryTestRule
2727
import com.amplifyframework.testutils.sync.SynchronousDataStore
28+
import io.reactivex.rxjava3.plugins.RxJavaPlugins
2829
import java.util.UUID
2930
import java.util.concurrent.TimeUnit
3031
import org.junit.After
3132
import org.junit.BeforeClass
32-
import org.junit.Rule
3333
import org.junit.Test
3434

35-
class DatastoreCanaryTest {
35+
class DatastoreCanaryTest : DeviceFarmTestBase() {
3636
companion object {
3737
private const val TIMEOUT_S = 20L
3838
private val TAG = DatastoreCanaryTest::class.simpleName
3939

4040
@BeforeClass
4141
@JvmStatic
4242
fun setup() {
43+
RxJavaPlugins.setErrorHandler { e ->
44+
Log.w(TAG, "RxJava undeliverable exception (suppressed)", e)
45+
}
4346
try {
4447
Amplify.addPlugin(
4548
AWSDataStorePlugin.builder()
@@ -53,9 +56,6 @@ class DatastoreCanaryTest {
5356
}
5457
}
5558

56-
@get:Rule
57-
val testRule = CanaryTestRule()
58-
5959
val syncDatastore = SynchronousDataStore.delegatingTo(Amplify.DataStore)
6060

6161
@After

aws-geo-location/src/androidTest/java/com/amplifyframework/geo/location/GeoCanaryTest.kt

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,21 @@ import com.amplifyframework.core.Amplify
2323
import com.amplifyframework.core.configuration.AmplifyOutputs
2424
import com.amplifyframework.geo.location.test.R
2525
import com.amplifyframework.geo.models.Coordinates
26-
import com.amplifyframework.testutils.rules.CanaryTestRule
26+
import com.amplifyframework.testutils.DeviceFarmTestBase
2727
import com.amplifyframework.testutils.sync.SynchronousAuth
2828
import com.amplifyframework.testutils.sync.SynchronousGeo
29+
import java.util.concurrent.TimeUnit
2930
import org.junit.After
3031
import org.junit.BeforeClass
31-
import org.junit.Rule
3232
import org.junit.Test
3333

34-
class GeoCanaryTest {
34+
class GeoCanaryTest : DeviceFarmTestBase() {
3535
companion object {
36-
private const val TIMEOUT_S = 20L
3736
private val TAG = GeoCanaryTest::class.simpleName
3837

3938
@BeforeClass
4039
@JvmStatic
41-
fun setup() {
40+
fun setupClass() {
4241
try {
4342
Amplify.addPlugin(AWSCognitoAuthPlugin())
4443
Amplify.addPlugin(AWSLocationGeoPlugin())
@@ -49,10 +48,7 @@ class GeoCanaryTest {
4948
}
5049
}
5150

52-
@get:Rule
53-
val testRule = CanaryTestRule()
54-
55-
private val syncAuth = SynchronousAuth.delegatingToAmplify()
51+
private val syncAuth = SynchronousAuth.delegatingToAmplify(TimeUnit.SECONDS.toMillis(20))
5652
private val syncGeo = SynchronousGeo.delegatingToAmplify()
5753

5854
@After

aws-kinesis/src/androidTest/java/com/amplifyframework/kinesis/KinesisDataStreamsInstrumentationTest.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,10 @@ class KinesisDataStreamsInstrumentationTest {
106106
kinesis = AmplifyKinesisClient(
107107
context = context,
108108
region = REGION,
109-
credentialsProvider = credentialsProvider
109+
credentialsProvider = credentialsProvider,
110+
options = AmplifyKinesisClientOptions {
111+
flushStrategy = FlushStrategy.None // Don't auto-flush as it may impact other tests
112+
}
110113
)
111114
// Clear any leftover records from previous test runs
112115
runBlocking { kinesis.clearCache() }

aws-predictions/src/androidTest/java/com/amplifyframework/predictions/aws/PredictionsCanaryTest.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,12 @@ import com.amplifyframework.predictions.result.IdentifyEntitiesResult
2929
import com.amplifyframework.predictions.result.IdentifyLabelsResult
3030
import com.amplifyframework.predictions.result.IdentifyTextResult
3131
import com.amplifyframework.testutils.Assets
32-
import com.amplifyframework.testutils.rules.CanaryTestRule
32+
import com.amplifyframework.testutils.DeviceFarmTestBase
3333
import com.amplifyframework.testutils.sync.SynchronousPredictions
3434
import org.junit.BeforeClass
35-
import org.junit.Rule
3635
import org.junit.Test
3736

38-
class PredictionsCanaryTest {
37+
class PredictionsCanaryTest : DeviceFarmTestBase() {
3938
companion object {
4039
private const val TIMEOUT_S = 20L
4140
private val TAG = PredictionsCanaryTest::class.simpleName
@@ -53,9 +52,6 @@ class PredictionsCanaryTest {
5352
}
5453
}
5554

56-
@get:Rule
57-
val testRule = CanaryTestRule()
58-
5955
val syncPredictions = SynchronousPredictions.delegatingTo(Amplify.Predictions)
6056

6157
@Test

aws-storage-s3/src/androidTest/java/com/amplifyframework/storage/s3/StorageCanaryTest.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import com.amplifyframework.storage.options.StorageRemoveOptions
2929
import com.amplifyframework.storage.options.StorageUploadFileOptions
3030
import com.amplifyframework.storage.options.StorageUploadInputStreamOptions
3131
import com.amplifyframework.storage.s3.test.R
32-
import com.amplifyframework.testutils.rules.CanaryTestRule
32+
import com.amplifyframework.testutils.DeviceFarmTestBase
3333
import com.amplifyframework.testutils.sync.SynchronousStorage
3434
import java.io.File
3535
import java.io.FileInputStream
@@ -38,10 +38,9 @@ import java.util.UUID
3838
import java.util.concurrent.CompletableFuture
3939
import java.util.concurrent.TimeUnit
4040
import org.junit.BeforeClass
41-
import org.junit.Rule
4241
import org.junit.Test
4342

44-
class StorageCanaryTest {
43+
class StorageCanaryTest : DeviceFarmTestBase() {
4544
companion object {
4645
private const val TIMEOUT_S = 20L
4746
private val TAG = StorageCanaryTest::class.simpleName
@@ -61,9 +60,6 @@ class StorageCanaryTest {
6160
}
6261
}
6362

64-
@get:Rule
65-
val testRule = CanaryTestRule()
66-
6763
private val syncStorage = SynchronousStorage.delegatingToAmplify()
6864

6965
@Test

0 commit comments

Comments
 (0)