// Copyright (c) 2018, 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.regress.b78493232;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;

import com.android.tools.r8.AsmTestBase;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.utils.AndroidApp;
import org.junit.Test;

// Variant of Regress78493232, but where the new-instance is forced to flow to a non-trivial phi
// function prior to the call to <init>.
public class Regress78493232_WithPhi extends AsmTestBase {

  @Test
  public void test() throws Exception {
    // Run test on JVM and ART(x86) to ensure expected behavior.
    // Running the same test on an ARM JIT causes errors.

    // TODO(b/80118070): Remove this if-statement when fixed.
    if (ToolHelper.getDexVm().getVersion() != Version.V5_1_1) {
      AndroidApp app =
          buildAndroidApp(
              Regress78493232Dump_WithPhi.dump(),
              ToolHelper.getClassAsBytes(Regress78493232Utils.class));
      ProcessResult javaResult =
          runOnJavaRaw(
              Regress78493232Dump_WithPhi.CLASS_NAME,
              Regress78493232Dump_WithPhi.dump(),
              ToolHelper.getClassAsBytes(Regress78493232Utils.class));
      ProcessResult d8Result =
          runOnArtRaw(compileWithD8(app), Regress78493232Dump_WithPhi.CLASS_NAME);
      ProcessResult r8Result =
          runOnArtRaw(compileWithR8(app), Regress78493232Dump_WithPhi.CLASS_NAME);
      String proguardConfig =
          keepMainProguardConfiguration(Regress78493232Dump_WithPhi.CLASS_NAME)
              + "-dontobfuscate\n";
      ProcessResult r8ShakenResult =
          runOnArtRaw(compileWithR8(app, proguardConfig), Regress78493232Dump_WithPhi.CLASS_NAME);
      assertEquals(
          "After 0 iterations, expected \"java.security.SecureRandom\", but got \"null\"\n",
          javaResult.stdout);
      assertEquals(0, javaResult.exitCode);
      switch (ToolHelper.getDexVm().getVersion()) {
        case V4_0_4:
        case V4_4_4:
        case V7_0_0:
        case DEFAULT:
          assertNotEquals(-1, d8Result.stderr.indexOf("java.lang.VerifyError"));
          assertNotEquals(-1, r8Result.stderr.indexOf("java.lang.VerifyError"));
          assertNotEquals(-1, r8ShakenResult.stderr.indexOf("java.lang.VerifyError"));
          assertEquals(1, d8Result.exitCode);
          assertEquals(1, r8Result.exitCode);
          assertEquals(1, r8ShakenResult.exitCode);
          break;
        case V6_0_1:
          assertEquals("Completed successfully after 1000 iterations\n", d8Result.stdout);
          assertEquals("Completed successfully after 1000 iterations\n", r8Result.stdout);
          assertEquals("Completed successfully after 1000 iterations\n", r8ShakenResult.stdout);
          assertEquals(0, d8Result.exitCode);
          assertEquals(0, r8Result.exitCode);
          assertEquals(0, r8ShakenResult.exitCode);
          break;
        case V5_1_1:
        default:
          throw new Unreachable();
      }
      return;
    }
    ensureSameOutput(
        Regress78493232Dump_WithPhi.CLASS_NAME,
        Regress78493232Dump_WithPhi.dump(),
        ToolHelper.getClassAsBytes(Regress78493232Utils.class));
  }
}
