169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik/*
269ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik * Copyright (C) 2015 The Android Open Source Project
369ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik *
469ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik * Licensed under the Apache License, Version 2.0 (the "License");
569ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik * you may not use this file except in compliance with the License.
669ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik * You may obtain a copy of the License at
769ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik *
869ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik *      http://www.apache.org/licenses/LICENSE-2.0
969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik *
1069ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik * Unless required by applicable law or agreed to in writing, software
1169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik * distributed under the License is distributed on an "AS IS" BASIS,
1269ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1369ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik * See the License for the specific language governing permissions and
1469ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik * limitations under the License.
1569ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik */
1669ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
1769ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include <string>
1869ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include <vector>
1969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include <sstream>
2069ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
2169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include <sys/types.h>
2269ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include <unistd.h>
2369ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
2469ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include "base/stringprintf.h"
2569ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include "common_runtime_test.h"
2669ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include "runtime/arch/instruction_set.h"
2769ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include "runtime/gc/heap.h"
2869ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include "runtime/gc/space/image_space.h"
2969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include "runtime/os.h"
3069ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include "runtime/utils.h"
3169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include "utils.h"
3269ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
3369ae54abd4eaad54dc73b75ea7c8051aa515581dAart Biknamespace art {
3469ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
3569ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bikclass DexDumpTest : public CommonRuntimeTest {
3669ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik protected:
3769ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  virtual void SetUp() {
3869ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    CommonRuntimeTest::SetUp();
3969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    // Dogfood our own lib core dex file.
40121b25e246b7012cfd895f205855c6102da48305Przemyslaw Szczepaniak    dex_file_ = GetLibCoreDexFileNames()[0];
4169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  }
4269ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
4369ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  // Runs test with given arguments.
4469ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  bool Exec(const std::vector<std::string>& args, std::string* error_msg) {
4522c26f5b454b56a20215cb8bbc5e8afcaccafdb0Aart Bik    // TODO(ajcbik): dexdump2 -> dexdump
465ed8b2dfbdf1b487334a661bc5b8dc8ac880e435Elliott Hughes    std::string file_path = GetTestAndroidRoot() + "/bin/dexdump2";
4769ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    EXPECT_TRUE(OS::FileExists(file_path.c_str())) << file_path << " should be a valid file path";
4869ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    std::vector<std::string> exec_argv = { file_path };
4969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    exec_argv.insert(exec_argv.end(), args.begin(), args.end());
5069ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    return ::art::Exec(exec_argv, error_msg);
5169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  }
5269ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
5369ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  std::string dex_file_;
5469ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik};
5569ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
5669ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
5769ae54abd4eaad54dc73b75ea7c8051aa515581dAart BikTEST_F(DexDumpTest, NoInputFileGiven) {
5869ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  std::string error_msg;
5969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  ASSERT_FALSE(Exec({}, &error_msg)) << error_msg;
6069ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik}
6169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
6269ae54abd4eaad54dc73b75ea7c8051aa515581dAart BikTEST_F(DexDumpTest, CantOpenOutput) {
6369ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  std::string error_msg;
6469ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  ASSERT_FALSE(Exec({"-o", "/joho", dex_file_}, &error_msg)) << error_msg;
6569ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik}
6669ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
6769ae54abd4eaad54dc73b75ea7c8051aa515581dAart BikTEST_F(DexDumpTest, BadFlagCombination) {
6869ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  std::string error_msg;
6969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  ASSERT_FALSE(Exec({"-c", "-i", dex_file_}, &error_msg)) << error_msg;
7069ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik}
7169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
7269ae54abd4eaad54dc73b75ea7c8051aa515581dAart BikTEST_F(DexDumpTest, FullPlainOutput) {
7369ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  std::string error_msg;
7469ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  ASSERT_TRUE(Exec({"-d", "-f", "-h", "-l", "plain", "-o", "/dev/null",
7569ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    dex_file_}, &error_msg)) << error_msg;
7669ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik}
7769ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
7869ae54abd4eaad54dc73b75ea7c8051aa515581dAart BikTEST_F(DexDumpTest, XMLOutput) {
7969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  std::string error_msg;
8069ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  ASSERT_TRUE(Exec({"-l", "xml", "-o", "/dev/null",
8169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    dex_file_}, &error_msg)) << error_msg;
8269ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik}
8369ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
8469ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik}  // namespace art
85