// 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.cf.stackmap;

import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assume.assumeTrue;

import com.android.tools.r8.JvmTestRunResult;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestDiagnosticMessages;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.utils.BooleanUtils;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

@RunWith(Parameterized.class)
public class StackMapVerificationNoFrameForHandlerTest extends TestBase {

  private final TestParameters parameters;
  private final boolean includeFrameInHandler;
  private final String EXPECTED_OUTPUT = "Hello World!";
  private final String EXPECTED_VERIFY_ERROR =
      "Expected stack map table for method with non-linear control flow";
  private final String EXPECTED_JVM_ERROR =
      "java.lang.VerifyError: Expecting a stackmap frame at branch target";

  @Parameters(name = "{0}, include frame in handler: {1}")
  public static List<Object[]> data() {
    return buildParameters(
        getTestParameters().withAllRuntimesAndApiLevels().build(), BooleanUtils.values());
  }

  public StackMapVerificationNoFrameForHandlerTest(
      TestParameters parameters, boolean includeFrameInHandler) {
    this.parameters = parameters;
    this.includeFrameInHandler = includeFrameInHandler;
  }

  @Test
  public void testJvm() throws Exception {
    assumeTrue(parameters.isCfRuntime());
    JvmTestRunResult mainResult =
        testForJvm()
            .addProgramClassFileData(
                includeFrameInHandler
                    ? MainDump.dump()
                    : transformer(MainDump.dump(), Reference.classFromClass(Main.class))
                        .stripFrames("main")
                        .transform())
            .run(parameters.getRuntime(), Main.class);
    if (includeFrameInHandler) {
      mainResult.assertSuccessWithOutputLines(EXPECTED_OUTPUT);
    } else {
      mainResult.assertFailureWithErrorThatMatches(containsString(EXPECTED_JVM_ERROR));
    }
  }

  @Test
  public void testD8() throws Exception {
    assumeTrue(parameters.isDexRuntime());
    testForD8()
        .addProgramClassFileData(
            includeFrameInHandler
                ? MainDump.dump()
                : transformer(MainDump.dump(), Reference.classFromClass(Main.class))
                    .stripFrames("main")
                    .transform())
        .addOptionsModification(options -> options.testing.readInputStackMaps = true)
        .setMinApi(parameters.getApiLevel())
        .compileWithExpectedDiagnostics(this::verifyWarningsRegardingStackMap)
        .run(parameters.getRuntime(), Main.class)
        .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
  }

  @Test
  public void testHandlerR8() throws Exception {
    testForR8(parameters.getBackend())
        .addProgramClassFileData(
            includeFrameInHandler
                ? MainDump.dump()
                : transformer(MainDump.dump(), Reference.classFromClass(Main.class))
                    .stripFrames("main")
                    .transform())
        .addKeepMainRule(Main.class)
        .setMinApi(parameters.getApiLevel())
        .allowDiagnosticWarningMessages(!includeFrameInHandler)
        .addOptionsModification(
            options -> {
              options.getCfCodeAnalysisOptions().setEnableUnverifiableCodeReporting(false);
              options.testing.readInputStackMaps = true;
            })
        .compileWithExpectedDiagnostics(this::verifyWarningsRegardingStackMap)
        .run(parameters.getRuntime(), Main.class)
        .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
  }

  private void verifyWarningsRegardingStackMap(TestDiagnosticMessages diagnostics) {
    if (includeFrameInHandler) {
      diagnostics.assertNoMessages();
    } else {
      diagnostics.assertOnlyWarnings();
      diagnostics.assertWarningsMatch(diagnosticMessage(containsString(EXPECTED_VERIFY_ERROR)));
    }
  }

  public static class Main {

    public static void main(String[] args) {
      try {
        getThrowable(new Throwable());
      } catch (Throwable e) {
      }
      System.out.println("Hello World!");
    }

    public static Throwable getThrowable(Throwable throwable) {
      if (System.currentTimeMillis() > 0) {
        return new RuntimeException(throwable);
      } else {
        throw new ClassCastException();
      }
    }
  }

  /**
   * The dump is mostly the code obtained from the Main class above, however, some instructions are
   * removed to have the frames being the same with linear flow:
   *
   * <pre>
   * try {
   * getThrowable(new Throwable());
   * pop
   * goto lbl3
   * } catch (Throwable e) {
   *   astore(1);
   *   goto lbl3
   * }
   * lbl3
   * System.out.println("Hello World!");
   * </pre>
   *
   * becomes:
   *
   * <pre>
   * try {
   * getThrowable(new Throwable());
   * } catch (Throwable e) {
   *   pop;
   * }
   * lbl3
   * System.out.println("Hello World!");
   * </pre>
   */
  public static class MainDump implements Opcodes {

    public static byte[] dump() {

      ClassWriter classWriter = new ClassWriter(0);
      MethodVisitor methodVisitor;

      classWriter.visit(
          V1_8,
          ACC_PUBLIC | ACC_SUPER,
          "com/android/tools/r8/cf/stackmap/StackMapVerificationNoFrameForHandlerTest$Main",
          null,
          "java/lang/Object",
          null);

      classWriter.visitInnerClass(
          "com/android/tools/r8/cf/stackmap/StackMapVerificationNoFrameForHandlerTest$Main",
          "com/android/tools/r8/cf/stackmap/StackMapVerificationNoFrameForHandlerTest",
          "Main",
          ACC_PUBLIC | ACC_STATIC);

      {
        methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        methodVisitor.visitCode();
        methodVisitor.visitVarInsn(ALOAD, 0);
        methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        methodVisitor.visitInsn(RETURN);
        methodVisitor.visitMaxs(1, 1);
        methodVisitor.visitEnd();
      }
      {
        methodVisitor =
            classWriter.visitMethod(
                ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
        methodVisitor.visitCode();
        Label label0 = new Label();
        Label label1 = new Label();
        Label label2 = new Label();
        methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
        methodVisitor.visitLabel(label0);
        methodVisitor.visitTypeInsn(NEW, "java/lang/Throwable");
        methodVisitor.visitInsn(DUP);
        methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Throwable", "<init>", "()V", false);
        methodVisitor.visitMethodInsn(
            INVOKESTATIC,
            "com/android/tools/r8/cf/stackmap/StackMapVerificationNoFrameForHandlerTest$Main",
            "getThrowable",
            "(Ljava/lang/Throwable;)Ljava/lang/Throwable;",
            false);
        methodVisitor.visitLabel(label1);
        methodVisitor.visitLabel(label2);
        methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
        methodVisitor.visitInsn(POP);
        Label label3 = new Label();
        methodVisitor.visitLabel(label3);
        methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
        methodVisitor.visitLdcInsn("Hello World!");
        methodVisitor.visitMethodInsn(
            INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
        methodVisitor.visitInsn(RETURN);
        methodVisitor.visitMaxs(2, 2);
        methodVisitor.visitEnd();
      }
      {
        methodVisitor =
            classWriter.visitMethod(
                ACC_PUBLIC | ACC_STATIC,
                "getThrowable",
                "(Ljava/lang/Throwable;)Ljava/lang/Throwable;",
                null,
                null);
        methodVisitor.visitCode();
        methodVisitor.visitMethodInsn(
            INVOKESTATIC, "java/lang/System", "currentTimeMillis", "()J", false);
        methodVisitor.visitInsn(LCONST_0);
        methodVisitor.visitInsn(LCMP);
        Label label0 = new Label();
        methodVisitor.visitJumpInsn(IFLE, label0);
        methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
        methodVisitor.visitInsn(DUP);
        methodVisitor.visitVarInsn(ALOAD, 0);
        methodVisitor.visitMethodInsn(
            INVOKESPECIAL,
            "java/lang/RuntimeException",
            "<init>",
            "(Ljava/lang/Throwable;)V",
            false);
        methodVisitor.visitInsn(ARETURN);
        methodVisitor.visitLabel(label0);
        methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
        methodVisitor.visitTypeInsn(NEW, "java/lang/ClassCastException");
        methodVisitor.visitInsn(DUP);
        methodVisitor.visitMethodInsn(
            INVOKESPECIAL, "java/lang/ClassCastException", "<init>", "()V", false);
        methodVisitor.visitInsn(ATHROW);
        methodVisitor.visitMaxs(4, 1);
        methodVisitor.visitEnd();
      }
      classWriter.visitEnd();

      return classWriter.toByteArray();
    }
  }
}
