xref: /aosp_15_r20/platform_testing/libraries/flicker/utils/test/src/android/tools/traces/events/CujTraceTest.kt (revision dd0948b35e70be4c0246aabd6c72554a5eb8b22a)
1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.tools.traces.events
18 
19 import android.tools.Timestamps
20 import android.tools.testutils.CleanFlickerEnvironmentRule
21 import com.google.common.truth.Truth
22 import org.junit.ClassRule
23 import org.junit.Test
24 
25 /** Tests for [CujTrace]. Run with `atest FlickerLibTest:CujTraceTest` */
26 class CujTraceTest {
27     @Test
canCreateFromListOfCujEventsnull28     fun canCreateFromListOfCujEvents() {
29         val trace =
30             CujTrace.from(
31                 listOf(
32                     createCujEvent(
33                         1,
34                         CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL,
35                         CujEvent.JANK_CUJ_BEGIN_TAG,
36                     ),
37                     createCujEvent(
38                         2,
39                         CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL,
40                         CujEvent.JANK_CUJ_END_TAG,
41                     ),
42                 )
43             )
44 
45         Truth.assertThat(trace.entries).hasSize(1)
46         Truth.assertThat(trace.entries.first().cuj).isEqualTo(CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL)
47         Truth.assertThat(trace.entries.first().startTimestamp.unixNanos).isEqualTo(1)
48         Truth.assertThat(trace.entries.first().endTimestamp.unixNanos).isEqualTo(2)
49         Truth.assertThat(trace.entries.first().canceled).isFalse()
50     }
51 
52     @Test
canCreateFromListOfCujEventsWithTagsnull53     fun canCreateFromListOfCujEventsWithTags() {
54         val trace =
55             CujTrace.from(
56                 listOf(
57                     createCujEvent(
58                         1,
59                         CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL,
60                         CujEvent.JANK_CUJ_BEGIN_TAG,
61                         tag = "MySubType",
62                     ),
63                     createCujEvent(
64                         2,
65                         CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL,
66                         CujEvent.JANK_CUJ_END_TAG,
67                     ),
68                 )
69             )
70 
71         Truth.assertThat(trace.entries).hasSize(1)
72         Truth.assertThat(trace.entries.first().cuj).isEqualTo(CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL)
73         Truth.assertThat(trace.entries.first().tag).isEqualTo("MySubType")
74         Truth.assertThat(trace.entries.first().startTimestamp.unixNanos).isEqualTo(1)
75         Truth.assertThat(trace.entries.first().endTimestamp.unixNanos).isEqualTo(2)
76         Truth.assertThat(trace.entries.first().canceled).isFalse()
77     }
78 
79     @Test
canCreateCanceledCujsFromListOfCujEventsnull80     fun canCreateCanceledCujsFromListOfCujEvents() {
81         val trace =
82             CujTrace.from(
83                 listOf(
84                     createCujEvent(
85                         1,
86                         CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL,
87                         CujEvent.JANK_CUJ_BEGIN_TAG,
88                     ),
89                     createCujEvent(
90                         2,
91                         CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL,
92                         CujEvent.JANK_CUJ_CANCEL_TAG,
93                     ),
94                 )
95             )
96 
97         Truth.assertThat(trace.entries).hasSize(1)
98         Truth.assertThat(trace.entries.first().cuj).isEqualTo(CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL)
99         Truth.assertThat(trace.entries.first().startTimestamp.unixNanos).isEqualTo(1)
100         Truth.assertThat(trace.entries.first().endTimestamp.unixNanos).isEqualTo(2)
101         Truth.assertThat(trace.entries.first().canceled).isTrue()
102     }
103 
104     @Test
canHandleIncompleteCujsnull105     fun canHandleIncompleteCujs() {
106         val trace =
107             CujTrace.from(
108                 listOf(
109                     createCujEvent(
110                         1,
111                         CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL,
112                         CujEvent.JANK_CUJ_CANCEL_TAG,
113                     ),
114                     createCujEvent(
115                         2,
116                         CujType.CUJ_BIOMETRIC_PROMPT_TRANSITION,
117                         CujEvent.JANK_CUJ_END_TAG,
118                     ),
119                     createCujEvent(
120                         3,
121                         CujType.CUJ_LAUNCHER_APP_CLOSE_TO_HOME,
122                         CujEvent.JANK_CUJ_BEGIN_TAG,
123                     ),
124                 )
125             )
126 
127         Truth.assertThat(trace.entries).isEmpty()
128     }
129 
130     @Test
canHandleOutOfOrderEntriesnull131     fun canHandleOutOfOrderEntries() {
132         val trace =
133             CujTrace.from(
134                 listOf(
135                     createCujEvent(
136                         2,
137                         CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL,
138                         CujEvent.JANK_CUJ_END_TAG,
139                     ),
140                     createCujEvent(
141                         1,
142                         CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL,
143                         CujEvent.JANK_CUJ_BEGIN_TAG,
144                     ),
145                 )
146             )
147 
148         Truth.assertThat(trace.entries).hasSize(1)
149         Truth.assertThat(trace.entries.first().cuj).isEqualTo(CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL)
150         Truth.assertThat(trace.entries.first().startTimestamp.unixNanos).isEqualTo(1)
151         Truth.assertThat(trace.entries.first().endTimestamp.unixNanos).isEqualTo(2)
152         Truth.assertThat(trace.entries.first().canceled).isFalse()
153     }
154 
155     @Test
canHandleMissingStartAndEndsnull156     fun canHandleMissingStartAndEnds() {
157         val trace =
158             CujTrace.from(
159                 listOf(
160                     createCujEvent(
161                         1,
162                         CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL,
163                         CujEvent.JANK_CUJ_END_TAG,
164                     ),
165                     createCujEvent(
166                         2,
167                         CujType.CUJ_LAUNCHER_ALL_APPS_SCROLL,
168                         CujEvent.JANK_CUJ_BEGIN_TAG,
169                     ),
170                 )
171             )
172 
173         Truth.assertThat(trace.entries).isEmpty()
174     }
175 
176     @Test
canHandleUnknownTypenull177     fun canHandleUnknownType() {
178         val UNKNOWN_TAG_ID = 8888
179 
180         val trace =
181             CujTrace.from(
182                 listOf(
183                     createCujEvent(1, UnknownCuj(UNKNOWN_TAG_ID), CujEvent.JANK_CUJ_BEGIN_TAG),
184                     createCujEvent(2, UnknownCuj(UNKNOWN_TAG_ID), CujEvent.JANK_CUJ_END_TAG),
185                 )
186             )
187 
188         Truth.assertThat(trace.entries).hasSize(1)
189         Truth.assertThat(trace.entries.first().cuj.id).isEqualTo(UNKNOWN_TAG_ID)
190     }
191 
createCujEventnull192     private fun createCujEvent(
193         timestamp: Long,
194         cuj: ICujType,
195         type: String,
196         tag: String? = null,
197     ): CujEvent {
198         return CujEvent(Timestamps.from(unixNanos = timestamp), cuj, 0, "root", 0, type, tag)
199     }
200 
201     companion object {
202         @ClassRule @JvmField val ENV_CLEANUP = CleanFlickerEnvironmentRule()
203     }
204 }
205