Index: chrome_elf/elf_imports_unittest.cc |
diff --git a/chrome_elf/elf_imports_unittest.cc b/chrome_elf/elf_imports_unittest.cc |
index 1e399ae83fd335cba82f62c980bfb5f41286c0e1..e466c9b4ac36aa5835ddf63404e38b10b182d6e3 100644 |
--- a/chrome_elf/elf_imports_unittest.cc |
+++ b/chrome_elf/elf_imports_unittest.cc |
@@ -9,12 +9,14 @@ |
#include <vector> |
#include "base/base_paths.h" |
+#include "base/command_line.h" |
#include "base/compiler_specific.h" |
#include "base/files/file_path.h" |
#include "base/files/memory_mapped_file.h" |
#include "base/path_service.h" |
#include "base/strings/pattern.h" |
#include "base/strings/string_util.h" |
+#include "base/test/launcher/test_launcher.h" |
#include "base/win/pe_image.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -63,6 +65,7 @@ class ELFImportsTest : public testing::Test { |
// If you break this test, you may have changed base or the Windows sandbox |
// such that more system imports are required to link. |
#if defined(NDEBUG) && !defined(COMPONENT_BUILD) |
+ |
TEST_F(ELFImportsTest, ChromeElfSanityCheck) { |
base::FilePath dll; |
ASSERT_TRUE(PathService::Get(base::DIR_EXE, &dll)); |
@@ -103,7 +106,37 @@ TEST_F(ELFImportsTest, ChromeElfSanityCheck) { |
ASSERT_TRUE(match) << "Illegal import in chrome_elf.dll: " << import; |
} |
} |
+ |
TEST_F(ELFImportsTest, ChromeElfLoadSanityTest) { |
+ // chrome_elf will try to launch crashpad_handler by reinvoking the current |
+ // binary with --type=crashpad-handler if not already running that way. To |
+ // avoid that, we relaunch and run the real test body manually, adding that |
+ // command line argument, as we're only trying to confirm that user32.dll |
+ // doesn't get loaded by import table when chrome_elf.dll does. |
+ base::CommandLine new_test = |
+ base::CommandLine(base::CommandLine::ForCurrentProcess()->GetProgram()); |
+ new_test.AppendSwitchASCII( |
+ base::kGTestFilterFlag, |
+ "ELFImportsTest.DISABLED_ChromeElfLoadSanityTestImpl"); |
+ new_test.AppendSwitchASCII("type", "crashpad-handler"); |
+ new_test.AppendSwitch("gtest_also_run_disabled_tests"); |
+ new_test.AppendSwitch("single-process-tests"); |
+ |
+ std::string output; |
+ ASSERT_TRUE(base::GetAppOutput(new_test, &output)); |
+ std::string crash_string = |
+ "OK ] ELFImportsTest.DISABLED_ChromeElfLoadSanityTestImpl"; |
+ |
+ if (output.find(crash_string) == std::string::npos) { |
+ GTEST_FAIL() << "Couldn't find\n" << crash_string << "\n in output\n " |
+ << output; |
+ } |
+} |
+ |
+// Note: This test is not actually disabled, it's just tagged disabled so that |
+// the real run (above, in ChromeElfLoadSanityTest) can run it with an argument |
+// added to the command line. |
+TEST_F(ELFImportsTest, DISABLED_ChromeElfLoadSanityTestImpl) { |
base::FilePath dll; |
ASSERT_TRUE(PathService::Get(base::DIR_EXE, &dll)); |
dll = dll.Append(L"chrome_elf.dll"); |
@@ -119,7 +152,8 @@ TEST_F(ELFImportsTest, ChromeElfLoadSanityTest) { |
EXPECT_EQ(nullptr, ::GetModuleHandle(L"user32.dll")); |
EXPECT_TRUE(!!::FreeLibrary(chrome_elf_module_handle)); |
} |
-#endif // NDEBUG |
+ |
+#endif // NDEBUG && !COMPONENT_BUILD |
TEST_F(ELFImportsTest, ChromeExeSanityCheck) { |
std::vector<std::string> exe_imports; |