From 5cac9f0abba7db330f7bded033c5201c57e5b141 Mon Sep 17 00:00:00 2001 From: Yabin Cui Date: Fri, 18 Jun 2021 16:28:54 -0700 Subject: simpleperf: update testdata used for testing reading dex files. libdexfile only supports reading the latest version of compact dex file. After bumping compact dex file version to v2, libdexfile no longer supports reading symbols from old compact dex files. So temporarily disable base.vdex for testing. And add base_with_cdex_v2.vdex to test the new version. Bug: 191480616 Test: run simpleperf_unit_test Change-Id: Iaa3762e295cd1d9418b8e49ee29fb98518d7d09b (cherry picked from commit 371ed7afc58655c639ab685f2a1bd20ca8c0ca14) --- simpleperf/dso_test.cpp | 36 ++++++++++++++++------------- simpleperf/get_test_data.h | 28 ++++++++++++++++++++++ simpleperf/read_dex_file_test.cpp | 24 +++++++++++-------- simpleperf/testdata/base.vdex | Bin 2046136 -> 0 bytes simpleperf/testdata/base_with_cdex_v1.vdex | Bin 0 -> 2046136 bytes simpleperf/testdata/base_with_cdex_v2.vdex | Bin 0 -> 2626976 bytes 6 files changed, 63 insertions(+), 25 deletions(-) delete mode 100644 simpleperf/testdata/base.vdex create mode 100644 simpleperf/testdata/base_with_cdex_v1.vdex create mode 100644 simpleperf/testdata/base_with_cdex_v2.vdex diff --git a/simpleperf/dso_test.cpp b/simpleperf/dso_test.cpp index 02958ce6..c8618036 100644 --- a/simpleperf/dso_test.cpp +++ b/simpleperf/dso_test.cpp @@ -152,24 +152,28 @@ TEST(DebugElfFileFinder, build_id_mismatch) { TEST(dso, dex_file_dso) { #if defined(__linux__) for (DsoType dso_type : {DSO_DEX_FILE, DSO_ELF_FILE}) { - std::unique_ptr dso = Dso::CreateDso(dso_type, GetTestData("base.vdex")); - ASSERT_TRUE(dso); - dso->AddDexFileOffset(0x28); - ASSERT_EQ(DSO_DEX_FILE, dso->type()); - const Symbol* symbol = dso->FindSymbol(0x6c77e); - ASSERT_NE(symbol, nullptr); - ASSERT_EQ(symbol->addr, static_cast(0x6c77e)); - ASSERT_EQ(symbol->len, static_cast(0x16)); - ASSERT_STREQ(symbol->DemangledName(), - "com.example.simpleperf.simpleperfexamplewithnative.MixActivity$1.run"); - uint64_t min_vaddr; - uint64_t file_offset_of_min_vaddr; - dso->GetMinExecutableVaddr(&min_vaddr, &file_offset_of_min_vaddr); - ASSERT_EQ(min_vaddr, 0); - ASSERT_EQ(file_offset_of_min_vaddr, 0); + for (const DexFileTestData& entry : dex_file_test_data) { + if (entry.filename == "base_with_cdex_v1.vdex") { + continue; // TODO: reenable it. + } + std::unique_ptr dso = Dso::CreateDso(dso_type, GetTestData(entry.filename)); + ASSERT_TRUE(dso); + dso->AddDexFileOffset(entry.dexfile_offset); + ASSERT_EQ(DSO_DEX_FILE, dso->type()); + const Symbol* symbol = dso->FindSymbol(entry.symbol_addr); + ASSERT_NE(symbol, nullptr); + ASSERT_EQ(symbol->addr, entry.symbol_addr); + ASSERT_EQ(symbol->len, entry.symbol_len); + ASSERT_STREQ(symbol->DemangledName(), entry.symbol_name.c_str()); + uint64_t min_vaddr; + uint64_t file_offset_of_min_vaddr; + dso->GetMinExecutableVaddr(&min_vaddr, &file_offset_of_min_vaddr); + ASSERT_EQ(min_vaddr, 0); + ASSERT_EQ(file_offset_of_min_vaddr, 0); + } // Don't crash on not exist zip entry. - dso = Dso::CreateDso(dso_type, GetTestData("base.zip!/not_exist_entry")); + std::unique_ptr dso = Dso::CreateDso(dso_type, GetTestData("base.zip!/not_exist_entry")); ASSERT_TRUE(dso); ASSERT_EQ(nullptr, dso->FindSymbol(0)); } diff --git a/simpleperf/get_test_data.h b/simpleperf/get_test_data.h index 1ef663b9..b6a7999e 100644 --- a/simpleperf/get_test_data.h +++ b/simpleperf/get_test_data.h @@ -149,4 +149,32 @@ static const std::string PERF_DATA_WITH_IP_ZERO_IN_CALLCHAIN = // generated by `simpleperf record -e cs-etm:u ./etm_test_loop` static const std::string PERF_DATA_ETM_TEST_LOOP = "etm/perf.data"; +struct DexFileTestData { + std::string filename; + uint64_t dexfile_offset; + size_t symbol_count; + // One symbol in the dex file. + uint64_t symbol_addr; + uint64_t symbol_len; + std::string symbol_name; +}; + +static DexFileTestData dex_file_test_data[] = { + DexFileTestData{ + "base_with_cdex_v1.vdex", + 0x28, + 12435, + 0x6c77e, + 0x16, + "com.example.simpleperf.simpleperfexamplewithnative.MixActivity$1.run", + }, + DexFileTestData{ + "base_with_cdex_v2.vdex", + 0x40, + 16891, + 0x169b84, + 0x25a, + "com.android.calculator2.Calculator.onButtonClick", + }}; + #endif // SIMPLE_PERF_GET_TEST_DATA_H_ diff --git a/simpleperf/read_dex_file_test.cpp b/simpleperf/read_dex_file_test.cpp index 843a964c..fc72ceda 100644 --- a/simpleperf/read_dex_file_test.cpp +++ b/simpleperf/read_dex_file_test.cpp @@ -32,12 +32,18 @@ TEST(read_dex_file, smoke) { auto symbol_callback = [&](DexFileSymbol* symbol) { symbols.emplace_back(symbol->name, symbol->addr, symbol->size); }; - ASSERT_TRUE(ReadSymbolsFromDexFile(GetTestData("base.vdex"), {0x28}, symbol_callback)); - ASSERT_EQ(12435u, symbols.size()); - auto it = std::find_if(symbols.begin(), symbols.end(), - [](const Symbol& symbol) { return symbol.addr == 0x6c77e; }); - ASSERT_NE(it, symbols.end()); - ASSERT_EQ(it->addr, 0x6c77e); - ASSERT_EQ(it->len, 0x16); - ASSERT_STREQ(it->Name(), "com.example.simpleperf.simpleperfexamplewithnative.MixActivity$1.run"); -} + for (DexFileTestData& entry : dex_file_test_data) { + if (entry.filename == "base_with_cdex_v1.vdex") { + continue; // TODO: reenable it. + } + ASSERT_TRUE(ReadSymbolsFromDexFile(GetTestData(entry.filename), {entry.dexfile_offset}, + symbol_callback)); + ASSERT_EQ(entry.symbol_count, symbols.size()); + auto it = std::find_if(symbols.begin(), symbols.end(), + [&](const Symbol& symbol) { return symbol.addr == entry.symbol_addr; }); + ASSERT_NE(it, symbols.end()); + ASSERT_EQ(it->addr, entry.symbol_addr); + ASSERT_EQ(it->len, entry.symbol_len); + ASSERT_STREQ(it->Name(), entry.symbol_name.c_str()); + } +} \ No newline at end of file diff --git a/simpleperf/testdata/base.vdex b/simpleperf/testdata/base.vdex deleted file mode 100644 index b0ea0184..00000000 Binary files a/simpleperf/testdata/base.vdex and /dev/null differ diff --git a/simpleperf/testdata/base_with_cdex_v1.vdex b/simpleperf/testdata/base_with_cdex_v1.vdex new file mode 100644 index 00000000..b0ea0184 Binary files /dev/null and b/simpleperf/testdata/base_with_cdex_v1.vdex differ diff --git a/simpleperf/testdata/base_with_cdex_v2.vdex b/simpleperf/testdata/base_with_cdex_v2.vdex new file mode 100644 index 00000000..16ecc6fd Binary files /dev/null and b/simpleperf/testdata/base_with_cdex_v2.vdex differ -- cgit v1.2.3