2022-09-06 19:14:07 -04:00
|
|
|
|
// Copyright 2015 The Crashpad Authors
|
2015-03-11 17:07:11 -04:00
|
|
|
|
//
|
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
|
//
|
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
//
|
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
2015-05-01 13:48:23 -07:00
|
|
|
|
#include "snapshot/crashpad_info_client_options.h"
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
2017-11-15 12:43:44 -05:00
|
|
|
|
#include "base/auto_reset.h"
|
2015-03-11 17:07:11 -04:00
|
|
|
|
#include "base/files/file_path.h"
|
2015-05-01 15:49:35 -07:00
|
|
|
|
#include "base/strings/utf_string_conversions.h"
|
2015-05-01 13:48:23 -07:00
|
|
|
|
#include "build/build_config.h"
|
2015-03-11 17:07:11 -04:00
|
|
|
|
#include "client/crashpad_info.h"
|
|
|
|
|
#include "gtest/gtest.h"
|
2015-05-01 13:48:23 -07:00
|
|
|
|
#include "test/errors.h"
|
mac: Handle _dyld_get_all_image_infos() not being available on 10.13
_dyld_get_all_image_infos() was only used in test code in Crashpad.
This addresses two related problems.
When running on 10.13 or later, _dyld_get_all_image_infos() is not
available. It appears to still be implemented in dyld, but its symbol is
now private. This was always known to be an “internal” interface. When
it’s not available, fall back to obtaining the address of the process’
dyld_all_image_infos structure by calling task_info(…, TASK_DYLD_INFO,
…). Note that this is the same thing that the code being tested does,
although the tests are not rendered entirely pointless because the code
being tested consumes dyld_all_image_infos through its own
implementation of an out-of-process reader interface, while the
dyld_all_image_infos data obtained by _dyld_get_all_image_infos() is
handled strictly in-process by ordinary memory reads. This is covered by
bug 187.
When building with the 10.13 SDK, no _dyld_get_all_image_infos symbol is
available to link against. In this case, access the symbol strictly at
runtime via dlopen() if it may be available, or when expecting to only
run on 10.13 and later, don’t even bother looking for this symbol. This
is covered by part of bug 188.
Bug: crashpad:185, crashpad:187, crashpad:188
Change-Id: Ib283e070faf5d1ec35deee420213b53ec24fb1d3
Reviewed-on: https://chromium-review.googlesource.com/534633
Reviewed-by: Robert Sesek <rsesek@chromium.org>
2017-06-14 10:48:30 -04:00
|
|
|
|
#include "test/scoped_module_handle.h"
|
2017-04-03 13:53:11 -04:00
|
|
|
|
#include "test/test_paths.h"
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
2022-01-19 15:00:24 -05:00
|
|
|
|
#if BUILDFLAG(IS_APPLE)
|
2015-05-01 13:48:23 -07:00
|
|
|
|
#include <dlfcn.h>
|
|
|
|
|
#include "snapshot/mac/process_snapshot_mac.h"
|
2022-01-19 15:00:24 -05:00
|
|
|
|
#elif BUILDFLAG(IS_WIN)
|
2015-05-01 13:48:23 -07:00
|
|
|
|
#include <windows.h>
|
|
|
|
|
#include "snapshot/win/process_snapshot_win.h"
|
2022-01-19 15:00:24 -05:00
|
|
|
|
#elif BUILDFLAG(IS_FUCHSIA)
|
2018-07-30 15:50:17 -07:00
|
|
|
|
#include <lib/zx/process.h>
|
2017-12-05 15:43:23 -08:00
|
|
|
|
#include "snapshot/fuchsia/process_snapshot_fuchsia.h"
|
2015-05-01 13:48:23 -07:00
|
|
|
|
#endif
|
|
|
|
|
|
2015-03-11 17:07:11 -04:00
|
|
|
|
namespace crashpad {
|
|
|
|
|
namespace test {
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
|
|
TEST(CrashpadInfoClientOptions, TriStateFromCrashpadInfo) {
|
test: Use (actual, [un]expected) in gtest {ASSERT,EXPECT}_{EQ,NE}
gtest used to require (expected, actual) ordering for arguments to
EXPECT_EQ and ASSERT_EQ, and in failed test assertions would identify
each side as “expected” or “actual.” Tests in Crashpad adhered to this
traditional ordering. After a gtest change in February 2016, it is now
agnostic with respect to the order of these arguments.
This change mechanically updates all uses of these macros to (actual,
expected) by reversing them. This provides consistency with our use of
the logging CHECK_EQ and DCHECK_EQ macros, and makes for better
readability by ordinary native speakers. The rough (but working!)
conversion tool is
https://chromium-review.googlesource.com/c/466727/1/rewrite_expectassert_eq.py,
and “git cl format” cleaned up its output.
EXPECT_NE and ASSERT_NE never had a preferred ordering. gtest never made
a judgment that one side or the other needed to provide an “unexpected”
value. Consequently, some code used (unexpected, actual) while other
code used (actual, unexpected). For consistency with the new EXPECT_EQ
and ASSERT_EQ usage, as well as consistency with CHECK_NE and DCHECK_NE,
this change also updates these use sites to (actual, unexpected) where
one side can be called “unexpected” as, for example, std::string::npos
can be. Unfortunately, this portion was a manual conversion.
References:
https://github.com/google/googletest/blob/master/googletest/docs/Primer.md#binary-comparison
https://github.com/google/googletest/commit/77d6b173380332b1c1bc540532641f410ec82d65
https://github.com/google/googletest/pull/713
Change-Id: I978fef7c94183b8b1ef63f12f5ab4d6693626be3
Reviewed-on: https://chromium-review.googlesource.com/466727
Reviewed-by: Scott Graham <scottmg@chromium.org>
2017-04-04 00:35:21 -04:00
|
|
|
|
EXPECT_EQ(CrashpadInfoClientOptions::TriStateFromCrashpadInfo(0),
|
|
|
|
|
TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(CrashpadInfoClientOptions::TriStateFromCrashpadInfo(1),
|
|
|
|
|
TriState::kEnabled);
|
|
|
|
|
EXPECT_EQ(CrashpadInfoClientOptions::TriStateFromCrashpadInfo(2),
|
|
|
|
|
TriState::kDisabled);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
|
|
|
|
// These will produce log messages but should result in kUnset being returned.
|
test: Use (actual, [un]expected) in gtest {ASSERT,EXPECT}_{EQ,NE}
gtest used to require (expected, actual) ordering for arguments to
EXPECT_EQ and ASSERT_EQ, and in failed test assertions would identify
each side as “expected” or “actual.” Tests in Crashpad adhered to this
traditional ordering. After a gtest change in February 2016, it is now
agnostic with respect to the order of these arguments.
This change mechanically updates all uses of these macros to (actual,
expected) by reversing them. This provides consistency with our use of
the logging CHECK_EQ and DCHECK_EQ macros, and makes for better
readability by ordinary native speakers. The rough (but working!)
conversion tool is
https://chromium-review.googlesource.com/c/466727/1/rewrite_expectassert_eq.py,
and “git cl format” cleaned up its output.
EXPECT_NE and ASSERT_NE never had a preferred ordering. gtest never made
a judgment that one side or the other needed to provide an “unexpected”
value. Consequently, some code used (unexpected, actual) while other
code used (actual, unexpected). For consistency with the new EXPECT_EQ
and ASSERT_EQ usage, as well as consistency with CHECK_NE and DCHECK_NE,
this change also updates these use sites to (actual, unexpected) where
one side can be called “unexpected” as, for example, std::string::npos
can be. Unfortunately, this portion was a manual conversion.
References:
https://github.com/google/googletest/blob/master/googletest/docs/Primer.md#binary-comparison
https://github.com/google/googletest/commit/77d6b173380332b1c1bc540532641f410ec82d65
https://github.com/google/googletest/pull/713
Change-Id: I978fef7c94183b8b1ef63f12f5ab4d6693626be3
Reviewed-on: https://chromium-review.googlesource.com/466727
Reviewed-by: Scott Graham <scottmg@chromium.org>
2017-04-04 00:35:21 -04:00
|
|
|
|
EXPECT_EQ(CrashpadInfoClientOptions::TriStateFromCrashpadInfo(3),
|
|
|
|
|
TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(CrashpadInfoClientOptions::TriStateFromCrashpadInfo(4),
|
|
|
|
|
TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(CrashpadInfoClientOptions::TriStateFromCrashpadInfo(0xff),
|
|
|
|
|
TriState::kUnset);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
}
|
|
|
|
|
|
2018-02-16 03:41:01 +00:00
|
|
|
|
class ScopedUnsetCrashpadInfoOptions {
|
|
|
|
|
public:
|
|
|
|
|
explicit ScopedUnsetCrashpadInfoOptions(CrashpadInfo* crashpad_info)
|
|
|
|
|
: crashpad_info_(crashpad_info) {
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-20 12:55:12 -07:00
|
|
|
|
ScopedUnsetCrashpadInfoOptions(const ScopedUnsetCrashpadInfoOptions&) =
|
|
|
|
|
delete;
|
|
|
|
|
ScopedUnsetCrashpadInfoOptions& operator=(
|
|
|
|
|
const ScopedUnsetCrashpadInfoOptions&) = delete;
|
|
|
|
|
|
2018-02-16 03:41:01 +00:00
|
|
|
|
~ScopedUnsetCrashpadInfoOptions() {
|
|
|
|
|
crashpad_info_->set_crashpad_handler_behavior(TriState::kUnset);
|
|
|
|
|
crashpad_info_->set_system_crash_reporter_forwarding(TriState::kUnset);
|
|
|
|
|
crashpad_info_->set_gather_indirectly_referenced_memory(TriState::kUnset,
|
|
|
|
|
0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
CrashpadInfo* crashpad_info_;
|
|
|
|
|
};
|
|
|
|
|
|
2016-01-14 12:50:22 -08:00
|
|
|
|
CrashpadInfoClientOptions SelfProcessSnapshotAndGetCrashpadOptions() {
|
2022-01-19 15:00:24 -05:00
|
|
|
|
#if BUILDFLAG(IS_APPLE)
|
2015-03-11 17:07:11 -04:00
|
|
|
|
ProcessSnapshotMac process_snapshot;
|
2016-01-14 12:50:22 -08:00
|
|
|
|
EXPECT_TRUE(process_snapshot.Initialize(mach_task_self()));
|
2022-01-19 15:00:24 -05:00
|
|
|
|
#elif BUILDFLAG(IS_WIN)
|
2015-05-01 13:48:23 -07:00
|
|
|
|
ProcessSnapshotWin process_snapshot;
|
2016-01-14 12:50:22 -08:00
|
|
|
|
EXPECT_TRUE(process_snapshot.Initialize(
|
2016-05-02 11:36:41 -07:00
|
|
|
|
GetCurrentProcess(), ProcessSuspensionState::kRunning, 0, 0));
|
2022-01-19 15:00:24 -05:00
|
|
|
|
#elif BUILDFLAG(IS_FUCHSIA)
|
2017-12-05 15:43:23 -08:00
|
|
|
|
ProcessSnapshotFuchsia process_snapshot;
|
2018-07-30 15:50:17 -07:00
|
|
|
|
EXPECT_TRUE(process_snapshot.Initialize(*zx::process::self()));
|
2015-05-01 13:48:23 -07:00
|
|
|
|
#else
|
|
|
|
|
#error Port.
|
2022-01-19 15:00:24 -05:00
|
|
|
|
#endif // BUILDFLAG(IS_APPLE)
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
|
|
|
|
CrashpadInfoClientOptions options;
|
|
|
|
|
process_snapshot.GetCrashpadOptions(&options);
|
2016-01-14 12:50:22 -08:00
|
|
|
|
return options;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(CrashpadInfoClientOptions, OneModule) {
|
|
|
|
|
// Make sure that the initial state has all values unset.
|
|
|
|
|
auto options = SelfProcessSnapshotAndGetCrashpadOptions();
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
test: Use (actual, [un]expected) in gtest {ASSERT,EXPECT}_{EQ,NE}
gtest used to require (expected, actual) ordering for arguments to
EXPECT_EQ and ASSERT_EQ, and in failed test assertions would identify
each side as “expected” or “actual.” Tests in Crashpad adhered to this
traditional ordering. After a gtest change in February 2016, it is now
agnostic with respect to the order of these arguments.
This change mechanically updates all uses of these macros to (actual,
expected) by reversing them. This provides consistency with our use of
the logging CHECK_EQ and DCHECK_EQ macros, and makes for better
readability by ordinary native speakers. The rough (but working!)
conversion tool is
https://chromium-review.googlesource.com/c/466727/1/rewrite_expectassert_eq.py,
and “git cl format” cleaned up its output.
EXPECT_NE and ASSERT_NE never had a preferred ordering. gtest never made
a judgment that one side or the other needed to provide an “unexpected”
value. Consequently, some code used (unexpected, actual) while other
code used (actual, unexpected). For consistency with the new EXPECT_EQ
and ASSERT_EQ usage, as well as consistency with CHECK_NE and DCHECK_NE,
this change also updates these use sites to (actual, unexpected) where
one side can be called “unexpected” as, for example, std::string::npos
can be. Unfortunately, this portion was a manual conversion.
References:
https://github.com/google/googletest/blob/master/googletest/docs/Primer.md#binary-comparison
https://github.com/google/googletest/commit/77d6b173380332b1c1bc540532641f410ec82d65
https://github.com/google/googletest/pull/713
Change-Id: I978fef7c94183b8b1ef63f12f5ab4d6693626be3
Reviewed-on: https://chromium-review.googlesource.com/466727
Reviewed-by: Scott Graham <scottmg@chromium.org>
2017-04-04 00:35:21 -04:00
|
|
|
|
EXPECT_EQ(options.crashpad_handler_behavior, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.system_crash_reporter_forwarding, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.gather_indirectly_referenced_memory, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.indirectly_referenced_memory_cap, 0u);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
|
|
|
|
CrashpadInfo* crashpad_info = CrashpadInfo::GetCrashpadInfo();
|
|
|
|
|
ASSERT_TRUE(crashpad_info);
|
|
|
|
|
|
|
|
|
|
{
|
2018-02-16 03:41:01 +00:00
|
|
|
|
ScopedUnsetCrashpadInfoOptions unset(crashpad_info);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
|
|
|
|
crashpad_info->set_crashpad_handler_behavior(TriState::kEnabled);
|
|
|
|
|
|
2016-01-14 12:50:22 -08:00
|
|
|
|
options = SelfProcessSnapshotAndGetCrashpadOptions();
|
test: Use (actual, [un]expected) in gtest {ASSERT,EXPECT}_{EQ,NE}
gtest used to require (expected, actual) ordering for arguments to
EXPECT_EQ and ASSERT_EQ, and in failed test assertions would identify
each side as “expected” or “actual.” Tests in Crashpad adhered to this
traditional ordering. After a gtest change in February 2016, it is now
agnostic with respect to the order of these arguments.
This change mechanically updates all uses of these macros to (actual,
expected) by reversing them. This provides consistency with our use of
the logging CHECK_EQ and DCHECK_EQ macros, and makes for better
readability by ordinary native speakers. The rough (but working!)
conversion tool is
https://chromium-review.googlesource.com/c/466727/1/rewrite_expectassert_eq.py,
and “git cl format” cleaned up its output.
EXPECT_NE and ASSERT_NE never had a preferred ordering. gtest never made
a judgment that one side or the other needed to provide an “unexpected”
value. Consequently, some code used (unexpected, actual) while other
code used (actual, unexpected). For consistency with the new EXPECT_EQ
and ASSERT_EQ usage, as well as consistency with CHECK_NE and DCHECK_NE,
this change also updates these use sites to (actual, unexpected) where
one side can be called “unexpected” as, for example, std::string::npos
can be. Unfortunately, this portion was a manual conversion.
References:
https://github.com/google/googletest/blob/master/googletest/docs/Primer.md#binary-comparison
https://github.com/google/googletest/commit/77d6b173380332b1c1bc540532641f410ec82d65
https://github.com/google/googletest/pull/713
Change-Id: I978fef7c94183b8b1ef63f12f5ab4d6693626be3
Reviewed-on: https://chromium-review.googlesource.com/466727
Reviewed-by: Scott Graham <scottmg@chromium.org>
2017-04-04 00:35:21 -04:00
|
|
|
|
EXPECT_EQ(options.crashpad_handler_behavior, TriState::kEnabled);
|
|
|
|
|
EXPECT_EQ(options.system_crash_reporter_forwarding, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.gather_indirectly_referenced_memory, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.indirectly_referenced_memory_cap, 0u);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
2018-02-16 03:41:01 +00:00
|
|
|
|
ScopedUnsetCrashpadInfoOptions unset(crashpad_info);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
|
|
|
|
crashpad_info->set_system_crash_reporter_forwarding(TriState::kDisabled);
|
|
|
|
|
|
2016-01-14 12:50:22 -08:00
|
|
|
|
options = SelfProcessSnapshotAndGetCrashpadOptions();
|
test: Use (actual, [un]expected) in gtest {ASSERT,EXPECT}_{EQ,NE}
gtest used to require (expected, actual) ordering for arguments to
EXPECT_EQ and ASSERT_EQ, and in failed test assertions would identify
each side as “expected” or “actual.” Tests in Crashpad adhered to this
traditional ordering. After a gtest change in February 2016, it is now
agnostic with respect to the order of these arguments.
This change mechanically updates all uses of these macros to (actual,
expected) by reversing them. This provides consistency with our use of
the logging CHECK_EQ and DCHECK_EQ macros, and makes for better
readability by ordinary native speakers. The rough (but working!)
conversion tool is
https://chromium-review.googlesource.com/c/466727/1/rewrite_expectassert_eq.py,
and “git cl format” cleaned up its output.
EXPECT_NE and ASSERT_NE never had a preferred ordering. gtest never made
a judgment that one side or the other needed to provide an “unexpected”
value. Consequently, some code used (unexpected, actual) while other
code used (actual, unexpected). For consistency with the new EXPECT_EQ
and ASSERT_EQ usage, as well as consistency with CHECK_NE and DCHECK_NE,
this change also updates these use sites to (actual, unexpected) where
one side can be called “unexpected” as, for example, std::string::npos
can be. Unfortunately, this portion was a manual conversion.
References:
https://github.com/google/googletest/blob/master/googletest/docs/Primer.md#binary-comparison
https://github.com/google/googletest/commit/77d6b173380332b1c1bc540532641f410ec82d65
https://github.com/google/googletest/pull/713
Change-Id: I978fef7c94183b8b1ef63f12f5ab4d6693626be3
Reviewed-on: https://chromium-review.googlesource.com/466727
Reviewed-by: Scott Graham <scottmg@chromium.org>
2017-04-04 00:35:21 -04:00
|
|
|
|
EXPECT_EQ(options.crashpad_handler_behavior, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.system_crash_reporter_forwarding, TriState::kDisabled);
|
|
|
|
|
EXPECT_EQ(options.gather_indirectly_referenced_memory, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.indirectly_referenced_memory_cap, 0u);
|
2016-01-14 15:12:28 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
2018-02-16 03:41:01 +00:00
|
|
|
|
ScopedUnsetCrashpadInfoOptions unset(crashpad_info);
|
2016-01-14 15:12:28 -08:00
|
|
|
|
|
2016-04-21 22:19:31 -07:00
|
|
|
|
crashpad_info->set_gather_indirectly_referenced_memory(TriState::kEnabled,
|
|
|
|
|
1234);
|
2016-01-14 15:12:28 -08:00
|
|
|
|
|
2016-01-14 12:50:22 -08:00
|
|
|
|
options = SelfProcessSnapshotAndGetCrashpadOptions();
|
test: Use (actual, [un]expected) in gtest {ASSERT,EXPECT}_{EQ,NE}
gtest used to require (expected, actual) ordering for arguments to
EXPECT_EQ and ASSERT_EQ, and in failed test assertions would identify
each side as “expected” or “actual.” Tests in Crashpad adhered to this
traditional ordering. After a gtest change in February 2016, it is now
agnostic with respect to the order of these arguments.
This change mechanically updates all uses of these macros to (actual,
expected) by reversing them. This provides consistency with our use of
the logging CHECK_EQ and DCHECK_EQ macros, and makes for better
readability by ordinary native speakers. The rough (but working!)
conversion tool is
https://chromium-review.googlesource.com/c/466727/1/rewrite_expectassert_eq.py,
and “git cl format” cleaned up its output.
EXPECT_NE and ASSERT_NE never had a preferred ordering. gtest never made
a judgment that one side or the other needed to provide an “unexpected”
value. Consequently, some code used (unexpected, actual) while other
code used (actual, unexpected). For consistency with the new EXPECT_EQ
and ASSERT_EQ usage, as well as consistency with CHECK_NE and DCHECK_NE,
this change also updates these use sites to (actual, unexpected) where
one side can be called “unexpected” as, for example, std::string::npos
can be. Unfortunately, this portion was a manual conversion.
References:
https://github.com/google/googletest/blob/master/googletest/docs/Primer.md#binary-comparison
https://github.com/google/googletest/commit/77d6b173380332b1c1bc540532641f410ec82d65
https://github.com/google/googletest/pull/713
Change-Id: I978fef7c94183b8b1ef63f12f5ab4d6693626be3
Reviewed-on: https://chromium-review.googlesource.com/466727
Reviewed-by: Scott Graham <scottmg@chromium.org>
2017-04-04 00:35:21 -04:00
|
|
|
|
EXPECT_EQ(options.crashpad_handler_behavior, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.system_crash_reporter_forwarding, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.gather_indirectly_referenced_memory, TriState::kEnabled);
|
2021-12-13 13:48:45 -08:00
|
|
|
|
EXPECT_LE(options.indirectly_referenced_memory_cap, 1234u);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST(CrashpadInfoClientOptions, TwoModules) {
|
|
|
|
|
// Open the module, which has its own CrashpadInfo structure.
|
2017-11-01 10:37:01 -04:00
|
|
|
|
base::FilePath module_path =
|
|
|
|
|
TestPaths::BuildArtifact(FILE_PATH_LITERAL("snapshot"),
|
|
|
|
|
FILE_PATH_LITERAL("module"),
|
|
|
|
|
TestPaths::FileType::kLoadableModule);
|
2022-01-19 15:00:24 -05:00
|
|
|
|
#if BUILDFLAG(IS_POSIX)
|
mac: Handle _dyld_get_all_image_infos() not being available on 10.13
_dyld_get_all_image_infos() was only used in test code in Crashpad.
This addresses two related problems.
When running on 10.13 or later, _dyld_get_all_image_infos() is not
available. It appears to still be implemented in dyld, but its symbol is
now private. This was always known to be an “internal” interface. When
it’s not available, fall back to obtaining the address of the process’
dyld_all_image_infos structure by calling task_info(…, TASK_DYLD_INFO,
…). Note that this is the same thing that the code being tested does,
although the tests are not rendered entirely pointless because the code
being tested consumes dyld_all_image_infos through its own
implementation of an out-of-process reader interface, while the
dyld_all_image_infos data obtained by _dyld_get_all_image_infos() is
handled strictly in-process by ordinary memory reads. This is covered by
bug 187.
When building with the 10.13 SDK, no _dyld_get_all_image_infos symbol is
available to link against. In this case, access the symbol strictly at
runtime via dlopen() if it may be available, or when expecting to only
run on 10.13 and later, don’t even bother looking for this symbol. This
is covered by part of bug 188.
Bug: crashpad:185, crashpad:187, crashpad:188
Change-Id: Ib283e070faf5d1ec35deee420213b53ec24fb1d3
Reviewed-on: https://chromium-review.googlesource.com/534633
Reviewed-by: Robert Sesek <rsesek@chromium.org>
2017-06-14 10:48:30 -04:00
|
|
|
|
ScopedModuleHandle module(
|
2015-03-11 17:07:11 -04:00
|
|
|
|
dlopen(module_path.value().c_str(), RTLD_LAZY | RTLD_LOCAL));
|
mac: Handle _dyld_get_all_image_infos() not being available on 10.13
_dyld_get_all_image_infos() was only used in test code in Crashpad.
This addresses two related problems.
When running on 10.13 or later, _dyld_get_all_image_infos() is not
available. It appears to still be implemented in dyld, but its symbol is
now private. This was always known to be an “internal” interface. When
it’s not available, fall back to obtaining the address of the process’
dyld_all_image_infos structure by calling task_info(…, TASK_DYLD_INFO,
…). Note that this is the same thing that the code being tested does,
although the tests are not rendered entirely pointless because the code
being tested consumes dyld_all_image_infos through its own
implementation of an out-of-process reader interface, while the
dyld_all_image_infos data obtained by _dyld_get_all_image_infos() is
handled strictly in-process by ordinary memory reads. This is covered by
bug 187.
When building with the 10.13 SDK, no _dyld_get_all_image_infos symbol is
available to link against. In this case, access the symbol strictly at
runtime via dlopen() if it may be available, or when expecting to only
run on 10.13 and later, don’t even bother looking for this symbol. This
is covered by part of bug 188.
Bug: crashpad:185, crashpad:187, crashpad:188
Change-Id: Ib283e070faf5d1ec35deee420213b53ec24fb1d3
Reviewed-on: https://chromium-review.googlesource.com/534633
Reviewed-by: Robert Sesek <rsesek@chromium.org>
2017-06-14 10:48:30 -04:00
|
|
|
|
ASSERT_TRUE(module.valid()) << "dlopen " << module_path.value() << ": "
|
|
|
|
|
<< dlerror();
|
2022-01-19 15:00:24 -05:00
|
|
|
|
#elif BUILDFLAG(IS_WIN)
|
mac: Handle _dyld_get_all_image_infos() not being available on 10.13
_dyld_get_all_image_infos() was only used in test code in Crashpad.
This addresses two related problems.
When running on 10.13 or later, _dyld_get_all_image_infos() is not
available. It appears to still be implemented in dyld, but its symbol is
now private. This was always known to be an “internal” interface. When
it’s not available, fall back to obtaining the address of the process’
dyld_all_image_infos structure by calling task_info(…, TASK_DYLD_INFO,
…). Note that this is the same thing that the code being tested does,
although the tests are not rendered entirely pointless because the code
being tested consumes dyld_all_image_infos through its own
implementation of an out-of-process reader interface, while the
dyld_all_image_infos data obtained by _dyld_get_all_image_infos() is
handled strictly in-process by ordinary memory reads. This is covered by
bug 187.
When building with the 10.13 SDK, no _dyld_get_all_image_infos symbol is
available to link against. In this case, access the symbol strictly at
runtime via dlopen() if it may be available, or when expecting to only
run on 10.13 and later, don’t even bother looking for this symbol. This
is covered by part of bug 188.
Bug: crashpad:185, crashpad:187, crashpad:188
Change-Id: Ib283e070faf5d1ec35deee420213b53ec24fb1d3
Reviewed-on: https://chromium-review.googlesource.com/534633
Reviewed-by: Robert Sesek <rsesek@chromium.org>
2017-06-14 10:48:30 -04:00
|
|
|
|
ScopedModuleHandle module(LoadLibrary(module_path.value().c_str()));
|
2020-09-12 09:20:14 +02:00
|
|
|
|
ASSERT_TRUE(module.valid())
|
|
|
|
|
<< "LoadLibrary " << base::WideToUTF8(module_path.value()) << ": "
|
|
|
|
|
<< ErrorMessage();
|
2015-05-01 13:48:23 -07:00
|
|
|
|
#else
|
|
|
|
|
#error Port.
|
2022-01-19 15:00:24 -05:00
|
|
|
|
#endif // BUILDFLAG(IS_POSIX)
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
|
|
|
|
// Get the function pointer from the module. This wraps GetCrashpadInfo(), but
|
|
|
|
|
// because it runs in the module, it returns the remote module’s CrashpadInfo
|
|
|
|
|
// structure.
|
|
|
|
|
CrashpadInfo* (*TestModule_GetCrashpadInfo)() =
|
mac: Handle _dyld_get_all_image_infos() not being available on 10.13
_dyld_get_all_image_infos() was only used in test code in Crashpad.
This addresses two related problems.
When running on 10.13 or later, _dyld_get_all_image_infos() is not
available. It appears to still be implemented in dyld, but its symbol is
now private. This was always known to be an “internal” interface. When
it’s not available, fall back to obtaining the address of the process’
dyld_all_image_infos structure by calling task_info(…, TASK_DYLD_INFO,
…). Note that this is the same thing that the code being tested does,
although the tests are not rendered entirely pointless because the code
being tested consumes dyld_all_image_infos through its own
implementation of an out-of-process reader interface, while the
dyld_all_image_infos data obtained by _dyld_get_all_image_infos() is
handled strictly in-process by ordinary memory reads. This is covered by
bug 187.
When building with the 10.13 SDK, no _dyld_get_all_image_infos symbol is
available to link against. In this case, access the symbol strictly at
runtime via dlopen() if it may be available, or when expecting to only
run on 10.13 and later, don’t even bother looking for this symbol. This
is covered by part of bug 188.
Bug: crashpad:185, crashpad:187, crashpad:188
Change-Id: Ib283e070faf5d1ec35deee420213b53ec24fb1d3
Reviewed-on: https://chromium-review.googlesource.com/534633
Reviewed-by: Robert Sesek <rsesek@chromium.org>
2017-06-14 10:48:30 -04:00
|
|
|
|
module.LookUpSymbol<CrashpadInfo* (*)()>("TestModule_GetCrashpadInfo");
|
2015-03-11 17:07:11 -04:00
|
|
|
|
ASSERT_TRUE(TestModule_GetCrashpadInfo);
|
|
|
|
|
|
2016-01-14 12:50:22 -08:00
|
|
|
|
auto options = SelfProcessSnapshotAndGetCrashpadOptions();
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
2016-01-14 12:50:22 -08:00
|
|
|
|
// Make sure that the initial state has all values unset.
|
test: Use (actual, [un]expected) in gtest {ASSERT,EXPECT}_{EQ,NE}
gtest used to require (expected, actual) ordering for arguments to
EXPECT_EQ and ASSERT_EQ, and in failed test assertions would identify
each side as “expected” or “actual.” Tests in Crashpad adhered to this
traditional ordering. After a gtest change in February 2016, it is now
agnostic with respect to the order of these arguments.
This change mechanically updates all uses of these macros to (actual,
expected) by reversing them. This provides consistency with our use of
the logging CHECK_EQ and DCHECK_EQ macros, and makes for better
readability by ordinary native speakers. The rough (but working!)
conversion tool is
https://chromium-review.googlesource.com/c/466727/1/rewrite_expectassert_eq.py,
and “git cl format” cleaned up its output.
EXPECT_NE and ASSERT_NE never had a preferred ordering. gtest never made
a judgment that one side or the other needed to provide an “unexpected”
value. Consequently, some code used (unexpected, actual) while other
code used (actual, unexpected). For consistency with the new EXPECT_EQ
and ASSERT_EQ usage, as well as consistency with CHECK_NE and DCHECK_NE,
this change also updates these use sites to (actual, unexpected) where
one side can be called “unexpected” as, for example, std::string::npos
can be. Unfortunately, this portion was a manual conversion.
References:
https://github.com/google/googletest/blob/master/googletest/docs/Primer.md#binary-comparison
https://github.com/google/googletest/commit/77d6b173380332b1c1bc540532641f410ec82d65
https://github.com/google/googletest/pull/713
Change-Id: I978fef7c94183b8b1ef63f12f5ab4d6693626be3
Reviewed-on: https://chromium-review.googlesource.com/466727
Reviewed-by: Scott Graham <scottmg@chromium.org>
2017-04-04 00:35:21 -04:00
|
|
|
|
EXPECT_EQ(options.crashpad_handler_behavior, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.system_crash_reporter_forwarding, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.gather_indirectly_referenced_memory, TriState::kUnset);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
|
|
|
|
// Get both CrashpadInfo structures.
|
|
|
|
|
CrashpadInfo* local_crashpad_info = CrashpadInfo::GetCrashpadInfo();
|
|
|
|
|
ASSERT_TRUE(local_crashpad_info);
|
|
|
|
|
|
|
|
|
|
CrashpadInfo* remote_crashpad_info = TestModule_GetCrashpadInfo();
|
|
|
|
|
ASSERT_TRUE(remote_crashpad_info);
|
|
|
|
|
|
|
|
|
|
{
|
2018-02-16 03:41:01 +00:00
|
|
|
|
ScopedUnsetCrashpadInfoOptions unset_local(local_crashpad_info);
|
|
|
|
|
ScopedUnsetCrashpadInfoOptions unset_remote(remote_crashpad_info);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
|
|
|
|
// When only one module sets a value, it applies to the entire process.
|
|
|
|
|
remote_crashpad_info->set_crashpad_handler_behavior(TriState::kEnabled);
|
|
|
|
|
|
2016-01-14 12:50:22 -08:00
|
|
|
|
options = SelfProcessSnapshotAndGetCrashpadOptions();
|
test: Use (actual, [un]expected) in gtest {ASSERT,EXPECT}_{EQ,NE}
gtest used to require (expected, actual) ordering for arguments to
EXPECT_EQ and ASSERT_EQ, and in failed test assertions would identify
each side as “expected” or “actual.” Tests in Crashpad adhered to this
traditional ordering. After a gtest change in February 2016, it is now
agnostic with respect to the order of these arguments.
This change mechanically updates all uses of these macros to (actual,
expected) by reversing them. This provides consistency with our use of
the logging CHECK_EQ and DCHECK_EQ macros, and makes for better
readability by ordinary native speakers. The rough (but working!)
conversion tool is
https://chromium-review.googlesource.com/c/466727/1/rewrite_expectassert_eq.py,
and “git cl format” cleaned up its output.
EXPECT_NE and ASSERT_NE never had a preferred ordering. gtest never made
a judgment that one side or the other needed to provide an “unexpected”
value. Consequently, some code used (unexpected, actual) while other
code used (actual, unexpected). For consistency with the new EXPECT_EQ
and ASSERT_EQ usage, as well as consistency with CHECK_NE and DCHECK_NE,
this change also updates these use sites to (actual, unexpected) where
one side can be called “unexpected” as, for example, std::string::npos
can be. Unfortunately, this portion was a manual conversion.
References:
https://github.com/google/googletest/blob/master/googletest/docs/Primer.md#binary-comparison
https://github.com/google/googletest/commit/77d6b173380332b1c1bc540532641f410ec82d65
https://github.com/google/googletest/pull/713
Change-Id: I978fef7c94183b8b1ef63f12f5ab4d6693626be3
Reviewed-on: https://chromium-review.googlesource.com/466727
Reviewed-by: Scott Graham <scottmg@chromium.org>
2017-04-04 00:35:21 -04:00
|
|
|
|
EXPECT_EQ(options.crashpad_handler_behavior, TriState::kEnabled);
|
|
|
|
|
EXPECT_EQ(options.system_crash_reporter_forwarding, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.gather_indirectly_referenced_memory, TriState::kUnset);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
|
|
|
|
// When more than one module sets a value, the first one in the module list
|
|
|
|
|
// applies to the process. The local module should appear before the remote
|
|
|
|
|
// module, because the local module loaded the remote module.
|
|
|
|
|
local_crashpad_info->set_crashpad_handler_behavior(TriState::kDisabled);
|
|
|
|
|
|
2016-01-14 12:50:22 -08:00
|
|
|
|
options = SelfProcessSnapshotAndGetCrashpadOptions();
|
test: Use (actual, [un]expected) in gtest {ASSERT,EXPECT}_{EQ,NE}
gtest used to require (expected, actual) ordering for arguments to
EXPECT_EQ and ASSERT_EQ, and in failed test assertions would identify
each side as “expected” or “actual.” Tests in Crashpad adhered to this
traditional ordering. After a gtest change in February 2016, it is now
agnostic with respect to the order of these arguments.
This change mechanically updates all uses of these macros to (actual,
expected) by reversing them. This provides consistency with our use of
the logging CHECK_EQ and DCHECK_EQ macros, and makes for better
readability by ordinary native speakers. The rough (but working!)
conversion tool is
https://chromium-review.googlesource.com/c/466727/1/rewrite_expectassert_eq.py,
and “git cl format” cleaned up its output.
EXPECT_NE and ASSERT_NE never had a preferred ordering. gtest never made
a judgment that one side or the other needed to provide an “unexpected”
value. Consequently, some code used (unexpected, actual) while other
code used (actual, unexpected). For consistency with the new EXPECT_EQ
and ASSERT_EQ usage, as well as consistency with CHECK_NE and DCHECK_NE,
this change also updates these use sites to (actual, unexpected) where
one side can be called “unexpected” as, for example, std::string::npos
can be. Unfortunately, this portion was a manual conversion.
References:
https://github.com/google/googletest/blob/master/googletest/docs/Primer.md#binary-comparison
https://github.com/google/googletest/commit/77d6b173380332b1c1bc540532641f410ec82d65
https://github.com/google/googletest/pull/713
Change-Id: I978fef7c94183b8b1ef63f12f5ab4d6693626be3
Reviewed-on: https://chromium-review.googlesource.com/466727
Reviewed-by: Scott Graham <scottmg@chromium.org>
2017-04-04 00:35:21 -04:00
|
|
|
|
EXPECT_EQ(options.crashpad_handler_behavior, TriState::kDisabled);
|
|
|
|
|
EXPECT_EQ(options.system_crash_reporter_forwarding, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.gather_indirectly_referenced_memory, TriState::kUnset);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
2018-02-16 03:41:01 +00:00
|
|
|
|
ScopedUnsetCrashpadInfoOptions unset_local(local_crashpad_info);
|
|
|
|
|
ScopedUnsetCrashpadInfoOptions unset_remote(remote_crashpad_info);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
|
|
|
|
// When only one module sets a value, it applies to the entire process.
|
|
|
|
|
remote_crashpad_info->set_system_crash_reporter_forwarding(
|
|
|
|
|
TriState::kDisabled);
|
|
|
|
|
|
2016-01-14 12:50:22 -08:00
|
|
|
|
options = SelfProcessSnapshotAndGetCrashpadOptions();
|
test: Use (actual, [un]expected) in gtest {ASSERT,EXPECT}_{EQ,NE}
gtest used to require (expected, actual) ordering for arguments to
EXPECT_EQ and ASSERT_EQ, and in failed test assertions would identify
each side as “expected” or “actual.” Tests in Crashpad adhered to this
traditional ordering. After a gtest change in February 2016, it is now
agnostic with respect to the order of these arguments.
This change mechanically updates all uses of these macros to (actual,
expected) by reversing them. This provides consistency with our use of
the logging CHECK_EQ and DCHECK_EQ macros, and makes for better
readability by ordinary native speakers. The rough (but working!)
conversion tool is
https://chromium-review.googlesource.com/c/466727/1/rewrite_expectassert_eq.py,
and “git cl format” cleaned up its output.
EXPECT_NE and ASSERT_NE never had a preferred ordering. gtest never made
a judgment that one side or the other needed to provide an “unexpected”
value. Consequently, some code used (unexpected, actual) while other
code used (actual, unexpected). For consistency with the new EXPECT_EQ
and ASSERT_EQ usage, as well as consistency with CHECK_NE and DCHECK_NE,
this change also updates these use sites to (actual, unexpected) where
one side can be called “unexpected” as, for example, std::string::npos
can be. Unfortunately, this portion was a manual conversion.
References:
https://github.com/google/googletest/blob/master/googletest/docs/Primer.md#binary-comparison
https://github.com/google/googletest/commit/77d6b173380332b1c1bc540532641f410ec82d65
https://github.com/google/googletest/pull/713
Change-Id: I978fef7c94183b8b1ef63f12f5ab4d6693626be3
Reviewed-on: https://chromium-review.googlesource.com/466727
Reviewed-by: Scott Graham <scottmg@chromium.org>
2017-04-04 00:35:21 -04:00
|
|
|
|
EXPECT_EQ(options.crashpad_handler_behavior, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.system_crash_reporter_forwarding, TriState::kDisabled);
|
|
|
|
|
EXPECT_EQ(options.gather_indirectly_referenced_memory, TriState::kUnset);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
|
|
|
|
|
// When more than one module sets a value, the first one in the module list
|
|
|
|
|
// applies to the process. The local module should appear before the remote
|
|
|
|
|
// module, because the local module loaded the remote module.
|
|
|
|
|
local_crashpad_info->set_system_crash_reporter_forwarding(
|
|
|
|
|
TriState::kEnabled);
|
|
|
|
|
|
2016-01-14 12:50:22 -08:00
|
|
|
|
options = SelfProcessSnapshotAndGetCrashpadOptions();
|
test: Use (actual, [un]expected) in gtest {ASSERT,EXPECT}_{EQ,NE}
gtest used to require (expected, actual) ordering for arguments to
EXPECT_EQ and ASSERT_EQ, and in failed test assertions would identify
each side as “expected” or “actual.” Tests in Crashpad adhered to this
traditional ordering. After a gtest change in February 2016, it is now
agnostic with respect to the order of these arguments.
This change mechanically updates all uses of these macros to (actual,
expected) by reversing them. This provides consistency with our use of
the logging CHECK_EQ and DCHECK_EQ macros, and makes for better
readability by ordinary native speakers. The rough (but working!)
conversion tool is
https://chromium-review.googlesource.com/c/466727/1/rewrite_expectassert_eq.py,
and “git cl format” cleaned up its output.
EXPECT_NE and ASSERT_NE never had a preferred ordering. gtest never made
a judgment that one side or the other needed to provide an “unexpected”
value. Consequently, some code used (unexpected, actual) while other
code used (actual, unexpected). For consistency with the new EXPECT_EQ
and ASSERT_EQ usage, as well as consistency with CHECK_NE and DCHECK_NE,
this change also updates these use sites to (actual, unexpected) where
one side can be called “unexpected” as, for example, std::string::npos
can be. Unfortunately, this portion was a manual conversion.
References:
https://github.com/google/googletest/blob/master/googletest/docs/Primer.md#binary-comparison
https://github.com/google/googletest/commit/77d6b173380332b1c1bc540532641f410ec82d65
https://github.com/google/googletest/pull/713
Change-Id: I978fef7c94183b8b1ef63f12f5ab4d6693626be3
Reviewed-on: https://chromium-review.googlesource.com/466727
Reviewed-by: Scott Graham <scottmg@chromium.org>
2017-04-04 00:35:21 -04:00
|
|
|
|
EXPECT_EQ(options.crashpad_handler_behavior, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.system_crash_reporter_forwarding, TriState::kEnabled);
|
|
|
|
|
EXPECT_EQ(options.gather_indirectly_referenced_memory, TriState::kUnset);
|
2015-03-11 17:07:11 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-11-15 12:43:44 -05:00
|
|
|
|
class CrashpadInfoSizes_ClientOptions
|
|
|
|
|
: public testing::TestWithParam<base::FilePath::StringType> {};
|
|
|
|
|
|
2023-06-07 20:38:09 +00:00
|
|
|
|
// UBSan detects a function type mismatch when calling
|
|
|
|
|
// TestModule_GetCrashpadInfo since the expected function signature should
|
|
|
|
|
// return a CrashpadInfo* but the actual TestModule_GetCrashpadInfo defined for
|
|
|
|
|
// the test returns a TestCrashpadInfo*. CrashpadInfo is a struct with its
|
|
|
|
|
// members set as private and TestCrashpadInfo is a POD meant to replicate the
|
|
|
|
|
// layout of CrashpadInfo byte-for-byte. Note this is intentional since the
|
|
|
|
|
// whole point of the test is to exercise the snapshot reader’s ability to
|
|
|
|
|
// handle CrashpadInfo.
|
|
|
|
|
#if defined(__clang__)
|
|
|
|
|
[[clang::no_sanitize("function")]]
|
|
|
|
|
#endif
|
|
|
|
|
inline CrashpadInfo*
|
|
|
|
|
CallGetCrashpadInfo(CrashpadInfo* (*func)()) {
|
|
|
|
|
return func();
|
|
|
|
|
}
|
|
|
|
|
|
2017-11-15 12:43:44 -05:00
|
|
|
|
TEST_P(CrashpadInfoSizes_ClientOptions, DifferentlySizedStruct) {
|
|
|
|
|
base::FilePath::StringType artifact(FILE_PATH_LITERAL("module_"));
|
|
|
|
|
artifact += GetParam();
|
|
|
|
|
|
|
|
|
|
// Open the module, which has a CrashpadInfo-like structure that’s smaller or
|
|
|
|
|
// larger than the current version’s CrashpadInfo structure defined in the
|
|
|
|
|
// client library.
|
|
|
|
|
base::FilePath module_path =
|
|
|
|
|
TestPaths::BuildArtifact(FILE_PATH_LITERAL("snapshot"),
|
|
|
|
|
artifact,
|
|
|
|
|
TestPaths::FileType::kLoadableModule);
|
2022-01-19 15:00:24 -05:00
|
|
|
|
#if BUILDFLAG(IS_POSIX)
|
2017-11-15 12:43:44 -05:00
|
|
|
|
ScopedModuleHandle module(
|
|
|
|
|
dlopen(module_path.value().c_str(), RTLD_LAZY | RTLD_LOCAL));
|
|
|
|
|
ASSERT_TRUE(module.valid())
|
|
|
|
|
<< "dlopen " << module_path.value() << ": " << dlerror();
|
2022-01-19 15:00:24 -05:00
|
|
|
|
#elif BUILDFLAG(IS_WIN)
|
2017-11-15 12:43:44 -05:00
|
|
|
|
ScopedModuleHandle module(LoadLibrary(module_path.value().c_str()));
|
|
|
|
|
ASSERT_TRUE(module.valid())
|
2020-09-12 09:20:14 +02:00
|
|
|
|
<< "LoadLibrary " << base::WideToUTF8(module_path.value()) << ": "
|
2017-11-15 12:43:44 -05:00
|
|
|
|
<< ErrorMessage();
|
|
|
|
|
#else
|
|
|
|
|
#error Port.
|
2022-01-19 15:00:24 -05:00
|
|
|
|
#endif // BUILDFLAG(IS_POSIX)
|
2017-11-15 12:43:44 -05:00
|
|
|
|
|
|
|
|
|
// Get the function pointer from the module.
|
|
|
|
|
CrashpadInfo* (*TestModule_GetCrashpadInfo)() =
|
|
|
|
|
module.LookUpSymbol<CrashpadInfo* (*)()>("TestModule_GetCrashpadInfo");
|
|
|
|
|
ASSERT_TRUE(TestModule_GetCrashpadInfo);
|
|
|
|
|
|
|
|
|
|
auto options = SelfProcessSnapshotAndGetCrashpadOptions();
|
|
|
|
|
|
|
|
|
|
// Make sure that the initial state has all values unset.
|
|
|
|
|
EXPECT_EQ(options.crashpad_handler_behavior, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.system_crash_reporter_forwarding, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.gather_indirectly_referenced_memory, TriState::kUnset);
|
|
|
|
|
|
|
|
|
|
// Get the remote CrashpadInfo structure.
|
2023-06-07 20:38:09 +00:00
|
|
|
|
CrashpadInfo* remote_crashpad_info =
|
|
|
|
|
CallGetCrashpadInfo(TestModule_GetCrashpadInfo);
|
2017-11-15 12:43:44 -05:00
|
|
|
|
ASSERT_TRUE(remote_crashpad_info);
|
|
|
|
|
|
|
|
|
|
{
|
2018-02-16 03:41:01 +00:00
|
|
|
|
ScopedUnsetCrashpadInfoOptions unset_remote(remote_crashpad_info);
|
2017-11-15 12:43:44 -05:00
|
|
|
|
|
|
|
|
|
// Make sure that a change in the remote structure can be read back out,
|
|
|
|
|
// even though it’s a different size.
|
|
|
|
|
remote_crashpad_info->set_crashpad_handler_behavior(TriState::kEnabled);
|
|
|
|
|
remote_crashpad_info->set_system_crash_reporter_forwarding(
|
|
|
|
|
TriState::kDisabled);
|
|
|
|
|
|
|
|
|
|
options = SelfProcessSnapshotAndGetCrashpadOptions();
|
|
|
|
|
EXPECT_EQ(options.crashpad_handler_behavior, TriState::kEnabled);
|
|
|
|
|
EXPECT_EQ(options.system_crash_reporter_forwarding, TriState::kDisabled);
|
|
|
|
|
EXPECT_EQ(options.gather_indirectly_referenced_memory, TriState::kUnset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
2018-02-16 03:41:01 +00:00
|
|
|
|
ScopedUnsetCrashpadInfoOptions unset_remote(remote_crashpad_info);
|
2017-11-15 12:43:44 -05:00
|
|
|
|
|
|
|
|
|
// Make sure that the portion of the remote structure lying beyond its
|
|
|
|
|
// declared size reads as zero.
|
|
|
|
|
|
|
|
|
|
// 4 = offsetof(CrashpadInfo, size_), but it’s private.
|
|
|
|
|
uint32_t* size = reinterpret_cast<uint32_t*>(
|
|
|
|
|
reinterpret_cast<char*>(remote_crashpad_info) + 4);
|
|
|
|
|
|
|
|
|
|
// 21 = offsetof(CrashpadInfo, system_crash_reporter_forwarding_, but it’s
|
|
|
|
|
// private.
|
|
|
|
|
base::AutoReset<uint32_t> reset_size(size, 21);
|
|
|
|
|
|
|
|
|
|
// system_crash_reporter_forwarding_ is now beyond the struct’s declared
|
|
|
|
|
// size. Storage has actually been allocated for it, so it’s safe to set
|
|
|
|
|
// here.
|
|
|
|
|
remote_crashpad_info->set_crashpad_handler_behavior(TriState::kEnabled);
|
|
|
|
|
remote_crashpad_info->set_system_crash_reporter_forwarding(
|
|
|
|
|
TriState::kDisabled);
|
|
|
|
|
|
|
|
|
|
// Since system_crash_reporter_forwarding_ is beyond the struct’s declared
|
|
|
|
|
// size, it should read as 0 (TriState::kUnset), even though it was set to
|
|
|
|
|
// a different value above.
|
|
|
|
|
options = SelfProcessSnapshotAndGetCrashpadOptions();
|
|
|
|
|
EXPECT_EQ(options.crashpad_handler_behavior, TriState::kEnabled);
|
|
|
|
|
EXPECT_EQ(options.system_crash_reporter_forwarding, TriState::kUnset);
|
|
|
|
|
EXPECT_EQ(options.gather_indirectly_referenced_memory, TriState::kUnset);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-01-22 14:18:02 -05:00
|
|
|
|
INSTANTIATE_TEST_SUITE_P(CrashpadInfoSizes_ClientOptions,
|
|
|
|
|
CrashpadInfoSizes_ClientOptions,
|
|
|
|
|
testing::Values(FILE_PATH_LITERAL("small"),
|
|
|
|
|
FILE_PATH_LITERAL("large")));
|
2017-11-15 12:43:44 -05:00
|
|
|
|
|
2015-03-11 17:07:11 -04:00
|
|
|
|
} // namespace
|
|
|
|
|
} // namespace test
|
|
|
|
|
} // namespace crashpad
|