blob: d42061808b9f077f11cac59f675dc93a00feaab4 [file] [log] [blame]
// Copyright (c) 2019, 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.naming;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import com.android.tools.r8.Diagnostic;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestDiagnosticMessagesImpl;
import com.android.tools.r8.position.TextPosition;
import com.android.tools.r8.utils.AbortException;
import com.android.tools.r8.utils.FileUtils;
import com.android.tools.r8.utils.Reporter;
import java.io.IOException;
import java.nio.file.Path;
import org.junit.Ignore;
import org.junit.Test;
public class SeedMapperTests extends TestBase {
private Path getApplyMappingFile(String... pgMap) throws IOException {
Path mapPath = temp.newFile().toPath();
FileUtils.writeTextFile(mapPath, pgMap);
return mapPath;
}
@Test
public void testNoDuplicates() throws IOException {
Path applyMappingFile =
getApplyMappingFile(
"A.B.C -> a:",
" int aaaa(B) -> a",
" int bbbb(B) -> b",
" void cccc() -> a",
" B foo -> a",
"A.B.D -> b:",
" int aaaa(B) -> a");
TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
Reporter reporter = new Reporter(testDiagnosticMessages);
SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
testDiagnosticMessages.assertNoMessages();
}
@Test
public void testDuplicateSourceClasses() throws IOException {
Path applyMappingFile = getApplyMappingFile("A.B.C -> a:", "A.B.C -> b:");
TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
Reporter reporter = new Reporter(testDiagnosticMessages);
try {
SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
fail("Should have thrown an error");
} catch (RuntimeException e) {
assertEquals(1, testDiagnosticMessages.getErrors().size());
Diagnostic diagnostic = testDiagnosticMessages.getErrors().get(0);
assertEquals(
String.format(ProguardMapError.DUPLICATE_SOURCE_MESSAGE, "A.B.C"),
diagnostic.getDiagnosticMessage());
assertEquals(2, ((TextPosition) diagnostic.getPosition()).getLine());
}
}
@Test
public void testDuplicateSourceMethods() throws IOException {
Path applyMappingFile =
getApplyMappingFile(
"A.B.C -> a:",
" int aaaa(B) -> a",
" int aaaa(B) -> a",
"A.B.D -> b:");
TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
Reporter reporter = new Reporter(testDiagnosticMessages);
try {
SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
fail("Should have thrown an error");
} catch (RuntimeException e) {
assertEquals(1, testDiagnosticMessages.getErrors().size());
Diagnostic diagnostic = testDiagnosticMessages.getErrors().get(0);
assertEquals(
String.format(ProguardMapError.DUPLICATE_SOURCE_MESSAGE, "int aaaa(B)"),
diagnostic.getDiagnosticMessage());
assertEquals(3, ((TextPosition) diagnostic.getPosition()).getLine());
}
}
@Test
public void testDuplicateSourceFields() throws IOException {
Path applyMappingFile =
getApplyMappingFile(
"A.B.C -> a:",
" int aaaa -> a",
" int aaaa -> a",
"A.B.D -> b:");
TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
Reporter reporter = new Reporter(testDiagnosticMessages);
try {
SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
fail("Should have thrown an error");
} catch (RuntimeException e) {
assertEquals(1, testDiagnosticMessages.getErrors().size());
Diagnostic diagnostic = testDiagnosticMessages.getErrors().get(0);
assertEquals(
String.format(ProguardMapError.DUPLICATE_SOURCE_MESSAGE, "int aaaa"),
diagnostic.getDiagnosticMessage());
assertEquals(3, ((TextPosition) diagnostic.getPosition()).getLine());
}
}
@Test
public void testDuplicateClassTargets() throws IOException {
Path applyMappingFile = getApplyMappingFile("A.B.C -> a:", "A.B.D -> a:");
TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
Reporter reporter = new Reporter(testDiagnosticMessages);
try {
SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
fail("Should have thrown an error");
} catch (RuntimeException e) {
assertEquals(1, testDiagnosticMessages.getErrors().size());
Diagnostic diagnostic = testDiagnosticMessages.getErrors().get(0);
assertEquals(
String.format(ProguardMapError.DUPLICATE_TARGET_MESSAGE, "A.B.D", "A.B.C", "a"),
diagnostic.getDiagnosticMessage());
assertEquals(2, ((TextPosition) diagnostic.getPosition()).getLine());
}
}
@Test
public void testSameNameMethodTargets() throws IOException {
Path applyMappingFile =
getApplyMappingFile(
"A.B.C -> A:",
" int foo(A) -> a",
" int bar(B) -> a",
" int baz(A,B) -> a",
"A.B.D -> b:");
TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
Reporter reporter = new Reporter(testDiagnosticMessages);
SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
testDiagnosticMessages.assertNoMessages();
}
@Test
@Ignore("b/136697829")
public void testDuplicateMethodTargets() throws IOException {
Path applyMappingFile =
getApplyMappingFile(
"A.B.C -> a:",
" int foo(A) -> a",
" int bar(A) -> a",
"A.B.D -> b:");
TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
Reporter reporter = new Reporter(testDiagnosticMessages);
try {
SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
fail("Should have thrown an error");
} catch (AbortException e) {
assertEquals(1, testDiagnosticMessages.getErrors().size());
Diagnostic diagnostic = testDiagnosticMessages.getErrors().get(0);
assertEquals(
String.format(ProguardMapError.DUPLICATE_TARGET_MESSAGE, "int bar(A)", "int foo(A)", "a"),
diagnostic.getDiagnosticMessage());
assertEquals(2, ((TextPosition) diagnostic.getPosition()).getLine());
}
}
@Test
public void testInliningFrames() throws IOException {
Path applyMappingFile =
getApplyMappingFile(
"A.B.C -> a:",
" int foo(A) -> a",
" 1:2:int bar(A):3:4 -> a",
" 1:2:int baz(B):3 -> a");
TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
Reporter reporter = new Reporter(testDiagnosticMessages);
SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
}
@Test
public void testDuplicateInliningFrames() throws IOException {
Path applyMappingFile =
getApplyMappingFile(
"A.B.C -> a:",
" int foo(Z) -> a",
" 1:1:int qux(A):3:3 -> a",
" 1:1:int bar(A):3 -> a",
" 2:2:int qux(A):3:3 -> a",
" 2:2:int bar(A):4 -> a",
" 3:3:int bar(A):5:5 -> a",
" int qux(C) -> a");
TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
Reporter reporter = new Reporter(testDiagnosticMessages);
SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
}
@Test
public void testMultipleInitRanges() throws IOException {
Path applyMappingFile =
getApplyMappingFile(
"com.android.tools.r8.ArchiveClassFileProvider ->"
+ " com.android.tools.r8.ArchiveClassFileProvider:",
" 1:1:void <init>(java.nio.file.Path):50:50 -> <init>",
" 2:2:void <init>(java.nio.file.Path):59:59 -> <init>",
" boolean lambda$new$0(java.lang.String) -> a");
TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
Reporter reporter = new Reporter(testDiagnosticMessages);
SeedMapper.seedMapperFromFile(reporter, applyMappingFile);
}
}