Move some default-methods tests to Java from Smali.

Move all smali tests for default method behavior in
non-source-incompatible contexts to java. Also move some of the
simpler tests for source and binary incompatibilities into java as
well when possible.

Bug: 27310767

Change-Id: I753196f19849494825953c1bf06f15b7132f459b
diff --git a/test/966-default-conflict/build b/test/966-default-conflict/build
index e66e840..0dd8573 100755
--- a/test/966-default-conflict/build
+++ b/test/966-default-conflict/build
@@ -17,18 +17,11 @@
 # make us exit on a failure
 set -e
 
-# TODO: Support running with jack.
-
-if [[ $@ == *"--jvm"* ]]; then
-  # Build the Java files if we are running a --jvm test
-  mkdir -p src
-  mkdir -p classes
-  ${ANDROID_BUILD_TOP}/art/tools/extract-embedded-java ./smali ./src
-  # Build with the non-conflicting version
-  ${JAVAC} -implicit:none -d classes src/Iface.java build-src/Iface2.java src/Main.java
-  rm classes/Iface2.class
-  # Build with the conflicting version
-  ${JAVAC} -implicit:none -cp classes -d classes src/Iface2.java
-else
-  ./default-build "$@" --experimental default-methods
+if [[ $@ != *"--jvm"* ]]; then
+  # Don't do anything with jvm
+  # Hard-wired use of experimental jack.
+  # TODO: fix this temporary work-around for default-methods, see b/19467889
+  export USE_JACK=true
 fi
+
+./default-build "$@" --experimental default-methods
diff --git a/test/966-default-conflict/smali/Iface.smali b/test/966-default-conflict/smali/Iface.smali
deleted file mode 100644
index e996b3a..0000000
--- a/test/966-default-conflict/smali/Iface.smali
+++ /dev/null
@@ -1,39 +0,0 @@
-# /*
-#  * Copyright (C) 2015 The Android Open Source Project
-#  *
-#  * Licensed under the Apache License, Version 2.0 (the "License");
-#  * you may not use this file except in compliance with the License.
-#  * You may obtain a copy of the License at
-#  *
-#  *      http://www.apache.org/licenses/LICENSE-2.0
-#  *
-#  * Unless required by applicable law or agreed to in writing, software
-#  * distributed under the License is distributed on an "AS IS" BASIS,
-#  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  * See the License for the specific language governing permissions and
-#  * limitations under the License.
-#  */
-#
-# public interface Iface {
-#   public default String sayHi() {
-#       return "Hi";
-#   }
-#   public default String charge() {
-#       return "CHARGE";
-#   }
-# }
-
-.class public abstract interface LIface;
-.super Ljava/lang/Object;
-
-.method public sayHi()Ljava/lang/String;
-    .locals 1
-    const-string v0, "Hi"
-    return-object v0
-.end method
-
-.method public charge()Ljava/lang/String;
-    .locals 1
-    const-string v0, "CHARGE"
-    return-object v0
-.end method
diff --git a/test/966-default-conflict/smali/Iface2.smali b/test/966-default-conflict/smali/Iface2.smali
deleted file mode 100644
index 82fa547..0000000
--- a/test/966-default-conflict/smali/Iface2.smali
+++ /dev/null
@@ -1,31 +0,0 @@
-# /*
-#  * Copyright (C) 2015 The Android Open Source Project
-#  *
-#  * Licensed under the Apache License, Version 2.0 (the "License");
-#  * you may not use this file except in compliance with the License.
-#  * You may obtain a copy of the License at
-#  *
-#  *      http://www.apache.org/licenses/LICENSE-2.0
-#  *
-#  * Unless required by applicable law or agreed to in writing, software
-#  * distributed under the License is distributed on an "AS IS" BASIS,
-#  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  * See the License for the specific language governing permissions and
-#  * limitations under the License.
-#  */
-#
-# public interface Iface2 {
-#   public default String sayHi() {
-#     return "hello";
-#   }
-# }
-
-.class public abstract interface LIface2;
-.super Ljava/lang/Object;
-
-.method public sayHi()Ljava/lang/String;
-    .locals 1
-    const-string v0, "hello"
-    return-object v0
-.end method
-
diff --git a/test/966-default-conflict/smali/Main.smali b/test/966-default-conflict/smali/Main.smali
deleted file mode 100644
index ce974d8..0000000
--- a/test/966-default-conflict/smali/Main.smali
+++ /dev/null
@@ -1,227 +0,0 @@
-# /*
-#  * Copyright (C) 2015 The Android Open Source Project
-#  *
-#  * Licensed under the Apache License, Version 2.0 (the "License");
-#  * you may not use this file except in compliance with the License.
-#  * You may obtain a copy of the License at
-#  *
-#  *      http://www.apache.org/licenses/LICENSE-2.0
-#  *
-#  * Unless required by applicable law or agreed to in writing, software
-#  * distributed under the License is distributed on an "AS IS" BASIS,
-#  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  * See the License for the specific language governing permissions and
-#  * limitations under the License.
-#  */
-#
-# class Main implements Iface, Iface2 {
-#   public static void main(String[] args) {
-#       System.out.println("Create Main instance");
-#       Main m = new Main();
-#       System.out.println("Calling functions on concrete Main");
-#       callMain(m);
-#       System.out.println("Calling functions on interface Iface");
-#       callIface(m);
-#       System.out.println("Calling functions on interface Iface2");
-#       callIface2(m);
-#   }
-#
-#   public static void callMain(Main m) {
-#       System.out.println("Calling non-conflicting function on Main");
-#       System.out.println(m.charge());
-#       System.out.println("Calling conflicting function on Main");
-#       try {
-#           System.out.println(m.sayHi());
-#           System.out.println("Unexpected no error Thrown on Main");
-#       } catch (AbstractMethodError e) {
-#           System.out.println("Unexpected AME Thrown on Main");
-#       } catch (IncompatibleClassChangeError e) {
-#           System.out.println("Expected ICCE Thrown on Main");
-#       }
-#       System.out.println("Calling non-conflicting function on Main");
-#       System.out.println(m.charge());
-#       return;
-#   }
-#
-#   public static void callIface(Iface m) {
-#       System.out.println("Calling non-conflicting function on Iface");
-#       System.out.println(m.charge());
-#       System.out.println("Calling conflicting function on Iface");
-#       try {
-#           System.out.println(m.sayHi());
-#           System.out.println("Unexpected no error Thrown on Iface");
-#       } catch (AbstractMethodError e) {
-#           System.out.println("Unexpected AME Thrown on Iface");
-#       } catch (IncompatibleClassChangeError e) {
-#           System.out.println("Expected ICCE Thrown on Iface");
-#       }
-#       System.out.println("Calling non-conflicting function on Iface");
-#       System.out.println(m.charge());
-#       return;
-#   }
-#
-#   public static void callIface2(Iface2 m) {
-#       System.out.println("Calling conflicting function on Iface2");
-#       try {
-#           System.out.println(m.sayHi());
-#           System.out.println("Unexpected no error Thrown on Iface2");
-#       } catch (AbstractMethodError e) {
-#           System.out.println("Unexpected AME Thrown on Iface2");
-#       } catch (IncompatibleClassChangeError e) {
-#           System.out.println("Expected ICCE Thrown on Iface2");
-#       }
-#       return;
-#   }
-# }
-
-.class public LMain;
-.super Ljava/lang/Object;
-.implements LIface;
-.implements LIface2;
-
-.method public constructor <init>()V
-    .registers 1
-    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
-    return-void
-.end method
-
-.method public static main([Ljava/lang/String;)V
-    .locals 3
-    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
-
-    const-string v0, "Create Main instance"
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-    new-instance v2, LMain;
-    invoke-direct {v2}, LMain;-><init>()V
-
-    const-string v0, "Calling functions on concrete Main"
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-    invoke-static {v2}, LMain;->callMain(LMain;)V
-
-    const-string v0, "Calling functions on interface Iface"
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-    invoke-static {v2}, LMain;->callIface(LIface;)V
-
-    const-string v0, "Calling functions on interface Iface2"
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-    invoke-static {v2}, LMain;->callIface2(LIface2;)V
-
-    return-void
-.end method
-
-.method public static callIface(LIface;)V
-    .locals 2
-    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
-    const-string v0, "Calling non-conflicting function on Iface"
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-    invoke-interface {p0}, LIface;->charge()Ljava/lang/String;
-    move-result-object v0
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-    const-string v0, "Calling conflicting function on Iface"
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-    :try_start
-        invoke-interface {p0}, LIface;->sayHi()Ljava/lang/String;
-        move-result-object v0
-        invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-        const-string v0, "Unexpected no error Thrown on Iface"
-        invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-        goto :error_end
-    :try_end
-    .catch Ljava/lang/AbstractMethodError; {:try_start .. :try_end} :AME_error_start
-    .catch Ljava/lang/IncompatibleClassChangeError; {:try_start .. :try_end} :ICCE_error_start
-    :AME_error_start
-        const-string v0, "Unexpected AME Thrown on Iface"
-        invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-        goto :error_end
-    :ICCE_error_start
-        const-string v0, "Expected ICCE Thrown on Iface"
-        invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-        goto :error_end
-    :error_end
-    const-string v0, "Calling non-conflicting function on Iface"
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-    invoke-interface {p0}, LIface;->charge()Ljava/lang/String;
-    move-result-object v0
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-    return-void
-.end method
-
-.method public static callIface2(LIface2;)V
-    .locals 2
-    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
-    const-string v0, "Calling conflicting function on Iface2"
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-    :try_start
-        invoke-interface {p0}, LIface2;->sayHi()Ljava/lang/String;
-        move-result-object v0
-        invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-        const-string v0, "Unexpected no error Thrown on Iface2"
-        invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-        goto :error_end
-    :try_end
-    .catch Ljava/lang/AbstractMethodError; {:try_start .. :try_end} :AME_error_start
-    .catch Ljava/lang/IncompatibleClassChangeError; {:try_start .. :try_end} :ICCE_error_start
-    :AME_error_start
-        const-string v0, "Unexpected AME Thrown on Iface2"
-        invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-        goto :error_end
-    :ICCE_error_start
-        const-string v0, "Expected ICCE Thrown on Iface2"
-        invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-        goto :error_end
-    :error_end
-
-    return-void
-.end method
-
-.method public static callMain(LMain;)V
-    .locals 2
-    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
-    const-string v0, "Calling non-conflicting function on Main"
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-    invoke-virtual {p0}, LMain;->charge()Ljava/lang/String;
-    move-result-object v0
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-    const-string v0, "Calling conflicting function on Main"
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-    :try_start
-        invoke-virtual {p0}, LMain;->sayHi()Ljava/lang/String;
-        move-result-object v0
-        invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-        const-string v0, "Unexpected no error Thrown on Main"
-        invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-        goto :error_end
-    :try_end
-    .catch Ljava/lang/AbstractMethodError; {:try_start .. :try_end} :AME_error_start
-    .catch Ljava/lang/IncompatibleClassChangeError; {:try_start .. :try_end} :ICCE_error_start
-    :AME_error_start
-        const-string v0, "Unexpected AME Thrown on Main"
-        invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-        goto :error_end
-    :ICCE_error_start
-        const-string v0, "Expected ICCE Thrown on Main"
-        invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-        goto :error_end
-    :error_end
-    const-string v0, "Calling non-conflicting function on Main"
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-    invoke-virtual {p0}, LMain;->charge()Ljava/lang/String;
-    move-result-object v0
-    invoke-virtual {v1,v0}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
-
-    return-void
-.end method
diff --git a/test/966-default-conflict/src/Iface.java b/test/966-default-conflict/src/Iface.java
new file mode 100644
index 0000000..2131ed8
--- /dev/null
+++ b/test/966-default-conflict/src/Iface.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+public interface Iface {
+  public default String sayHi() {
+    return "Hi";
+  }
+  public default String charge() {
+    return "CHARGE";
+  }
+}
diff --git a/test/966-default-conflict/build-src/Iface2.java b/test/966-default-conflict/src/Iface2.java
similarity index 100%
rename from test/966-default-conflict/build-src/Iface2.java
rename to test/966-default-conflict/src/Iface2.java
diff --git a/test/966-default-conflict/src/Main.java b/test/966-default-conflict/src/Main.java
new file mode 100644
index 0000000..ce8cb47
--- /dev/null
+++ b/test/966-default-conflict/src/Main.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+class Main implements Iface, Iface2 {
+  public static void main(String[] args) {
+    System.out.println("Create Main instance");
+    Main m = new Main();
+    System.out.println("Calling functions on concrete Main");
+    callMain(m);
+    System.out.println("Calling functions on interface Iface");
+    callIface(m);
+    System.out.println("Calling functions on interface Iface2");
+    callIface2(m);
+  }
+  public static void callMain(Main m) {
+    System.out.println("Calling non-conflicting function on Main");
+    System.out.println(m.charge());
+    System.out.println("Calling conflicting function on Main");
+    try {
+      System.out.println(m.sayHi());
+      System.out.println("Unexpected no error Thrown on Main");
+    } catch (AbstractMethodError e) {
+      System.out.println("Unexpected AME Thrown on Main");
+    } catch (IncompatibleClassChangeError e) {
+      System.out.println("Expected ICCE Thrown on Main");
+    }
+    System.out.println("Calling non-conflicting function on Main");
+    System.out.println(m.charge());
+    return;
+  }
+  public static void callIface(Iface m) {
+    System.out.println("Calling non-conflicting function on Iface");
+    System.out.println(m.charge());
+    System.out.println("Calling conflicting function on Iface");
+    try {
+      System.out.println(m.sayHi());
+      System.out.println("Unexpected no error Thrown on Iface");
+    } catch (AbstractMethodError e) {
+      System.out.println("Unexpected AME Thrown on Iface");
+    } catch (IncompatibleClassChangeError e) {
+      System.out.println("Expected ICCE Thrown on Iface");
+    }
+    System.out.println("Calling non-conflicting function on Iface");
+    System.out.println(m.charge());
+    return;
+  }
+  public static void callIface2(Iface2 m) {
+    System.out.println("Calling conflicting function on Iface2");
+    try {
+      System.out.println(m.sayHi());
+      System.out.println("Unexpected no error Thrown on Iface2");
+    } catch (AbstractMethodError e) {
+      System.out.println("Unexpected AME Thrown on Iface2");
+    } catch (IncompatibleClassChangeError e) {
+      System.out.println("Expected ICCE Thrown on Iface2");
+    }
+    return;
+  }
+}
diff --git a/test/966-default-conflict/src2/Iface2.java b/test/966-default-conflict/src2/Iface2.java
new file mode 100644
index 0000000..d29033c
--- /dev/null
+++ b/test/966-default-conflict/src2/Iface2.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+public interface Iface2 {
+  public default String sayHi() {
+    return "hello";
+  }
+}