| /* |
| * 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 |