/*
 * Copyright (C) 2018 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.
 */

#include "oatdump_test.h"

namespace art {

// Oat file compiled with a boot image. oatdump invoked with a boot image.
TEST_P(OatDumpTest, TestDumpOatWithRuntimeWithBootImage) {
  TEST_DISABLED_FOR_RISCV64();
  ASSERT_TRUE(GenerateAppOdexFile(GetParam()));
  ASSERT_TRUE(Exec(GetParam(),
                   kArgOatApp | kArgBootImage | kArgBcp | kArgIsa,
                   {},
                   kExpectOat | kExpectCode | kExpectBssMappingsForBcp));
}

// Oat file compiled without a boot image. oatdump invoked without a boot image.
TEST_P(OatDumpTest, TestDumpOatWithRuntimeWithNoBootImage) {
  TEST_DISABLED_FOR_RISCV64();
  TEST_DISABLED_FOR_DEBUG_BUILD();  // DCHECK failed.
  ASSERT_TRUE(GenerateAppOdexFile(GetParam(), {"--boot-image=/nonx/boot.art"}));
  ASSERT_TRUE(Exec(GetParam(),
                   kArgOatApp | kArgBcp | kArgIsa,
                   {"--boot-image=/nonx/boot.art"},
                   kExpectOat | kExpectCode | kExpectBssMappingsForBcp));
}

// Dex code cannot be found in the vdex file, and no --dex-file is specified. Dump header only.
TEST_P(OatDumpTest, TestDumpOatTryWithRuntimeDexNotFound) {
  TEST_DISABLED_FOR_RISCV64();
  ASSERT_TRUE(
      GenerateAppOdexFile(GetParam(), {"--dex-location=/nonx/app.jar", "--copy-dex-files=false"}));
  ASSERT_TRUE(Exec(GetParam(), kArgOatApp | kArgBootImage | kArgBcp | kArgIsa, {}, kExpectOat));
}

// Dex code cannot be found in the vdex file, but can be found in the specified dex file.
TEST_P(OatDumpTest, TestDumpOatWithRuntimeDexSpecified) {
  TEST_DISABLED_FOR_RISCV64();
  ASSERT_TRUE(
      GenerateAppOdexFile(GetParam(), {"--dex-location=/nonx/app.jar", "--copy-dex-files=false"}));
  ASSERT_TRUE(Exec(GetParam(),
                   kArgOatApp | kArgDexApp | kArgBootImage | kArgBcp | kArgIsa,
                   {},
                   kExpectOat | kExpectCode | kExpectBssMappingsForBcp));
}

// Oat file compiled with a boot image. oatdump invoked without a boot image.
TEST_P(OatDumpTest, TestDumpOatWithoutRuntimeBcpMismatch) {
  TEST_DISABLED_FOR_RISCV64();
  ASSERT_TRUE(GenerateAppOdexFile(GetParam()));
  ASSERT_TRUE(Exec(GetParam(),
                   kArgOatApp | kArgBcp | kArgIsa,
                   {"--boot-image=/nonx/boot.art"},
                   kExpectOat | kExpectCode | kExpectBssOffsetsForBcp));
}

// Bootclasspath not specified.
TEST_P(OatDumpTest, TestDumpOatWithoutRuntimeNoBcp) {
  TEST_DISABLED_FOR_RISCV64();
  ASSERT_TRUE(GenerateAppOdexFile(GetParam()));
  ASSERT_TRUE(Exec(GetParam(), kArgOatApp, {}, kExpectOat | kExpectCode | kExpectBssOffsetsForBcp));
}

// Dex code cannot be found in the vdex file, and no --dex-file is specified. Dump header only.
TEST_P(OatDumpTest, TestDumpOatWithoutRuntimeDexNotFound) {
  TEST_DISABLED_FOR_RISCV64();
  ASSERT_TRUE(
      GenerateAppOdexFile(GetParam(), {"--dex-location=/nonx/app.jar", "--copy-dex-files=false"}));
  ASSERT_TRUE(Exec(GetParam(), kArgOatApp, {}, kExpectOat));
}

// Dex code cannot be found in the vdex file, but can be found in the specified dex file.
TEST_P(OatDumpTest, TestDumpOatWithoutRuntimeDexSpecified) {
  TEST_DISABLED_FOR_RISCV64();
  ASSERT_TRUE(
      GenerateAppOdexFile(GetParam(), {"--dex-location=/nonx/app.jar", "--copy-dex-files=false"}));
  ASSERT_TRUE(Exec(
      GetParam(), kArgOatApp | kArgDexApp, {}, kExpectOat | kExpectCode | kExpectBssOffsetsForBcp));
}

TEST_P(OatDumpTest, TestDumpAppImageWithBootImage) {
  TEST_DISABLED_FOR_RISCV64();
  TEST_DISABLED_WITHOUT_BAKER_READ_BARRIERS();  // GC bug, b/126305867
  const std::string app_image_arg = "--app-image-file=" + GetAppImageName();
  ASSERT_TRUE(GenerateAppOdexFile(GetParam(), {app_image_arg}));
  ASSERT_TRUE(Exec(GetParam(),
                   kArgAppImage | kArgOatApp | kArgBootImage | kArgBcp | kArgIsa,
                   {},
                   kExpectImage | kExpectOat | kExpectCode | kExpectBssMappingsForBcp));
}

// Deprecated usage, but checked for compatibility.
TEST_P(OatDumpTest, TestDumpAppImageWithBootImageLegacy) {
  TEST_DISABLED_FOR_RISCV64();
  TEST_DISABLED_WITHOUT_BAKER_READ_BARRIERS();  // GC bug, b/126305867
  const std::string app_image_arg = "--app-image-file=" + GetAppImageName();
  ASSERT_TRUE(GenerateAppOdexFile(GetParam(), {app_image_arg}));
  ASSERT_TRUE(Exec(GetParam(),
                   kArgAppImage | kArgImage | kArgBcp | kArgIsa,
                   {"--app-oat=" + GetAppOdexName()},
                   kExpectImage | kExpectOat | kExpectCode | kExpectBssMappingsForBcp));
}

TEST_P(OatDumpTest, TestDumpAppImageInvalidPath) {
  TEST_DISABLED_FOR_RISCV64();
  TEST_DISABLED_WITHOUT_BAKER_READ_BARRIERS();  // GC bug, b/126305867
  const std::string app_image_arg = "--app-image-file=" + GetAppImageName();
  ASSERT_TRUE(GenerateAppOdexFile(GetParam(), {app_image_arg}));
  ASSERT_TRUE(Exec(GetParam(),
                   kArgOatApp | kArgBootImage | kArgBcp | kArgIsa,
                   {"--app-image=missing_app_image.art"},
                   /*expects=*/0,
                   /*expect_failure=*/true));
}

// The runtime can start, but the boot image check should fail.
TEST_P(OatDumpTest, TestDumpAppImageWithWrongBootImage) {
  TEST_DISABLED_FOR_RISCV64();
  TEST_DISABLED_WITHOUT_BAKER_READ_BARRIERS();  // GC bug, b/126305867
  const std::string app_image_arg = "--app-image-file=" + GetAppImageName();
  ASSERT_TRUE(GenerateAppOdexFile(GetParam(), {app_image_arg}));
  ASSERT_TRUE(Exec(GetParam(),
                   kArgAppImage | kArgOatApp | kArgBcp | kArgIsa,
                   {"--boot-image=/nonx/boot.art"},
                   /*expects=*/0,
                   /*expect_failure=*/true));
}

// Not possible.
TEST_P(OatDumpTest, TestDumpAppImageWithoutRuntime) {
  TEST_DISABLED_FOR_RISCV64();
  TEST_DISABLED_WITHOUT_BAKER_READ_BARRIERS();  // GC bug, b/126305867
  const std::string app_image_arg = "--app-image-file=" + GetAppImageName();
  ASSERT_TRUE(GenerateAppOdexFile(GetParam(), {app_image_arg}));
  ASSERT_TRUE(Exec(GetParam(),
                   kArgAppImage | kArgOatApp,
                   {},
                   /*expects=*/0,
                   /*expect_failure=*/true));
}

// Dex code cannot be found in the vdex file, and no --dex-file is specified. Cannot dump app image.
TEST_P(OatDumpTest, TestDumpAppImageDexNotFound) {
  TEST_DISABLED_FOR_RISCV64();
  TEST_DISABLED_WITHOUT_BAKER_READ_BARRIERS();  // GC bug, b/126305867
  const std::string app_image_arg = "--app-image-file=" + GetAppImageName();
  ASSERT_TRUE(GenerateAppOdexFile(
      GetParam(), {app_image_arg, "--dex-location=/nonx/app.jar", "--copy-dex-files=false"}));
  ASSERT_TRUE(Exec(GetParam(),
                   kArgAppImage | kArgOatApp | kArgBootImage | kArgBcp | kArgIsa,
                   {},
                   /*expects=*/0,
                   /*expect_failure=*/true));
}

// Dex code cannot be found in the vdex file, but can be found in the specified dex file.
TEST_P(OatDumpTest, TestDumpAppImageDexSpecified) {
  TEST_DISABLED_FOR_RISCV64();
  TEST_DISABLED_WITHOUT_BAKER_READ_BARRIERS();  // GC bug, b/126305867
  const std::string app_image_arg = "--app-image-file=" + GetAppImageName();
  ASSERT_TRUE(GenerateAppOdexFile(
      GetParam(), {app_image_arg, "--dex-location=/nonx/app.jar", "--copy-dex-files=false"}));
  ASSERT_TRUE(Exec(GetParam(),
                   kArgAppImage | kArgOatApp | kArgDexApp | kArgBootImage | kArgBcp | kArgIsa,
                   {},
                   kExpectImage | kExpectOat | kExpectCode | kExpectBssMappingsForBcp));
}

}  // namespace art
