blob: dcfbecae617d12160a636f07434c52ba356c03df [file] [log] [blame]
// Copyright (c) 2020, 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 org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import com.google.common.collect.ImmutableList;
import org.junit.Test;
public abstract class CommandTestBase<C extends BaseCompilerCommand> extends TestBase {
private void mapDiagnosticsMissingArguments(String... args) throws Exception {
try {
DiagnosticsChecker.checkErrorsContains(
"Missing argument(s) for --map-diagnostics", handler -> parse(handler, args));
fail("Expected failure");
} catch (CompilationFailedException e) {
// Expected.
}
}
@Test
public void mapDiagnosticsMissingArguments() throws Exception {
mapDiagnosticsMissingArguments("--map-diagnostics");
mapDiagnosticsMissingArguments("--map-diagnostics", "error");
mapDiagnosticsMissingArguments("--map-diagnostics", "warning");
mapDiagnosticsMissingArguments("--map-diagnostics", "info");
mapDiagnosticsMissingArguments("--map-diagnostics", "xxx");
}
private void mapDiagnosticsInvalidArguments(String... args) throws Exception {
try {
DiagnosticsChecker.checkErrorsContains(
"Invalid diagnostics level 'xxx'", handler -> parse(handler, args));
fail("Expected failure");
} catch (CompilationFailedException e) {
// Expected.
}
}
@Test
public void mapDiagnosticsInvalidArguments() throws Exception {
mapDiagnosticsInvalidArguments("--map-diagnostics", "error", "xxx");
mapDiagnosticsInvalidArguments("--map-diagnostics", "warning", "xxx");
mapDiagnosticsInvalidArguments("--map-diagnostics", "info", "xxx");
mapDiagnosticsInvalidArguments("--map-diagnostics", "xxx", "xxx");
mapDiagnosticsInvalidArguments("--map-diagnostics", "xxx", "error");
mapDiagnosticsInvalidArguments("--map-diagnostics", "xxx", "warning");
mapDiagnosticsInvalidArguments("--map-diagnostics", "xxx", "info");
mapDiagnosticsInvalidArguments("--debug", "--map-diagnostics", "error", "xxx", "--debug");
}
@Test
public void mapDiagnosticsInvalidArgumentsMoreErrors() throws Exception {
try {
DiagnosticsChecker.checkErrorsContains(
ImmutableList.of("Invalid diagnostics level 'xxx'", "Unknown option: --xxx"),
handler -> parse(handler, "--debug", "--map-diagnostics", "error", "xxx", "--xxx"));
fail("Expected failure");
} catch (CompilationFailedException e) {
// Expected.
}
}
@Test
public void errorsToWarnings() throws Exception {
DiagnosticsChecker.checkWarningsContains(
"Error",
handler -> {
C command = parseWithRequiredArgs(handler, "--map-diagnostics", "error", "warning");
command.getReporter().error("Error");
});
try {
DiagnosticsChecker.checkErrorsContains(
"Test diagnostic",
handler -> {
C command =
parseWithRequiredArgs(handler, "--map-diagnostics:a.b.C", "error", "warning");
command.getReporter().error(new TestDiagnostic());
try {
command.getReporter().failIfPendingErrors();
} catch (RuntimeException e) {
throw new CompilationFailedException();
}
});
fail("Failure expected");
} catch (CompilationFailedException e) {
// Expected.
}
DiagnosticsChecker.checkWarningsContains(
"Test diagnostic",
handler -> {
C command =
parseWithRequiredArgs(
handler,
"--map-diagnostics:com.android.tools.r8.TestDiagnostic",
"error",
"warning");
command.getReporter().error(new TestDiagnostic());
});
DiagnosticsChecker.checkWarningsContains(
"Test diagnostic",
handler -> {
C command =
parseWithRequiredArgs(
handler, "--map-diagnostics:TestDiagnostic", "error", "warning");
command.getReporter().error(new TestDiagnostic());
});
}
@Test
public void errorsToInfo() throws Exception {
DiagnosticsChecker.checkInfosContains(
"Error",
handler -> {
C command = parseWithRequiredArgs(handler, "--map-diagnostics", "error", "info");
command.getReporter().error("Error");
});
try {
DiagnosticsChecker.checkErrorsContains(
"Test diagnostic",
handler -> {
C command = parseWithRequiredArgs(handler, "--map-diagnostics:a.b.C", "error", "info");
command.getReporter().error(new TestDiagnostic());
try {
command.getReporter().failIfPendingErrors();
} catch (RuntimeException e) {
throw new CompilationFailedException();
}
});
fail("Failure expected");
} catch (CompilationFailedException e) {
// Expected.
}
DiagnosticsChecker.checkInfosContains(
"Test diagnostic",
handler -> {
C command =
parseWithRequiredArgs(handler, "--map-diagnostics:TestDiagnostic", "error", "info");
command.getReporter().error(new TestDiagnostic());
});
}
@Test
public void warningsToInfo() throws Exception {
DiagnosticsChecker.checkInfosContains(
"Warning",
handler -> {
C command = parseWithRequiredArgs(handler, "--map-diagnostics", "warning", "info");
command.getReporter().warning("Warning");
});
DiagnosticsChecker.checkInfosContains(
"Test diagnostic",
handler -> {
C command =
parseWithRequiredArgs(handler, "--map-diagnostics:TestDiagnostic", "warning", "info");
command.getReporter().warning(new TestDiagnostic());
});
}
@Test
public void warningsToError() throws Exception {
try {
DiagnosticsChecker.checkErrorsContains(
"Warning",
handler -> {
C command = parseWithRequiredArgs(handler, "--map-diagnostics", "warning", "error");
command.getReporter().warning("Warning");
try {
command.getReporter().failIfPendingErrors();
} catch (RuntimeException e) {
throw new CompilationFailedException();
}
});
fail("Expected failure");
} catch (CompilationFailedException e) {
// Expected.
}
try {
DiagnosticsChecker.checkErrorsContains(
"Test diagnostic",
handler -> {
C command =
parseWithRequiredArgs(
handler, "--map-diagnostics:TestDiagnostic", "warning", "error");
command.getReporter().warning(new TestDiagnostic());
try {
command.getReporter().failIfPendingErrors();
} catch (RuntimeException e) {
throw new CompilationFailedException();
}
});
fail("Expected failure");
} catch (CompilationFailedException e) {
// Expected.
}
}
@Test
public void errorsToWarningsWarningsToInfos() throws Exception {
DiagnosticsChecker.checkInfosContains(
"Error",
handler -> {
C command =
parseWithRequiredArgs(
handler,
"--map-diagnostics",
"error",
"warning",
"--map-diagnostics",
"warning",
"info");
command.getReporter().error("Error");
});
DiagnosticsChecker.checkInfosContains(
"Test diagnostic",
handler -> {
C command =
parseWithRequiredArgs(
handler,
"--map-diagnostics:TestDiagnostic",
"error",
"warning",
"--map-diagnostics",
"warning",
"info");
command.getReporter().error(new TestDiagnostic());
});
}
@Test
public void warningsToInfosErrorsToWarnings() throws Exception {
DiagnosticsChecker.checkDiagnostics(
diagnostics -> {
assertEquals(0, diagnostics.errors.size());
diagnostics.checkWarningsContains("Error");
diagnostics.checkInfosContains("Warning");
},
handler -> {
C command =
parseWithRequiredArgs(
handler,
"--map-diagnostics",
"warning",
"info",
"--map-diagnostics",
"error",
"warning");
command.getReporter().error("Error");
command.getReporter().warning("Warning");
});
DiagnosticsChecker.checkDiagnostics(
diagnostics -> {
assertEquals(0, diagnostics.errors.size());
diagnostics.checkWarningsContains("Test diagnostic");
diagnostics.checkInfosContains("Test diagnostic");
},
handler -> {
C command =
parseWithRequiredArgs(
handler,
"--map-diagnostics:TestDiagnostic",
"warning",
"info",
"--map-diagnostics:TestDiagnostic",
"error",
"warning");
command.getReporter().error(new TestDiagnostic());
command.getReporter().warning(new TestDiagnostic());
});
}
private String[] prepareArgs(String[] args) {
String[] actualTestArgs;
String[] additionalTestArgs = requiredArgsForTest();
if (additionalTestArgs.length > 0) {
actualTestArgs = new String[args.length + additionalTestArgs.length];
System.arraycopy(additionalTestArgs, 0, actualTestArgs, 0, additionalTestArgs.length);
System.arraycopy(args, 0, actualTestArgs, additionalTestArgs.length, args.length);
} else {
actualTestArgs = args;
}
return actualTestArgs;
}
private C parseWithRequiredArgs(String... args) throws CompilationFailedException {
return parse(prepareArgs(args));
}
private C parseWithRequiredArgs(DiagnosticsHandler handler, String... args)
throws CompilationFailedException {
return parse(handler, prepareArgs(args));
}
/**
* Tests in this class are executed for all of D8, R8 and L8. When testing arguments this can add
* additional required arguments to all tests
*/
abstract String[] requiredArgsForTest();
abstract C parse(String... args) throws CompilationFailedException;
abstract C parse(DiagnosticsHandler handler, String... args) throws CompilationFailedException;
}