Merge "Allow to run test with a custom java"
diff --git a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
index 5caa704..9d7478d 100644
--- a/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
+++ b/src/main/java/com/android/tools/r8/GenerateMainDexListCommand.java
@@ -68,7 +68,7 @@
      * Add proguard configuration for automatic main dex list calculation.
      */
     public GenerateMainDexListCommand.Builder addMainDexRules(List<String> lines) {
-      mainDexRules.add(new ProguardConfigurationSourceStrings(lines));
+      mainDexRules.add(new ProguardConfigurationSourceStrings(Paths.get("."), lines));
       return self();
     }
 
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 564aa9c..8d9eff6 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -105,7 +105,7 @@
      * Add proguard configuration for automatic main dex list calculation.
      */
     public Builder addMainDexRules(List<String> lines) {
-      mainDexRules.add(new ProguardConfigurationSourceStrings(lines));
+      mainDexRules.add(new ProguardConfigurationSourceStrings(Paths.get("."), lines));
       return self();
     }
 
@@ -138,7 +138,7 @@
      * Add proguard configuration.
      */
     public Builder addProguardConfiguration(List<String> lines) {
-      proguardConfigs.add(new ProguardConfigurationSourceStrings(lines));
+      proguardConfigs.add(new ProguardConfigurationSourceStrings(Paths.get("."), lines));
       return self();
     }
 
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationSourceStrings.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationSourceStrings.java
index a4c89e0..44b3393 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationSourceStrings.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationSourceStrings.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.shaking;
 
+import com.google.common.annotations.VisibleForTesting;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -11,20 +12,37 @@
 import joptsimple.internal.Strings;
 
 public class ProguardConfigurationSourceStrings implements ProguardConfigurationSource {
+  private final Path basePath;
   private final List<String> config;
 
-  public ProguardConfigurationSourceStrings(List<String> config) {
+  /**
+   * Creates {@link ProguardConfigurationSource} with raw {@param config}, along with
+   * {@param basePath}, which allows all other options that use a relative path to reach out
+   * to desired paths appropriately.
+   */
+  public ProguardConfigurationSourceStrings(Path basePath, List<String> config) {
+    this.basePath = basePath;
     this.config = config;
   }
 
+  private ProguardConfigurationSourceStrings(List<String> config) {
+    this(Paths.get("."), config);
+  }
+
+  @VisibleForTesting
+  static ProguardConfigurationSourceStrings createConfigurationForTesting(
+      List<String> config) {
+    return new ProguardConfigurationSourceStrings(config);
+  }
+
   @Override
   public String get() throws IOException{
-    return Strings.join(config, "\n");
+    return Strings.join(config, System.lineSeparator());
   }
 
   @Override
   public Path getBaseDirectory() {
-    return Paths.get(".");
+    return basePath;
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
index fb3c88a..00777fa 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking;
 
+import static com.android.tools.r8.shaking.ProguardConfigurationSourceStrings.createConfigurationForTesting;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -122,7 +123,7 @@
     // Parse from strings.
     parser = new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     List<String> lines = FileUtils.readTextFile(Paths.get(PROGUARD_SPEC_FILE));
-    parser.parse(new ProguardConfigurationSourceStrings(lines));
+    parser.parse(createConfigurationForTesting(lines));
     rules = parser.getConfig().getRules();
     assertEquals(24, rules.size());
     assertEquals(1, rules.get(0).getMemberRules().size());
@@ -155,7 +156,7 @@
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(dexItemFactory, diagnosticsHandler);
     String dontwarn = "-dontwarn !foobar,*bar";
-    parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(dontwarn)));
+    parser.parse(createConfigurationForTesting(ImmutableList.of(dontwarn)));
     ProguardConfiguration config = parser.getConfig();
     assertFalse(
         config.getDontWarnPatterns().matches(dexItemFactory.createType("Lboobaz;")));
@@ -171,7 +172,7 @@
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(dexItemFactory, diagnosticsHandler);
     String dontwarnAll = "-dontwarn *";
-    parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(dontwarnAll)));
+    parser.parse(createConfigurationForTesting(ImmutableList.of(dontwarnAll)));
     ProguardConfiguration config = parser.getConfig();
     assertTrue(
         config.getDontWarnPatterns().matches(dexItemFactory.createType("Lboobaz;")));
@@ -187,7 +188,7 @@
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(dexItemFactory, diagnosticsHandler);
     String dontwarnAll = "-dontwarn";
-    parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(dontwarnAll)));
+    parser.parse(createConfigurationForTesting(ImmutableList.of(dontwarnAll)));
     ProguardConfiguration config = parser.getConfig();
     assertTrue(
         config.getDontWarnPatterns().matches(dexItemFactory.createType("Lboobaz;")));
@@ -348,7 +349,7 @@
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(dexItemFactory, diagnosticsHandler);
     String adaptClassStrings = "-adaptclassstrings !foobar,*bar";
-    parser.parse( new ProguardConfigurationSourceStrings(ImmutableList.of(adaptClassStrings)));
+    parser.parse(createConfigurationForTesting(ImmutableList.of(adaptClassStrings)));
     ProguardConfiguration config = parser.getConfig();
     assertFalse(
         config.getAdaptClassStrings().matches(dexItemFactory.createType("Lboobaz;")));
@@ -364,7 +365,7 @@
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(dexItemFactory, diagnosticsHandler);
     String adaptAll = "-adaptclassstrings *";
-    parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(adaptAll)));
+    parser.parse(createConfigurationForTesting(ImmutableList.of(adaptAll)));
     ProguardConfiguration config = parser.getConfig();
     assertTrue(
         config.getAdaptClassStrings().matches(dexItemFactory.createType("Lboobaz;")));
@@ -380,7 +381,7 @@
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(dexItemFactory, diagnosticsHandler);
     String adaptAll = "-adaptclassstrings";
-    parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(adaptAll)));
+    parser.parse(createConfigurationForTesting(ImmutableList.of(adaptAll)));
     ProguardConfiguration config = parser.getConfig();
     assertTrue(
         config.getAdaptClassStrings().matches(dexItemFactory.createType("Lboobaz;")));
@@ -406,8 +407,7 @@
         "-identifiernamestring class * {\n"
         + "  @my.annotations.IdentifierNameString *;\n"
         + "}";
-    parser.parse(
-        new ProguardConfigurationSourceStrings(ImmutableList.of(config1, config2, config3)));
+    parser.parse(createConfigurationForTesting(ImmutableList.of(config1, config2, config3)));
     ProguardConfiguration config = parser.getConfig();
     List<ProguardConfigurationRule> identifierNameStrings = config.getRules();
     assertEquals(3, identifierNameStrings.size());
@@ -583,7 +583,7 @@
     try {
       ProguardConfigurationParser parser =
           new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
-      parser.parse(new ProguardConfigurationSourceStrings(
+      parser.parse(createConfigurationForTesting(
           Collections.singletonList("-injars abc.jar(*.zip;*.class)")));
     } catch (ProguardRuleParserException e) {
       return;
@@ -774,7 +774,7 @@
         new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     String config1 = "-renamesourcefileattribute PG\n";
     String config2 = "-keepattributes SourceFile,SourceDir\n";
-    parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(config1, config2)));
+    parser.parse(createConfigurationForTesting(ImmutableList.of(config1, config2)));
     ProguardConfiguration config = parser.getConfig();
     assertEquals("PG", config.getRenameSourceFileAttribute());
     assertTrue(config.getKeepAttributesPatterns().contains(KeepAttributeOptions.SOURCE_FILE));
@@ -787,7 +787,7 @@
         new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
     String config1 = "-renamesourcefileattribute\n";
     String config2 = "-keepattributes SourceFile\n";
-    parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(config1, config2)));
+    parser.parse(createConfigurationForTesting(ImmutableList.of(config1, config2)));
     ProguardConfiguration config = parser.getConfig();
     assertEquals("", config.getRenameSourceFileAttribute());
     assertTrue(config.getKeepAttributesPatterns().contains(KeepAttributeOptions.SOURCE_FILE));
@@ -796,7 +796,7 @@
   private void testKeepattributes(List<String> expected, String config) throws Exception {
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
-    parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(config)));
+    parser.parse(createConfigurationForTesting(ImmutableList.of(config)));
     assertEquals(expected, parser.getConfig().getKeepAttributesPatterns());
   }
 
@@ -821,7 +821,7 @@
     try {
       ProguardConfigurationParser parser =
           new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
-      parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of("-keepattributes xxx,")));
+      parser.parse(createConfigurationForTesting(ImmutableList.of("-keepattributes xxx,")));
       fail();
     } catch (ProguardRuleParserException e) {
       assertTrue(e.getMessage().contains("Expected list element at "));
@@ -832,7 +832,7 @@
   public void parseUseUniqueClassMemberNames() throws Exception {
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
-    parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(
+    parser.parse(createConfigurationForTesting(ImmutableList.of(
         "-useuniqueclassmembernames"
     )));
     ProguardConfiguration config = parser.getConfig();
@@ -844,7 +844,7 @@
     try {
       ProguardConfigurationParser parser =
           new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
-      parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(
+      parser.parse(createConfigurationForTesting(ImmutableList.of(
           "-keepparameternames"
       )));
       parser.getConfig();
@@ -859,7 +859,7 @@
   public void parseKeepParameterNamesWithoutMinification() throws Exception {
     ProguardConfigurationParser parser =
         new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
-    parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(
+    parser.parse(createConfigurationForTesting(ImmutableList.of(
         "-keepparameternames",
         "-dontobfuscate"
     )));
@@ -867,10 +867,10 @@
     assertTrue(config.isKeepParameterNames());
 
     parser = new ProguardConfigurationParser(new DexItemFactory(), diagnosticsHandler);
-    parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(
+    parser.parse(createConfigurationForTesting(ImmutableList.of(
         "-keepparameternames"
     )));
-    parser.parse(new ProguardConfigurationSourceStrings(ImmutableList.of(
+    parser.parse(createConfigurationForTesting(ImmutableList.of(
         "-dontobfuscate"
     )));
     config = parser.getConfig();