Add a YouTube 15.08 test
Change-Id: Icbafae7f9e53ff466e07689f77495bddc25ad7cf
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index b0adc79..2086f5e 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -894,7 +894,9 @@
new StringDiagnostic(
"Item " + definition.toSourceString() + " was not discarded.\n" + baos.toString()));
}
- throw new CompilationError("Discard checks failed.");
+ if (!options.testing.allowCheckDiscardedErrors) {
+ throw new CompilationError("Discard checks failed.");
+ }
}
private void computeKotlinInfoForProgramClasses(
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 232b54a..7ad79d2 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1019,6 +1019,7 @@
*/
public boolean addCallEdgesForLibraryInvokes = false;
+ public boolean allowCheckDiscardedErrors = false;
public boolean allowTypeErrors =
!Version.isDevelopmentVersion()
|| System.getProperty("com.android.tools.r8.allowTypeErrors") != null;
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
index 9ae6569..4f64c5b 100644
--- a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -84,6 +84,10 @@
return self();
}
+ public T allowCheckDiscardedErrors() {
+ return addOptionsModification(options -> options.testing.allowCheckDiscardedErrors = true);
+ }
+
public CR compile() throws CompilationFailedException {
AndroidAppConsumers sink = new AndroidAppConsumers();
builder.setProgramConsumer(sink.wrapProgramConsumer(programConsumer));
diff --git a/src/test/java/com/android/tools/r8/internal/YouTubeCompilationBase.java b/src/test/java/com/android/tools/r8/internal/YouTubeCompilationBase.java
index fdfad81..57f4359 100644
--- a/src/test/java/com/android/tools/r8/internal/YouTubeCompilationBase.java
+++ b/src/test/java/com/android/tools/r8/internal/YouTubeCompilationBase.java
@@ -25,7 +25,12 @@
final String base;
public YouTubeCompilationBase(int majorVersion, int minorVersion) {
- this.base = "third_party/youtube/youtube.android_" + majorVersion + "." + minorVersion + "/";
+ this.base =
+ "third_party/youtube/youtube.android_"
+ + majorVersion
+ + "."
+ + String.format("%02d", minorVersion)
+ + "/";
}
protected List<Path> getKeepRuleFiles() {
diff --git a/src/test/java/com/android/tools/r8/internal/YouTubeV1508TreeShakeJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/YouTubeV1508TreeShakeJarVerificationTest.java
new file mode 100644
index 0000000..c11989c
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/internal/YouTubeV1508TreeShakeJarVerificationTest.java
@@ -0,0 +1,106 @@
+// 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.internal;
+
+import static com.android.tools.r8.ToolHelper.isLocalDevelopment;
+import static com.android.tools.r8.ToolHelper.shouldRunSlowTests;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import com.android.tools.r8.R8TestCompileResult;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.analysis.ProtoApplicationStats;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class YouTubeV1508TreeShakeJarVerificationTest extends YouTubeCompilationBase {
+
+ private static final int MAX_SIZE = 27500000;
+
+ private final TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withNoneRuntime().build();
+ }
+
+ public YouTubeV1508TreeShakeJarVerificationTest(TestParameters parameters) {
+ super(15, 8);
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ // TODO(b/141603168): Enable this on the bots.
+ assumeTrue(isLocalDevelopment());
+ assumeTrue(shouldRunSlowTests());
+
+ LibrarySanitizer librarySanitizer =
+ new LibrarySanitizer(temp)
+ .addProgramFiles(getProgramFiles())
+ .addLibraryFiles(getLibraryFiles())
+ .sanitize()
+ .assertSanitizedProguardConfigurationIsEmpty();
+
+ R8TestCompileResult compileResult =
+ testForR8(Backend.DEX)
+ .addProgramFiles(getProgramFiles())
+ .addLibraryFiles(librarySanitizer.getSanitizedLibrary())
+ .addKeepRuleFiles(getKeepRuleFiles())
+ .addMainDexRuleFiles(getMainDexRuleFiles())
+ .addOptionsModification(
+ options -> {
+ assert !options.applyInliningToInlinee;
+ options.applyInliningToInlinee = true;
+
+ assert !options.enableFieldBitAccessAnalysis;
+ options.enableFieldBitAccessAnalysis = true;
+
+ assert !options.protoShrinking().enableGeneratedExtensionRegistryShrinking;
+ options.protoShrinking().enableGeneratedExtensionRegistryShrinking = true;
+
+ assert !options.protoShrinking().enableGeneratedMessageLiteShrinking;
+ options.protoShrinking().enableGeneratedMessageLiteShrinking = true;
+
+ assert options.protoShrinking().traverseOneOfAndRepeatedProtoFields;
+ options.protoShrinking().traverseOneOfAndRepeatedProtoFields = false;
+
+ assert !options.enableStringSwitchConversion;
+ options.enableStringSwitchConversion = true;
+ })
+ .allowCheckDiscardedErrors()
+ .allowDiagnosticMessages()
+ .allowUnusedProguardConfigurationRules()
+ .setMinApi(AndroidApiLevel.H_MR2)
+ .compile();
+
+ if (ToolHelper.isLocalDevelopment()) {
+ DexItemFactory dexItemFactory = new DexItemFactory();
+ ProtoApplicationStats original =
+ new ProtoApplicationStats(dexItemFactory, new CodeInspector(getProgramFiles()));
+ ProtoApplicationStats actual =
+ new ProtoApplicationStats(dexItemFactory, compileResult.inspector(), original);
+ ProtoApplicationStats baseline =
+ new ProtoApplicationStats(
+ dexItemFactory,
+ new CodeInspector(getReleaseApk(), getReleaseProguardMap().toString()));
+ System.out.println(actual.getStats(baseline));
+ }
+
+ int applicationSize = compileResult.app.applicationSize();
+ System.out.println(applicationSize);
+
+ assertTrue(
+ "Expected max size of " + MAX_SIZE + ", got " + applicationSize,
+ applicationSize < MAX_SIZE);
+ }
+}