minidump_context_writer_test.cc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // Copyright 2014 The Crashpad Authors. All rights reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "minidump/minidump_context_writer.h"
  15. #include <stdint.h>
  16. #include "gtest/gtest.h"
  17. #include "minidump/minidump_context.h"
  18. #include "minidump/test/minidump_context_test_util.h"
  19. #include "minidump/test/minidump_writable_test_util.h"
  20. #include "snapshot/cpu_context.h"
  21. #include "snapshot/test/test_cpu_context.h"
  22. #include "util/file/string_file.h"
  23. namespace crashpad {
  24. namespace test {
  25. namespace {
  26. TEST(MinidumpContextWriter, MinidumpContextX86Writer) {
  27. StringFile string_file;
  28. {
  29. // Make sure that a context writer that’s untouched writes a zeroed-out
  30. // context.
  31. SCOPED_TRACE("zero");
  32. MinidumpContextX86Writer context_writer;
  33. EXPECT_TRUE(context_writer.WriteEverything(&string_file));
  34. ASSERT_EQ(string_file.string().size(), sizeof(MinidumpContextX86));
  35. const MinidumpContextX86* observed =
  36. MinidumpWritableAtRVA<MinidumpContextX86>(string_file.string(), 0);
  37. ASSERT_TRUE(observed);
  38. ExpectMinidumpContextX86(0, observed, false);
  39. }
  40. {
  41. SCOPED_TRACE("nonzero");
  42. string_file.Reset();
  43. constexpr uint32_t kSeed = 0x8086;
  44. MinidumpContextX86Writer context_writer;
  45. InitializeMinidumpContextX86(context_writer.context(), kSeed);
  46. EXPECT_TRUE(context_writer.WriteEverything(&string_file));
  47. ASSERT_EQ(string_file.string().size(), sizeof(MinidumpContextX86));
  48. const MinidumpContextX86* observed =
  49. MinidumpWritableAtRVA<MinidumpContextX86>(string_file.string(), 0);
  50. ASSERT_TRUE(observed);
  51. ExpectMinidumpContextX86(kSeed, observed, false);
  52. }
  53. }
  54. TEST(MinidumpContextWriter, MinidumpContextAMD64Writer) {
  55. {
  56. // Make sure that a heap-allocated context writer has the proper alignment,
  57. // because it may be nonstandard.
  58. auto context_writer = std::make_unique<MinidumpContextAMD64Writer>();
  59. EXPECT_EQ(reinterpret_cast<uintptr_t>(context_writer.get()) &
  60. (alignof(MinidumpContextAMD64Writer) - 1),
  61. 0u);
  62. }
  63. StringFile string_file;
  64. {
  65. // Make sure that a context writer that’s untouched writes a zeroed-out
  66. // context.
  67. SCOPED_TRACE("zero");
  68. MinidumpContextAMD64Writer context_writer;
  69. EXPECT_TRUE(context_writer.WriteEverything(&string_file));
  70. ASSERT_EQ(string_file.string().size(), sizeof(MinidumpContextAMD64));
  71. const MinidumpContextAMD64* observed =
  72. MinidumpWritableAtRVA<MinidumpContextAMD64>(string_file.string(), 0);
  73. ASSERT_TRUE(observed);
  74. ExpectMinidumpContextAMD64(0, observed, false);
  75. }
  76. {
  77. SCOPED_TRACE("nonzero");
  78. string_file.Reset();
  79. constexpr uint32_t kSeed = 0x808664;
  80. MinidumpContextAMD64Writer context_writer;
  81. InitializeMinidumpContextAMD64(context_writer.context(), kSeed);
  82. EXPECT_TRUE(context_writer.WriteEverything(&string_file));
  83. ASSERT_EQ(string_file.string().size(), sizeof(MinidumpContextAMD64));
  84. const MinidumpContextAMD64* observed =
  85. MinidumpWritableAtRVA<MinidumpContextAMD64>(string_file.string(), 0);
  86. ASSERT_TRUE(observed);
  87. ExpectMinidumpContextAMD64(kSeed, observed, false);
  88. }
  89. }
  90. TEST(MinidumpContextWriter, CreateFromSnapshot_X86) {
  91. constexpr uint32_t kSeed = 32;
  92. CPUContextX86 context_snapshot_x86;
  93. CPUContext context_snapshot;
  94. context_snapshot.x86 = &context_snapshot_x86;
  95. InitializeCPUContextX86(&context_snapshot, kSeed);
  96. std::unique_ptr<MinidumpContextWriter> context_writer =
  97. MinidumpContextWriter::CreateFromSnapshot(&context_snapshot);
  98. ASSERT_TRUE(context_writer);
  99. StringFile string_file;
  100. ASSERT_TRUE(context_writer->WriteEverything(&string_file));
  101. const MinidumpContextX86* observed =
  102. MinidumpWritableAtRVA<MinidumpContextX86>(string_file.string(), 0);
  103. ASSERT_TRUE(observed);
  104. ExpectMinidumpContextX86(kSeed, observed, true);
  105. }
  106. TEST(MinidumpContextWriter, CreateFromSnapshot_AMD64) {
  107. constexpr uint32_t kSeed = 64;
  108. CPUContextX86_64 context_snapshot_x86_64;
  109. CPUContext context_snapshot;
  110. context_snapshot.x86_64 = &context_snapshot_x86_64;
  111. InitializeCPUContextX86_64(&context_snapshot, kSeed);
  112. std::unique_ptr<MinidumpContextWriter> context_writer =
  113. MinidumpContextWriter::CreateFromSnapshot(&context_snapshot);
  114. ASSERT_TRUE(context_writer);
  115. StringFile string_file;
  116. ASSERT_TRUE(context_writer->WriteEverything(&string_file));
  117. const MinidumpContextAMD64* observed =
  118. MinidumpWritableAtRVA<MinidumpContextAMD64>(string_file.string(), 0);
  119. ASSERT_TRUE(observed);
  120. ExpectMinidumpContextAMD64(kSeed, observed, true);
  121. }
  122. } // namespace
  123. } // namespace test
  124. } // namespace crashpad