Add test to ensure we handle duplicate FaaS assertions

Test: atest FlickerLibTest:FlickerServiceDecoratorTest
Bug: n/a
Change-Id: I83d98f349cd3268a50336f6a7c08a1627c3e76ea
diff --git a/libraries/flicker/test/src/android/tools/device/flicker/junit/FlickerServiceDecoratorTest.kt b/libraries/flicker/test/src/android/tools/device/flicker/junit/FlickerServiceDecoratorTest.kt
index 4f6e294..43aa843 100644
--- a/libraries/flicker/test/src/android/tools/device/flicker/junit/FlickerServiceDecoratorTest.kt
+++ b/libraries/flicker/test/src/android/tools/device/flicker/junit/FlickerServiceDecoratorTest.kt
@@ -2,13 +2,24 @@
 
 import android.app.Instrumentation
 import android.os.Bundle
+import android.tools.common.CrossPlatform
+import android.tools.common.Rotation
+import android.tools.common.flicker.AssertionInvocationGroup
 import android.tools.common.flicker.FlickerConfig
 import android.tools.common.flicker.FlickerService
+import android.tools.common.flicker.ScenarioInstance
+import android.tools.common.flicker.ScenarioInstanceImpl
 import android.tools.common.flicker.annotation.ExpectedScenarios
+import android.tools.common.flicker.assertions.FlickerTest
+import android.tools.common.flicker.assertors.AssertionTemplate
+import android.tools.common.flicker.config.FlickerConfigEntry
 import android.tools.common.flicker.config.FlickerServiceConfig
+import android.tools.common.flicker.config.ScenarioId
+import android.tools.common.flicker.extractors.ScenarioExtractor
 import android.tools.common.io.Reader
 import android.tools.utils.KotlinMockito
 import android.tools.utils.assertThrows
+import android.util.Log
 import com.google.common.truth.Truth
 import org.junit.Test
 import org.junit.runner.Description
@@ -135,4 +146,95 @@
         val exception = assertThrows<Throwable> { methodInvoker.evaluate() }
         Truth.assertThat(exception.stackTraceToString()).contains(flickerMethodComputeError.message)
     }
+
+    @Test
+    fun handleDuplicateFlickerMethods() {
+        val instrumentation = Mockito.mock(Instrumentation::class.java)
+        val testClass = Mockito.mock(TestClass::class.java)
+        val innerDecorator = Mockito.mock(IFlickerJUnitDecorator::class.java)
+        val method = Mockito.mock(FrameworkMethod::class.java)
+        val flickerService = Mockito.mock(FlickerService::class.java)
+        val mockDescription = Mockito.mock(Description::class.java)
+        val flickerConfigProviderMethods = Mockito.mock(FrameworkMethod::class.java)
+
+        Mockito.`when`(testClass.getAnnotatedMethods(ExpectedScenarios::class.java))
+            .thenReturn(listOf(method))
+        Mockito.`when`(
+                testClass.getAnnotatedMethods(
+                    android.tools.common.flicker.annotation.FlickerConfigProvider::class.java
+                )
+            )
+            .thenReturn(listOf(flickerConfigProviderMethods))
+        Mockito.`when`(flickerConfigProviderMethods.invokeExplosively(testClass))
+            .thenReturn(FlickerConfig().use(FlickerServiceConfig.DEFAULT))
+        Mockito.`when`(method.annotations).thenReturn(emptyArray())
+        Mockito.`when`(innerDecorator.getTestMethods(KotlinMockito.any(Object::class.java)))
+            .thenReturn(listOf(method))
+        Mockito.`when`(
+                innerDecorator.getChildDescription(KotlinMockito.any(FrameworkMethod::class.java))
+            )
+            .thenReturn(mockDescription)
+
+        val mockConfig =
+            FlickerConfigEntry(
+                scenarioId = ScenarioId("MY_MOCK_SCENARIO"),
+                extractor = Mockito.mock(ScenarioExtractor::class.java),
+                assertions =
+                    mapOf(
+                        object : AssertionTemplate("myMockAssertion") {
+                            override fun doEvaluate(
+                                scenarioInstance: ScenarioInstance,
+                                flicker: FlickerTest
+                            ) {
+                                flicker.assertLayers {
+                                    // Does nothing
+                                }
+                            }
+                        } to AssertionInvocationGroup.BLOCKING
+                    ),
+                enabled = true
+            )
+
+        val mockScenarioInstance1 =
+            ScenarioInstanceImpl(
+                config = mockConfig,
+                startRotation = Rotation.ROTATION_0,
+                endRotation = Rotation.ROTATION_0,
+                startTimestamp = CrossPlatform.timestamp.from(10),
+                endTimestamp = CrossPlatform.timestamp.from(20),
+                reader = Mockito.mock(Reader::class.java)
+            )
+
+        val mockScenarioInstance2 =
+            ScenarioInstanceImpl(
+                config = mockConfig,
+                startRotation = Rotation.ROTATION_0,
+                endRotation = Rotation.ROTATION_0,
+                startTimestamp = CrossPlatform.timestamp.from(10),
+                endTimestamp = CrossPlatform.timestamp.from(20),
+                reader = Mockito.mock(Reader::class.java)
+            )
+
+        Mockito.`when`(flickerService.detectScenarios(KotlinMockito.any(Reader::class.java)))
+            .thenReturn(listOf(mockScenarioInstance1, mockScenarioInstance2))
+
+        val test = Mockito.mock(Object::class.java)
+        val decorator =
+            FlickerServiceDecorator(
+                testClass = testClass,
+                paramString = null,
+                skipNonBlocking = false,
+                inner = innerDecorator,
+                instrumentation = instrumentation,
+                flickerService = flickerService
+            )
+
+        val methods = decorator.getTestMethods(test)
+
+        Truth.assertThat(methods.size).isAtLeast(2)
+        val flickerTestMethods = methods.filterIsInstance<FlickerServiceCachedTestCase>()
+        Truth.assertThat(flickerTestMethods).hasSize(2)
+        Log.d("PABLOG", "flickerTestMethods = [${flickerTestMethods.joinToString { it.name }}]")
+        Truth.assertThat(flickerTestMethods.distinctBy { it.name }).hasSize(2)
+    }
 }