12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 16fc322c72d7a89a6f7a05c8bdc232d780aecd9232Carl Shapiro 17491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian Carlstrom#include "parsed_options.h" 1890a3369d3b6238f1a4c9b19ca68978dab1c39bc4Elliott Hughes 19700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers#include <memory> 20700a402244a1a423da4f3ba8032459f4b65fa18fIan Rogers 21a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe#include "arch/instruction_set.h" 22a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe#include "base/stringprintf.h" 23a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#include "common_runtime_test.h" 24fc322c72d7a89a6f7a05c8bdc232d780aecd9232Carl Shapiro 25fc322c72d7a89a6f7a05c8bdc232d780aecd9232Carl Shapironamespace art { 26fc322c72d7a89a6f7a05c8bdc232d780aecd9232Carl Shapiro 27eb6c7c23a8065af665e71f3408980bacd8ecc529Igor Murashkinclass ParsedOptionsTest : public ::testing::Test { 28eb6c7c23a8065af665e71f3408980bacd8ecc529Igor Murashkin public: 29eb6c7c23a8065af665e71f3408980bacd8ecc529Igor Murashkin static void SetUpTestCase() { 30eb6c7c23a8065af665e71f3408980bacd8ecc529Igor Murashkin CommonRuntimeTest::SetUpAndroidRoot(); 31eb6c7c23a8065af665e71f3408980bacd8ecc529Igor Murashkin } 32eb6c7c23a8065af665e71f3408980bacd8ecc529Igor Murashkin}; 33fc322c72d7a89a6f7a05c8bdc232d780aecd9232Carl Shapiro 34491ca9e75fad381468dd7f5fdbff56d1a9738dd7Brian CarlstromTEST_F(ParsedOptionsTest, ParsedOptions) { 35f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom void* test_vfprintf = reinterpret_cast<void*>(0xa); 36f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom void* test_abort = reinterpret_cast<void*>(0xb); 37f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom void* test_exit = reinterpret_cast<void*>(0xc); 3869b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom 3969b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom std::string boot_class_path; 405b8e6e36e96d6d1921dd356fa46191d1e6a18082Przemyslaw Szczepaniak std::string class_path; 4169b15fb098162f19a4c20e6dccdcead04d9c77f0Brian Carlstrom boot_class_path += "-Xbootclasspath:"; 425b8e6e36e96d6d1921dd356fa46191d1e6a18082Przemyslaw Szczepaniak 435b8e6e36e96d6d1921dd356fa46191d1e6a18082Przemyslaw Szczepaniak bool first_dex_file = true; 44d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath for (const std::string &dex_file_name : 45d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath CommonRuntimeTest::GetLibCoreDexFileNames()) { 465b8e6e36e96d6d1921dd356fa46191d1e6a18082Przemyslaw Szczepaniak if (!first_dex_file) { 475b8e6e36e96d6d1921dd356fa46191d1e6a18082Przemyslaw Szczepaniak class_path += ":"; 485b8e6e36e96d6d1921dd356fa46191d1e6a18082Przemyslaw Szczepaniak } else { 495b8e6e36e96d6d1921dd356fa46191d1e6a18082Przemyslaw Szczepaniak first_dex_file = false; 505b8e6e36e96d6d1921dd356fa46191d1e6a18082Przemyslaw Szczepaniak } 515b8e6e36e96d6d1921dd356fa46191d1e6a18082Przemyslaw Szczepaniak class_path += dex_file_name; 525b8e6e36e96d6d1921dd356fa46191d1e6a18082Przemyslaw Szczepaniak } 535b8e6e36e96d6d1921dd356fa46191d1e6a18082Przemyslaw Szczepaniak boot_class_path += class_path; 54f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom 55e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers RuntimeOptions options; 562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier options.push_back(std::make_pair(boot_class_path.c_str(), nullptr)); 572cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier options.push_back(std::make_pair("-classpath", nullptr)); 58d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath options.push_back(std::make_pair(class_path.c_str(), nullptr)); 592cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier options.push_back(std::make_pair("-cp", nullptr)); 60d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath options.push_back(std::make_pair(class_path.c_str(), nullptr)); 612cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier options.push_back(std::make_pair("-Ximage:boot_image", nullptr)); 622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier options.push_back(std::make_pair("-Xcheck:jni", nullptr)); 632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier options.push_back(std::make_pair("-Xms2048", nullptr)); 642cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier options.push_back(std::make_pair("-Xmx4k", nullptr)); 652cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier options.push_back(std::make_pair("-Xss1m", nullptr)); 662cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier options.push_back(std::make_pair("-XX:HeapTargetUtilization=0.75", nullptr)); 672cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier options.push_back(std::make_pair("-Dfoo=bar", nullptr)); 682cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier options.push_back(std::make_pair("-Dbaz=qux", nullptr)); 692cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier options.push_back(std::make_pair("-verbose:gc,class,jni", nullptr)); 70f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom options.push_back(std::make_pair("vfprintf", test_vfprintf)); 71f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom options.push_back(std::make_pair("abort", test_abort)); 72f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom options.push_back(std::make_pair("exit", test_exit)); 73aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin 74aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin RuntimeArgumentMap map; 7588b2b80aed15bb1f931cddd40e44ca525ef10018Vladimir Marko bool parsed = ParsedOptions::Parse(options, false, &map); 7688b2b80aed15bb1f931cddd40e44ca525ef10018Vladimir Marko ASSERT_TRUE(parsed); 77aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin ASSERT_NE(0u, map.Size()); 78aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin 79aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin using Opt = RuntimeArgumentMap; 80f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom 81aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin#define EXPECT_PARSED_EQ(expected, actual_key) EXPECT_EQ(expected, map.GetOrDefault(actual_key)) 82aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin#define EXPECT_PARSED_EXISTS(actual_key) EXPECT_TRUE(map.Exists(actual_key)) 83aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin 84d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath EXPECT_PARSED_EQ(class_path, Opt::BootClassPath); 85d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath EXPECT_PARSED_EQ(class_path, Opt::ClassPath); 86aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin EXPECT_PARSED_EQ(std::string("boot_image"), Opt::Image); 87aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin EXPECT_PARSED_EXISTS(Opt::CheckJni); 88aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin EXPECT_PARSED_EQ(2048U, Opt::MemoryInitialSize); 89aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin EXPECT_PARSED_EQ(4 * KB, Opt::MemoryMaximumSize); 90aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin EXPECT_PARSED_EQ(1 * MB, Opt::StackSize); 91aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin EXPECT_DOUBLE_EQ(0.75, map.GetOrDefault(Opt::HeapTargetUtilization)); 92aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin EXPECT_TRUE(test_vfprintf == map.GetOrDefault(Opt::HookVfprintf)); 93aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin EXPECT_TRUE(test_exit == map.GetOrDefault(Opt::HookExit)); 94aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin EXPECT_TRUE(test_abort == map.GetOrDefault(Opt::HookAbort)); 954dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes EXPECT_TRUE(VLOG_IS_ON(class_linker)); 964dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes EXPECT_FALSE(VLOG_IS_ON(compiler)); 974dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes EXPECT_FALSE(VLOG_IS_ON(heap)); 984dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes EXPECT_TRUE(VLOG_IS_ON(gc)); 994dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes EXPECT_FALSE(VLOG_IS_ON(jdwp)); 1004dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes EXPECT_TRUE(VLOG_IS_ON(jni)); 1014dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes EXPECT_FALSE(VLOG_IS_ON(monitor)); 102751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang EXPECT_FALSE(VLOG_IS_ON(signals)); 103751beff19b36f777d9e3a966d754fd9cfad5d534Phil Wang EXPECT_FALSE(VLOG_IS_ON(simulator)); 1044dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes EXPECT_FALSE(VLOG_IS_ON(startup)); 1054dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes EXPECT_FALSE(VLOG_IS_ON(third_party_jni)); 1064dd9b4d95eec9db5338fb9bf132f9bb8facf6cf4Elliott Hughes EXPECT_FALSE(VLOG_IS_ON(threads)); 107aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin 108aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin auto&& properties_list = map.GetOrDefault(Opt::PropertiesList); 109aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin ASSERT_EQ(2U, properties_list.size()); 110aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin EXPECT_EQ("foo=bar", properties_list[0]); 111aaebaa0121be3b9d9f13630585304482cbcaeb4bIgor Murashkin EXPECT_EQ("baz=qux", properties_list[1]); 112f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom} 113f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom 1142798da180524dde1f923b4ee964877546bd6bb44Igor MurashkinTEST_F(ParsedOptionsTest, ParsedOptionsGc) { 1152798da180524dde1f923b4ee964877546bd6bb44Igor Murashkin RuntimeOptions options; 1162798da180524dde1f923b4ee964877546bd6bb44Igor Murashkin options.push_back(std::make_pair("-Xgc:MC", nullptr)); 1172798da180524dde1f923b4ee964877546bd6bb44Igor Murashkin 1182798da180524dde1f923b4ee964877546bd6bb44Igor Murashkin RuntimeArgumentMap map; 11988b2b80aed15bb1f931cddd40e44ca525ef10018Vladimir Marko bool parsed = ParsedOptions::Parse(options, false, &map); 12088b2b80aed15bb1f931cddd40e44ca525ef10018Vladimir Marko ASSERT_TRUE(parsed); 1212798da180524dde1f923b4ee964877546bd6bb44Igor Murashkin ASSERT_NE(0u, map.Size()); 1222798da180524dde1f923b4ee964877546bd6bb44Igor Murashkin 1232798da180524dde1f923b4ee964877546bd6bb44Igor Murashkin using Opt = RuntimeArgumentMap; 1242798da180524dde1f923b4ee964877546bd6bb44Igor Murashkin 1252798da180524dde1f923b4ee964877546bd6bb44Igor Murashkin EXPECT_TRUE(map.Exists(Opt::GcOption)); 1262798da180524dde1f923b4ee964877546bd6bb44Igor Murashkin 1272798da180524dde1f923b4ee964877546bd6bb44Igor Murashkin XGcOption xgc = map.GetOrDefault(Opt::GcOption); 128a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe EXPECT_EQ(gc::kCollectorTypeMC, xgc.collector_type_); 129a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe} 130a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe 131a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas GampeTEST_F(ParsedOptionsTest, ParsedOptionsInstructionSet) { 132a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe using Opt = RuntimeArgumentMap; 133a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe 134a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe { 135a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe // Nothing set, should be kRuntimeISA. 136a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe RuntimeOptions options; 137a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe RuntimeArgumentMap map; 138a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe bool parsed = ParsedOptions::Parse(options, false, &map); 139a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe ASSERT_TRUE(parsed); 140a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe InstructionSet isa = map.GetOrDefault(Opt::ImageInstructionSet); 141a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe EXPECT_EQ(kRuntimeISA, isa); 142a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe } 143a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe 144a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe const char* isa_strings[] = { "arm", "arm64", "x86", "x86_64", "mips", "mips64" }; 145a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe InstructionSet ISAs[] = { InstructionSet::kArm, 146a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe InstructionSet::kArm64, 147a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe InstructionSet::kX86, 148a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe InstructionSet::kX86_64, 149a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe InstructionSet::kMips, 150a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe InstructionSet::kMips64 }; 151a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe static_assert(arraysize(isa_strings) == arraysize(ISAs), "Need same amount."); 152a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe 153a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe for (size_t i = 0; i < arraysize(isa_strings); ++i) { 154a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe RuntimeOptions options; 155a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe options.push_back(std::make_pair("imageinstructionset", isa_strings[i])); 156a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe RuntimeArgumentMap map; 157a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe bool parsed = ParsedOptions::Parse(options, false, &map); 158a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe ASSERT_TRUE(parsed); 159a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe InstructionSet isa = map.GetOrDefault(Opt::ImageInstructionSet); 160a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe EXPECT_EQ(ISAs[i], isa); 161a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe } 162a00f012660e9a4baa34c0ab96042f7146e9a6017Andreas Gampe} 1632798da180524dde1f923b4ee964877546bd6bb44Igor Murashkin 164f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom} // namespace art 165