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