Home | History | Annotate | Download | only in runtime
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "parsed_options.h"
     18 
     19 #include <memory>
     20 
     21 #include "arch/instruction_set.h"
     22 #include "common_runtime_test.h"
     23 
     24 namespace art {
     25 
     26 class ParsedOptionsTest : public ::testing::Test {
     27  public:
     28   static void SetUpTestCase() {
     29     CommonRuntimeTest::SetUpAndroidRoot();
     30   }
     31 };
     32 
     33 TEST_F(ParsedOptionsTest, ParsedOptions) {
     34   void* test_vfprintf = reinterpret_cast<void*>(0xa);
     35   void* test_abort = reinterpret_cast<void*>(0xb);
     36   void* test_exit = reinterpret_cast<void*>(0xc);
     37 
     38   std::string boot_class_path;
     39   std::string class_path;
     40   boot_class_path += "-Xbootclasspath:";
     41 
     42   bool first_dex_file = true;
     43   for (const std::string &dex_file_name :
     44            CommonRuntimeTest::GetLibCoreDexFileNames()) {
     45     if (!first_dex_file) {
     46       class_path += ":";
     47     } else {
     48       first_dex_file = false;
     49     }
     50     class_path += dex_file_name;
     51   }
     52   boot_class_path += class_path;
     53 
     54   RuntimeOptions options;
     55   options.push_back(std::make_pair(boot_class_path.c_str(), nullptr));
     56   options.push_back(std::make_pair("-classpath", nullptr));
     57   options.push_back(std::make_pair(class_path.c_str(), nullptr));
     58   options.push_back(std::make_pair("-cp", nullptr));
     59   options.push_back(std::make_pair(class_path.c_str(), nullptr));
     60   options.push_back(std::make_pair("-Ximage:boot_image", nullptr));
     61   options.push_back(std::make_pair("-Xcheck:jni", nullptr));
     62   options.push_back(std::make_pair("-Xms2048", nullptr));
     63   options.push_back(std::make_pair("-Xmx4k", nullptr));
     64   options.push_back(std::make_pair("-Xss1m", nullptr));
     65   options.push_back(std::make_pair("-XX:HeapTargetUtilization=0.75", nullptr));
     66   options.push_back(std::make_pair("-Dfoo=bar", nullptr));
     67   options.push_back(std::make_pair("-Dbaz=qux", nullptr));
     68   options.push_back(std::make_pair("-verbose:gc,class,jni", nullptr));
     69   options.push_back(std::make_pair("vfprintf", test_vfprintf));
     70   options.push_back(std::make_pair("abort", test_abort));
     71   options.push_back(std::make_pair("exit", test_exit));
     72 
     73   RuntimeArgumentMap map;
     74   bool parsed = ParsedOptions::Parse(options, false, &map);
     75   ASSERT_TRUE(parsed);
     76   ASSERT_NE(0u, map.Size());
     77 
     78   using Opt = RuntimeArgumentMap;
     79 
     80 #define EXPECT_PARSED_EQ(expected, actual_key) EXPECT_EQ(expected, map.GetOrDefault(actual_key))
     81 #define EXPECT_PARSED_EXISTS(actual_key) EXPECT_TRUE(map.Exists(actual_key))
     82 
     83   EXPECT_PARSED_EQ(class_path, Opt::BootClassPath);
     84   EXPECT_PARSED_EQ(class_path, Opt::ClassPath);
     85   EXPECT_PARSED_EQ(std::string("boot_image"), Opt::Image);
     86   EXPECT_PARSED_EXISTS(Opt::CheckJni);
     87   EXPECT_PARSED_EQ(2048U, Opt::MemoryInitialSize);
     88   EXPECT_PARSED_EQ(4 * KB, Opt::MemoryMaximumSize);
     89   EXPECT_PARSED_EQ(1 * MB, Opt::StackSize);
     90   EXPECT_DOUBLE_EQ(0.75, map.GetOrDefault(Opt::HeapTargetUtilization));
     91   EXPECT_TRUE(test_vfprintf == map.GetOrDefault(Opt::HookVfprintf));
     92   EXPECT_TRUE(test_exit == map.GetOrDefault(Opt::HookExit));
     93   EXPECT_TRUE(test_abort == map.GetOrDefault(Opt::HookAbort));
     94   EXPECT_TRUE(VLOG_IS_ON(class_linker));
     95   EXPECT_FALSE(VLOG_IS_ON(compiler));
     96   EXPECT_FALSE(VLOG_IS_ON(heap));
     97   EXPECT_TRUE(VLOG_IS_ON(gc));
     98   EXPECT_FALSE(VLOG_IS_ON(jdwp));
     99   EXPECT_TRUE(VLOG_IS_ON(jni));
    100   EXPECT_FALSE(VLOG_IS_ON(monitor));
    101   EXPECT_FALSE(VLOG_IS_ON(signals));
    102   EXPECT_FALSE(VLOG_IS_ON(simulator));
    103   EXPECT_FALSE(VLOG_IS_ON(startup));
    104   EXPECT_FALSE(VLOG_IS_ON(third_party_jni));
    105   EXPECT_FALSE(VLOG_IS_ON(threads));
    106 
    107   auto&& properties_list = map.GetOrDefault(Opt::PropertiesList);
    108   ASSERT_EQ(2U, properties_list.size());
    109   EXPECT_EQ("foo=bar", properties_list[0]);
    110   EXPECT_EQ("baz=qux", properties_list[1]);
    111 }
    112 
    113 TEST_F(ParsedOptionsTest, ParsedOptionsGc) {
    114   RuntimeOptions options;
    115   options.push_back(std::make_pair("-Xgc:MC", nullptr));
    116 
    117   RuntimeArgumentMap map;
    118   bool parsed = ParsedOptions::Parse(options, false, &map);
    119   ASSERT_TRUE(parsed);
    120   ASSERT_NE(0u, map.Size());
    121 
    122   using Opt = RuntimeArgumentMap;
    123 
    124   EXPECT_TRUE(map.Exists(Opt::GcOption));
    125 
    126   XGcOption xgc = map.GetOrDefault(Opt::GcOption);
    127   EXPECT_EQ(gc::kCollectorTypeMC, xgc.collector_type_);
    128 }
    129 
    130 TEST_F(ParsedOptionsTest, ParsedOptionsInstructionSet) {
    131   using Opt = RuntimeArgumentMap;
    132 
    133   {
    134     // Nothing set, should be kRuntimeISA.
    135     RuntimeOptions options;
    136     RuntimeArgumentMap map;
    137     bool parsed = ParsedOptions::Parse(options, false, &map);
    138     ASSERT_TRUE(parsed);
    139     InstructionSet isa = map.GetOrDefault(Opt::ImageInstructionSet);
    140     EXPECT_EQ(kRuntimeISA, isa);
    141   }
    142 
    143   const char* isa_strings[] = { "arm", "arm64", "x86", "x86_64", "mips", "mips64" };
    144   InstructionSet ISAs[] = { InstructionSet::kArm,
    145                             InstructionSet::kArm64,
    146                             InstructionSet::kX86,
    147                             InstructionSet::kX86_64,
    148                             InstructionSet::kMips,
    149                             InstructionSet::kMips64 };
    150   static_assert(arraysize(isa_strings) == arraysize(ISAs), "Need same amount.");
    151 
    152   for (size_t i = 0; i < arraysize(isa_strings); ++i) {
    153     RuntimeOptions options;
    154     options.push_back(std::make_pair("imageinstructionset", isa_strings[i]));
    155     RuntimeArgumentMap map;
    156     bool parsed = ParsedOptions::Parse(options, false, &map);
    157     ASSERT_TRUE(parsed);
    158     InstructionSet isa = map.GetOrDefault(Opt::ImageInstructionSet);
    159     EXPECT_EQ(ISAs[i], isa);
    160   }
    161 }
    162 
    163 }  // namespace art
    164