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 "common_runtime_test.h"
2569ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include "runtime/arch/instruction_set.h"
2697c381e3ce34cd327c2ec35fa850bd0eaa9b697fDavid Sehr#include "runtime/exec_utils.h"
2769ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include "runtime/os.h"
2869ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include "runtime/utils.h"
2969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik#include "utils.h"
3069ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
3169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Biknamespace art {
3269ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
3369ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bikclass DexDumpTest : public CommonRuntimeTest {
3469ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik protected:
3569ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  virtual void SetUp() {
3669ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    CommonRuntimeTest::SetUp();
3769ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    // Dogfood our own lib core dex file.
38121b25e246b7012cfd895f205855c6102da48305Przemyslaw Szczepaniak    dex_file_ = GetLibCoreDexFileNames()[0];
3969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  }
4069ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
4169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  // Runs test with given arguments.
4269ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  bool Exec(const std::vector<std::string>& args, std::string* error_msg) {
4322c26f5b454b56a20215cb8bbc5e8afcaccafdb0Aart Bik    // TODO(ajcbik): dexdump2 -> dexdump
445ed8b2dfbdf1b487334a661bc5b8dc8ac880e435Elliott Hughes    std::string file_path = GetTestAndroidRoot() + "/bin/dexdump2";
4569ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    EXPECT_TRUE(OS::FileExists(file_path.c_str())) << file_path << " should be a valid file path";
4669ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    std::vector<std::string> exec_argv = { file_path };
4769ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    exec_argv.insert(exec_argv.end(), args.begin(), args.end());
4869ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    return ::art::Exec(exec_argv, error_msg);
4969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  }
5069ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
5169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  std::string dex_file_;
5269ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik};
5369ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
5469ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
5569ae54abd4eaad54dc73b75ea7c8051aa515581dAart BikTEST_F(DexDumpTest, NoInputFileGiven) {
5669ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  std::string error_msg;
5769ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  ASSERT_FALSE(Exec({}, &error_msg)) << error_msg;
5869ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik}
5969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
6069ae54abd4eaad54dc73b75ea7c8051aa515581dAart BikTEST_F(DexDumpTest, CantOpenOutput) {
6169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  std::string error_msg;
6269ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  ASSERT_FALSE(Exec({"-o", "/joho", dex_file_}, &error_msg)) << error_msg;
6369ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik}
6469ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
6569ae54abd4eaad54dc73b75ea7c8051aa515581dAart BikTEST_F(DexDumpTest, BadFlagCombination) {
6669ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  std::string error_msg;
6769ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  ASSERT_FALSE(Exec({"-c", "-i", dex_file_}, &error_msg)) << error_msg;
6869ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik}
6969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
7069ae54abd4eaad54dc73b75ea7c8051aa515581dAart BikTEST_F(DexDumpTest, FullPlainOutput) {
7169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  std::string error_msg;
7269ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  ASSERT_TRUE(Exec({"-d", "-f", "-h", "-l", "plain", "-o", "/dev/null",
7369ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    dex_file_}, &error_msg)) << error_msg;
7469ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik}
7569ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
7669ae54abd4eaad54dc73b75ea7c8051aa515581dAart BikTEST_F(DexDumpTest, XMLOutput) {
7769ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  std::string error_msg;
7869ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik  ASSERT_TRUE(Exec({"-l", "xml", "-o", "/dev/null",
7969ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik    dex_file_}, &error_msg)) << error_msg;
8069ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik}
8169ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik
8269ae54abd4eaad54dc73b75ea7c8051aa515581dAart Bik}  // namespace art
83