| Index: sandbox/win/src/address_sanitizer_test.cc
|
| diff --git a/sandbox/win/src/address_sanitizer_test.cc b/sandbox/win/src/address_sanitizer_test.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6f7db4c418fa6a22a68f8e8e53af9abdf4f3b29c
|
| --- /dev/null
|
| +++ b/sandbox/win/src/address_sanitizer_test.cc
|
| @@ -0,0 +1,92 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <stdio.h>
|
| +
|
| +#include "base/environment.h"
|
| +#include "base/files/file_path.h"
|
| +#include "base/files/file_util.h"
|
| +#include "base/path_service.h"
|
| +#include "base/win/windows_version.h"
|
| +#include "sandbox/win/tests/common/controller.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace sandbox {
|
| +
|
| +class AddressSanitizerTests : public ::testing::Test {
|
| + public:
|
| + void SetUp() {
|
| + env_.reset(base::Environment::Create());
|
| + had_asan_options_ = env_->GetVar("ASAN_OPTIONS", &old_asan_options_);
|
| + }
|
| +
|
| + void TearDown() {
|
| + if (had_asan_options_)
|
| + ASSERT_TRUE(env_->SetVar("ASAN_OPTIONS", old_asan_options_));
|
| + else
|
| + env_->UnSetVar("ASAN_OPTIONS");
|
| + }
|
| +
|
| + protected:
|
| + scoped_ptr<base::Environment> env_;
|
| + bool had_asan_options_;
|
| + std::string old_asan_options_;
|
| +};
|
| +
|
| +SBOX_TESTS_COMMAND int AddressSanitizerTests_Report(int argc, wchar_t** argv) {
|
| + volatile int idx = 42;
|
| + int *blah = new int[42];
|
| + blah[idx] = 42;
|
| + return SBOX_TEST_FAILED;
|
| +}
|
| +
|
| +#if defined(ADDRESS_SANITIZER)
|
| +TEST_F(AddressSanitizerTests, TestAddressSanitizer) {
|
| + wchar_t temp_directory[MAX_PATH];
|
| + wchar_t temp_file_name[MAX_PATH];
|
| + ASSERT_NE(::GetTempPath(MAX_PATH, temp_directory), 0u);
|
| + ASSERT_NE(::GetTempFileName(temp_directory, L"test", 0, temp_file_name), 0u);
|
| +
|
| + SECURITY_ATTRIBUTES attrs = {};
|
| + attrs.nLength = sizeof(attrs);
|
| + attrs.bInheritHandle = TRUE;
|
| + HANDLE file_handle = CreateFile(
|
| + temp_file_name, GENERIC_WRITE,
|
| + FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
|
| + &attrs, OPEN_EXISTING, 0, NULL);
|
| + ASSERT_NE(file_handle, INVALID_HANDLE_VALUE);
|
| +
|
| + TestRunner runner;
|
| + ASSERT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetStderrHandle(file_handle));
|
| +
|
| + base::FilePath exe;
|
| + ASSERT_TRUE(PathService::Get(base::FILE_EXE, &exe));
|
| + base::FilePath pdb_path = exe.DirName().Append(L"*.pdb");
|
| + ASSERT_TRUE(runner.AddFsRule(sandbox::TargetPolicy::FILES_ALLOW_READONLY,
|
| + pdb_path.value().c_str()));
|
| +
|
| + env_->SetVar("ASAN_OPTIONS", "exitcode=123");
|
| + int result = runner.RunTest(L"AddressSanitizerTests_Report");
|
| + EXPECT_EQ(123, result);
|
| + EXPECT_TRUE(::CloseHandle(file_handle));
|
| +
|
| + std::string data;
|
| + ASSERT_TRUE(base::ReadFileToString(base::FilePath(temp_file_name), &data));
|
| + // Redirection uses a feature that was added in Windows Vista.
|
| + if (base::win::GetVersion() >= base::win::VERSION_VISTA) {
|
| + ASSERT_TRUE(strstr(data.c_str(), "ERROR: AddressSanitizer"))
|
| + << "There doesn't seem to be an ASan report:\n" << data;
|
| + ASSERT_TRUE(strstr(data.c_str(), "AddressSanitizerTests_Report"))
|
| + << "The ASan report doesn't appear to be symbolized:\n" << data;
|
| + ASSERT_TRUE(strstr(data.c_str(), strrchr(__FILE__, '\\')))
|
| + << "The stack trace doesn't have a correct filename:\n" << data;
|
| + } else {
|
| + EXPECT_EQ("", data);
|
| + }
|
| +
|
| + EXPECT_TRUE(::DeleteFile(temp_file_name));
|
| +}
|
| +#endif
|
| +
|
| +}
|
|
|