blob: 871112ba97b7b9a7f27e44dc3f6be73b434677e2 [file] [log] [blame]
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.tools.device.traces.io
import android.annotation.SuppressLint
import android.tools.InitRule
import android.tools.TEST_SCENARIO
import android.tools.TestTraces
import android.tools.assertExceptionMessage
import android.tools.assertThrows
import android.tools.common.CrossPlatform
import android.tools.common.ScenarioBuilder
import android.tools.common.io.RunStatus
import android.tools.common.io.TraceType
import android.tools.device.traces.DEFAULT_TRACE_CONFIG
import android.tools.device.traces.deleteIfExists
import android.tools.device.traces.getDefaultFlickerOutputDir
import android.tools.newTestResultWriter
import android.tools.outputFileName
import com.google.common.truth.Truth
import java.io.File
import org.junit.ClassRule
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runners.MethodSorters
/** Tests for [ResultWriter] */
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@SuppressLint("VisibleForTests")
class ResultWriterTest {
@Test
fun cannotWriteFileWithoutScenario() {
val exception =
assertThrows<IllegalArgumentException> {
val writer =
newTestResultWriter().forScenario(ScenarioBuilder().createEmptyScenario())
writer.write()
}
assertExceptionMessage(exception, "Scenario shouldn't be empty")
}
@Test
fun writesEmptyFile() {
outputFileName(RunStatus.RUN_EXECUTED).deleteIfExists()
val writer = newTestResultWriter()
val result = writer.write()
val path = result.artifact
Truth.assertWithMessage("File exists").that(path.exists()).isTrue()
Truth.assertWithMessage("Transition start time")
.that(result.transitionTimeRange.start)
.isEqualTo(CrossPlatform.timestamp.min())
Truth.assertWithMessage("Transition end time")
.that(result.transitionTimeRange.end)
.isEqualTo(CrossPlatform.timestamp.max())
val reader = ResultReader(result, DEFAULT_TRACE_CONFIG)
Truth.assertWithMessage("File count").that(reader.countFiles()).isEqualTo(0)
}
@Test
fun writesUndefinedFile() {
outputFileName(RunStatus.RUN_EXECUTED).deleteIfExists()
val writer =
ResultWriter().forScenario(TEST_SCENARIO).withOutputDir(getDefaultFlickerOutputDir())
val result = writer.write()
val path = result.artifact
validateFileName(path, RunStatus.UNDEFINED)
}
@Test
fun writesRunCompleteFile() {
outputFileName(RunStatus.RUN_EXECUTED).deleteIfExists()
val writer = newTestResultWriter().setRunComplete()
val result = writer.write()
val path = result.artifact
validateFileName(path, RunStatus.RUN_EXECUTED)
}
@Test
fun writesRunFailureFile() {
outputFileName(RunStatus.RUN_FAILED).deleteIfExists()
val writer = newTestResultWriter().setRunFailed(EXPECTED_FAILURE)
val result = writer.write()
val path = result.artifact
validateFileName(path, RunStatus.RUN_FAILED)
Truth.assertWithMessage("Expected assertion")
.that(result.executionError)
.isEqualTo(EXPECTED_FAILURE)
}
@Test
fun writesTransitionTime() {
val writer =
newTestResultWriter()
.setTransitionStartTime(TestTraces.TIME_5)
.setTransitionEndTime(TestTraces.TIME_10)
val result = writer.write()
Truth.assertWithMessage("Transition start time")
.that(result.transitionTimeRange.start)
.isEqualTo(TestTraces.TIME_5)
Truth.assertWithMessage("Transition end time")
.that(result.transitionTimeRange.end)
.isEqualTo(TestTraces.TIME_10)
}
@Test
fun writeWMTrace() {
val writer = newTestResultWriter().addTraceResult(TraceType.WM, TestTraces.WMTrace.FILE)
val result = writer.write()
val reader = ResultReader(result, DEFAULT_TRACE_CONFIG)
Truth.assertWithMessage("File count").that(reader.countFiles()).isEqualTo(1)
Truth.assertWithMessage("Has file with type")
.that(reader.hasTraceFile(TraceType.WM))
.isTrue()
}
@Test
fun writeLayersTrace() {
val writer = newTestResultWriter().addTraceResult(TraceType.SF, TestTraces.LayerTrace.FILE)
val result = writer.write()
val reader = ResultReader(result, DEFAULT_TRACE_CONFIG)
Truth.assertWithMessage("File count").that(reader.countFiles()).isEqualTo(1)
Truth.assertWithMessage("Has file with type")
.that(reader.hasTraceFile(TraceType.SF))
.isTrue()
}
@Test
fun writeTransactionTrace() {
val writer =
newTestResultWriter()
.addTraceResult(TraceType.TRANSACTION, TestTraces.TransactionTrace.FILE)
val result = writer.write()
val reader = ResultReader(result, DEFAULT_TRACE_CONFIG)
Truth.assertWithMessage("File count").that(reader.countFiles()).isEqualTo(1)
Truth.assertWithMessage("Has file with type")
.that(reader.hasTraceFile(TraceType.TRANSACTION))
.isTrue()
}
@Test
fun writeTransitionTrace() {
val writer =
newTestResultWriter()
.addTraceResult(TraceType.TRANSITION, TestTraces.TransitionTrace.FILE)
val result = writer.write()
val reader = ResultReader(result, DEFAULT_TRACE_CONFIG)
Truth.assertWithMessage("File count").that(reader.countFiles()).isEqualTo(1)
Truth.assertWithMessage("Has file with type")
.that(reader.hasTraceFile(TraceType.TRANSITION))
.isTrue()
}
@Test
fun writeAllTraces() {
val writer =
newTestResultWriter()
.addTraceResult(TraceType.WM, TestTraces.WMTrace.FILE)
.addTraceResult(TraceType.SF, TestTraces.LayerTrace.FILE)
.addTraceResult(TraceType.TRANSITION, TestTraces.TransactionTrace.FILE)
.addTraceResult(TraceType.TRANSACTION, TestTraces.TransitionTrace.FILE)
val result = writer.write()
val reader = ResultReader(result, DEFAULT_TRACE_CONFIG)
Truth.assertWithMessage("File count").that(reader.countFiles()).isEqualTo(4)
Truth.assertWithMessage("Has file with type")
.that(reader.hasTraceFile(TraceType.WM))
.isTrue()
Truth.assertWithMessage("Has file with type")
.that(reader.hasTraceFile(TraceType.WM))
.isTrue()
Truth.assertWithMessage("Has file with type")
.that(reader.hasTraceFile(TraceType.TRANSITION))
.isTrue()
Truth.assertWithMessage("Has file with type")
.that(reader.hasTraceFile(TraceType.TRANSACTION))
.isTrue()
}
companion object {
private val EXPECTED_FAILURE = IllegalArgumentException("Expected test exception")
private fun validateFileName(filePath: File, status: RunStatus) {
Truth.assertWithMessage("File name contains run status")
.that(filePath.name)
.contains(status.prefix)
}
@ClassRule @JvmField val initRule = InitRule()
}
}