blob: b4c97e4fc4f248b20bca16f667ab6442f10c05ca [file] [log] [blame]
/*
* Copyright (C) 2018 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 com.android.server.wm.flicker;
import static com.google.common.truth.Truth.assertAbout;
import static com.google.common.truth.Truth.assertWithMessage;
import android.annotation.Nullable;
import android.graphics.Rect;
import com.android.server.wm.flicker.Assertions.Result;
import com.android.server.wm.flicker.LayersTrace.Entry;
import com.android.server.wm.flicker.TransitionRunner.TransitionResult;
import com.google.common.truth.FailureStrategy;
import com.google.common.truth.Subject;
import com.google.common.truth.SubjectFactory;
import java.util.List;
import java.util.stream.Collectors;
/**
* Truth subject for {@link LayersTrace} objects.
*/
public class LayersTraceSubject extends Subject<LayersTraceSubject, LayersTrace> {
// Boiler-plate Subject.Factory for LayersTraceSubject
private static final SubjectFactory<LayersTraceSubject, LayersTrace> FACTORY =
new SubjectFactory<LayersTraceSubject, LayersTrace>() {
@Override
public LayersTraceSubject getSubject(
FailureStrategy fs, @Nullable LayersTrace target) {
return new LayersTraceSubject(fs, target);
}
};
private AssertionsChecker<Entry> mChecker = new AssertionsChecker<>();
private LayersTraceSubject(FailureStrategy fs, @Nullable LayersTrace subject) {
super(fs, subject);
}
// User-defined entry point
public static LayersTraceSubject assertThat(@Nullable LayersTrace entry) {
return assertAbout(FACTORY).that(entry);
}
// User-defined entry point
public static LayersTraceSubject assertThat(@Nullable TransitionResult result) {
LayersTrace entries = LayersTrace.parseFrom(result.getLayersTrace(),
result.getLayersTracePath());
return assertWithMessage(result.toString()).about(FACTORY).that(entries);
}
// Static method for getting the subject factory (for use with assertAbout())
public static SubjectFactory<LayersTraceSubject, LayersTrace> entries() {
return FACTORY;
}
public void forAllEntries() {
test();
}
public void forRange(long startTime, long endTime) {
mChecker.filterByRange(startTime, endTime);
test();
}
public LayersTraceSubject then() {
mChecker.checkChangingAssertions();
return this;
}
public void inTheBeginning() {
if (getSubject().getEntries().isEmpty()) {
fail("No entries found.");
}
mChecker.checkFirstEntry();
test();
}
public void atTheEnd() {
if (getSubject().getEntries().isEmpty()) {
fail("No entries found.");
}
mChecker.checkLastEntry();
test();
}
private void test() {
List<Result> failures = mChecker.test(getSubject().getEntries());
if (!failures.isEmpty()) {
String failureLogs = failures.stream().map(Result::toString)
.collect(Collectors.joining("\n"));
String tracePath = "";
if (getSubject().getSource().isPresent()) {
tracePath = "\nLayers Trace can be found in: "
+ getSubject().getSource().get().toAbsolutePath() + "\n";
}
fail(tracePath + failureLogs);
}
}
public LayersTraceSubject coversRegion(Rect rect) {
mChecker.add(entry -> entry.coversRegion(rect),
"coversRegion(" + rect + ")");
return this;
}
public LayersTraceSubject hasVisibleRegion(String layerName, Rect size) {
mChecker.add(entry -> entry.hasVisibleRegion(layerName, size),
"hasVisibleRegion(" + layerName + size + ")");
return this;
}
public LayersTraceSubject showsLayer(String layerName) {
mChecker.add(entry -> entry.isVisible(layerName),
"showsLayer(" + layerName + ")");
return this;
}
public LayersTraceSubject hidesLayer(String layerName) {
mChecker.add(entry -> entry.isVisible(layerName).negate(),
"hidesLayer(" + layerName + ")");
return this;
}
}