diff options
Diffstat (limited to 'jack-tests/tests/com/android/jack/shrob/ShrinkTests.java')
-rw-r--r-- | jack-tests/tests/com/android/jack/shrob/ShrinkTests.java | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/jack-tests/tests/com/android/jack/shrob/ShrinkTests.java b/jack-tests/tests/com/android/jack/shrob/ShrinkTests.java index 6ffa637..8e03f6a 100644 --- a/jack-tests/tests/com/android/jack/shrob/ShrinkTests.java +++ b/jack-tests/tests/com/android/jack/shrob/ShrinkTests.java @@ -16,18 +16,25 @@ package com.android.jack.shrob; +import com.google.common.io.NullOutputStream; + +import com.android.jack.JackAbortException; import com.android.jack.Main; import com.android.jack.Options; import com.android.jack.ProguardFlags; import com.android.jack.shrob.shrink.ShrinkStructurePrinter; +import com.android.jack.shrob.shrink.ShrinkingException; import com.android.jack.test.comparator.ComparatorMapping; import com.android.jack.test.helper.SourceToDexComparisonTestHelper; import com.android.jack.test.toolchain.AbstractTestTools; import com.android.jack.test.toolchain.DummyToolchain; +import com.android.jack.test.toolchain.IToolchain; import com.android.jack.test.toolchain.JackApiToolchainBase; import com.android.jack.test.toolchain.JackBasedToolchain; import com.android.jack.util.TextUtils; +import junit.framework.Assert; + import org.junit.BeforeClass; import org.junit.Test; @@ -113,6 +120,7 @@ public class ShrinkTests extends AbstractTest { toolchain.addProguardFlags( dontObfuscateFlagFile, new ProguardFlags(new File(shrobTestsDir, "test020"),"proguard.flags")); + toolchain.addToClasspath(toolchain.getDefaultBootClasspath()); toolchain.libToLib( testOut, shrinkOut, @@ -162,6 +170,7 @@ public class ShrinkTests extends AbstractTest { dontObfuscateFlagFile, new ProguardFlags(new File( shrobTestsDir, "test021"),"proguard.flags001")); shrinkOut = AbstractTestTools.createTempDir(); + toolchain.addToClasspath(toolchain.getDefaultBootClasspath()); toolchain.libToLib(jackOut, shrinkOut, /* zipFiles = */ false); new ComparatorMapping(candidateNodeListing, @@ -169,6 +178,7 @@ public class ShrinkTests extends AbstractTest { dexOut = AbstractTestTools.createTempDir(); toolchain = AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class); + toolchain.addToClasspath(toolchain.getDefaultBootClasspath()); toolchain.libToExe(shrinkOut, dexOut, /* zipFile = */ false); } catch (Exception e) { @@ -228,4 +238,118 @@ public class ShrinkTests extends AbstractTest { public void test42_003() throws Exception { runTest("042", "003", ""); } + + /** + * Check that a program importing a library using another library is well shrinked, if the used + * library is on the classpath. If the used library is not on the classpath, Jack must generate + * an error otherwise it could shrink class members that are needed. + */ + @Test + public void test45_001() throws Exception { + String testNumber = "045"; + String flagNumber = "001"; + + File lib2Out = AbstractTestTools.createTempDir(); + JackBasedToolchain toolchainLib2 = + AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); + toolchainLib2.addToClasspath(toolchainLib2.getDefaultBootClasspath()).srcToLib(lib2Out, + /* zipFiles = */false, new File(shrobTestsDir, "test" + testNumber + "/lib2")); + + File lib1Out = AbstractTestTools.createTempDir(); + JackBasedToolchain toolchainLib1 = + AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); + toolchainLib1.addToClasspath(lib2Out); + toolchainLib1.addToClasspath(toolchainLib1.getDefaultBootClasspath()).srcToLib(lib1Out, + /* zipFiles = */false, new File(shrobTestsDir, "test" + testNumber + "/lib1")); + + JackBasedToolchain toolchain = + AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class); + + File testFolder = new File(shrobTestsDir, "test" + testNumber); + File refFolder = new File(testFolder, "refsShrinking"); + + File candidateNodeListing = AbstractTestTools.createTempFile("nodeListing", ".txt"); + toolchain.addProperty(ShrinkStructurePrinter.STRUCTURE_PRINTING.getName(), "true"); + toolchain.addProperty(ShrinkStructurePrinter.STRUCTURE_PRINTING_FILE.getName(), + candidateNodeListing.getPath()); + toolchain.addProperty(Options.METHOD_FILTER.getName(), "supported-methods"); + toolchain.disableDxOptimizations(); + toolchain.addStaticLibs(lib1Out); + toolchain.addToClasspath(lib2Out); + + File outFolder = AbstractTestTools.createTempDir(); + + SourceToDexComparisonTestHelper env = + new SourceToDexComparisonTestHelper(new File(testFolder, "jack")); + + env.setWithDebugInfo(true); + env.setCandidateTestTools(toolchain); + env.setReferenceTestTools(new DummyToolchain()); + env.setProguardFlags(dontObfuscateFlagFile, + new ProguardFlags(testFolder, "proguard.flags" + flagNumber)); + + env.runTest(new ComparatorMapping(new File(refFolder, "expected-" + flagNumber + ".txt"), + candidateNodeListing)); + } + + /** + * Check that a program importing a library using another library generate an error if the use + * library is not into the classpath. If the used library is not on the classpath, Jack must + * generate an error otherwise it could shrink class members that are needed. + */ + @Test + public void test45_001_bis() throws Exception { + String testNumber = "045"; + String flagNumber = "001"; + + File lib2Out = AbstractTestTools.createTempDir(); + JackApiToolchainBase toolchainLib2 = + AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class); + toolchainLib2.addToClasspath(toolchainLib2.getDefaultBootClasspath()).srcToLib(lib2Out, + /* zipFiles = */false, new File(shrobTestsDir, "test" + testNumber + "/lib2")); + + File lib1Out = AbstractTestTools.createTempDir(); + JackApiToolchainBase toolchainLib1 = + AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class); + toolchainLib1.addToClasspath(lib2Out); + toolchainLib1.addToClasspath(toolchainLib1.getDefaultBootClasspath()).srcToLib(lib1Out, + /* zipFiles = */false, new File(shrobTestsDir, "test" + testNumber + "/lib1")); + + JackApiToolchainBase toolchain = + AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class); + + File testFolder = new File(shrobTestsDir, "test" + testNumber); + File refFolder = new File(testFolder, "refsShrinking"); + + File candidateNodeListing = AbstractTestTools.createTempFile("nodeListing", ".txt"); + toolchain.addProperty(ShrinkStructurePrinter.STRUCTURE_PRINTING.getName(), "true"); + toolchain.addProperty(ShrinkStructurePrinter.STRUCTURE_PRINTING_FILE.getName(), + candidateNodeListing.getPath()); + toolchain.addProperty(Options.METHOD_FILTER.getName(), "supported-methods"); + toolchain.disableDxOptimizations(); + toolchain.addStaticLibs(lib1Out); + toolchain.setErrorStream(new NullOutputStream()); + File outFolder = AbstractTestTools.createTempDir(); + + SourceToDexComparisonTestHelper env = + new SourceToDexComparisonTestHelper(new File(testFolder, "jack")); + + env.setWithDebugInfo(true); + env.setCandidateTestTools(toolchain); + env.setReferenceTestTools(new DummyToolchain()); + env.setProguardFlags(dontObfuscateFlagFile, + new ProguardFlags(testFolder, "proguard.flags" + flagNumber)); + + try { + env.runTest(new ComparatorMapping(new File(refFolder, "expected-" + flagNumber + ".txt"), + candidateNodeListing)); + } catch (JackAbortException e) { + Assert.assertTrue(e.getCause() instanceof ShrinkingException); + Assert + .assertEquals( + "Error during the skrinking: Unknown referenced type 'com.android.jack.shrob.test045." + + "lib2.A'. Add type into your classpath.", + e.getMessage()); + } + } } |