blob: f3c624cfbd92131ef0e0f8467a48dae5fa9f4df3 [file] [log] [blame]
// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.ThrowingConsumer;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
import com.android.tools.r8.utils.codeinspector.FoundFieldSubject;
import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
import com.android.tools.r8.utils.codeinspector.Matchers;
import java.io.IOException;
import java.nio.file.Path;
import java.util.concurrent.ExecutionException;
import org.hamcrest.Matcher;
import org.hamcrest.MatcherAssert;
public class RelocatorTestCompileResult extends TestRunResult<RelocatorTestCompileResult> {
private final Path output;
public RelocatorTestCompileResult(Path output) {
this.output = output;
}
@Override
RelocatorTestCompileResult self() {
return this;
}
@Override
public RelocatorTestCompileResult assertSuccess() {
// If we produced a RelocatorTestRunResult the compilation was a success.
return self();
}
@Override
public RelocatorTestCompileResult assertStdoutMatches(Matcher<String> matcher) {
throw new Unreachable("Not implemented");
}
@Override
public RelocatorTestCompileResult assertFailure() {
throw new Unreachable("Not implemented");
}
@Override
public RelocatorTestCompileResult assertStderrMatches(Matcher<String> matcher) {
throw new Unreachable("Not implemented");
}
@Override
public <E extends Throwable> RelocatorTestCompileResult inspect(
ThrowingConsumer<CodeInspector, E> consumer) throws IOException, ExecutionException, E {
consumer.accept(new CodeInspector(output));
return self();
}
@Override
public <E extends Throwable> RelocatorTestCompileResult inspectFailure(
ThrowingConsumer<CodeInspector, E> consumer) throws IOException, E {
throw new Unreachable("NOT IMPLEMENTED");
}
@Override
public RelocatorTestCompileResult disassemble() throws IOException, ExecutionException {
throw new Unreachable("NOT IMPLEMENTED");
}
public RelocatorTestCompileResult inspectAllClassesRelocated(
Path original, String originalPrefix, String newPrefix) throws Exception {
CodeInspector originalInspector = new CodeInspector(original);
inspect(
relocatedInspector -> {
for (FoundClassSubject clazz : originalInspector.allClasses()) {
if (originalPrefix.isEmpty()
|| clazz
.getFinalName()
.startsWith(originalPrefix + DescriptorUtils.JAVA_PACKAGE_SEPARATOR)) {
String relocatedName =
newPrefix + clazz.getFinalName().substring(originalPrefix.length());
ClassSubject relocatedClass = relocatedInspector.clazz(relocatedName);
MatcherAssert.assertThat(relocatedClass, Matchers.isPresent());
}
}
});
return self();
}
public void inspectAllSignaturesNotContainingString(String originalPrefix) throws Exception {
inspect(
inspector -> {
for (FoundClassSubject clazz : inspector.allClasses()) {
MatcherAssert.assertThat(clazz.getFinalSignatureAttribute(), not(containsString(originalPrefix)));
for (FoundMethodSubject method : clazz.allMethods()) {
MatcherAssert.assertThat(
method.getJvmMethodSignatureAsString(), not(containsString(originalPrefix)));
}
for (FoundFieldSubject field : clazz.allFields()) {
MatcherAssert.assertThat(field.getJvmFieldSignatureAsString(), not(containsString(originalPrefix)));
}
}
});
}
public Path getOutput() {
return output;
}
}