1c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// Copyright (c) 2011, Google Inc.
2c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// All rights reserved.
3c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org//
4c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// Redistribution and use in source and binary forms, with or without
5c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// modification, are permitted provided that the following conditions are
6c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// met:
7c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org//
8c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org//     * Redistributions of source code must retain the above copyright
9c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// notice, this list of conditions and the following disclaimer.
10c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org//     * Redistributions in binary form must reproduce the above
11c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// copyright notice, this list of conditions and the following disclaimer
12c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// in the documentation and/or other materials provided with the
13c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// distribution.
14c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org//     * Neither the name of Google Inc. nor the names of its
15c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// contributors may be used to endorse or promote products derived from
16c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// this software without specific prior written permission.
17c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org//
18c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
30c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// minidump_memory_range_unittest.cc:
31c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// Unit tests for google_breakpad::MinidumpMemoryRange.
32c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
33c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org#include "breakpad_googletest_includes.h"
34c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org#include "tools/linux/md2core/minidump_memory_range.h"
35c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
36c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgusing google_breakpad::MinidumpMemoryRange;
37c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgusing testing::Message;
38c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
39c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgnamespace {
40c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
416162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.comconst uint32_t kBuffer[10] = { 0 };
42c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgconst size_t kBufferSize = sizeof(kBuffer);
436162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.comconst uint8_t* kBufferPointer = reinterpret_cast<const uint8_t*>(kBuffer);
44c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
45c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// Test vectors for verifying Covers, GetData, and Subrange.
46c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgconst struct {
47c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  bool valid;
48c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  size_t offset;
49c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  size_t length;
50c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org} kSubranges[] = {
51c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { true, 0, 0 },
52c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { true, 0, 2 },
53c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { true, 0, kBufferSize },
54c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { true, 2, 0 },
55c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { true, 2, 4 },
56c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { true, 2, kBufferSize - 2 },
57c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { true, kBufferSize - 1, 1 },
58c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { false, kBufferSize, 0 },
59a76301cb05bfa00724258459808f084c9ffab243jessicag.feedback  { false, kBufferSize, static_cast<size_t>(-1) },
60c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { false, kBufferSize + 1, 0 },
61a76301cb05bfa00724258459808f084c9ffab243jessicag.feedback  { false, static_cast<size_t>(-1), 2 },
62c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { false, 1, kBufferSize },
63c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { false, kBufferSize - 1, 2 },
64a76301cb05bfa00724258459808f084c9ffab243jessicag.feedback  { false, 0, static_cast<size_t>(-1) },
65a76301cb05bfa00724258459808f084c9ffab243jessicag.feedback  { false, 1, static_cast<size_t>(-1) },
66c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org};
67c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgconst size_t kNumSubranges = sizeof(kSubranges) / sizeof(kSubranges[0]);
68c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
69c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org// Test vectors for verifying GetArrayElement.
70c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgconst struct {
71c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  size_t offset;
72c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  size_t size;
73c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  size_t index;
74c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  const void* const pointer;
75c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org} kElements[] = {
76c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  // Valid array elemenets
77c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { 0, 1, 0, kBufferPointer },
78c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { 0, 1, 1, kBufferPointer + 1 },
79c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { 0, 1, kBufferSize - 1, kBufferPointer + kBufferSize - 1 },
80c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { 0, 2, 1, kBufferPointer + 2 },
81c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { 0, 4, 2, kBufferPointer + 8 },
82c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { 0, 4, 9, kBufferPointer + 36 },
83c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { kBufferSize - 1, 1, 0, kBufferPointer + kBufferSize - 1 },
84c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  // Invalid array elemenets
85c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { 0, 1, kBufferSize, NULL },
86c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { 0, 4, 10, NULL },
87c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { kBufferSize - 1, 1, 1, NULL },
88c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { kBufferSize - 1, 2, 0, NULL },
89c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  { kBufferSize, 1, 0, NULL },
90c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org};
91c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgconst size_t kNumElements = sizeof(kElements) / sizeof(kElements[0]);
92c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
93c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org}  // namespace
94c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
95c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgTEST(MinidumpMemoryRangeTest, DefaultConstructor) {
96c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  MinidumpMemoryRange range;
97c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(NULL, range.data());
982971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, range.length());
99c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org}
100c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
101c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgTEST(MinidumpMemoryRangeTest, ConstructorWithDataAndLength) {
102c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  MinidumpMemoryRange range(kBuffer, kBufferSize);
103c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(kBufferPointer, range.data());
104c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(kBufferSize, range.length());
105c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org}
106c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
107c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgTEST(MinidumpMemoryRangeTest, Reset) {
108c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  MinidumpMemoryRange range;
109c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  range.Reset();
110c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(NULL, range.data());
1112971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, range.length());
112c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
113c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  range.Set(kBuffer, kBufferSize);
114c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(kBufferPointer, range.data());
115c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(kBufferSize, range.length());
116c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
117c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  range.Reset();
118c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(NULL, range.data());
1192971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, range.length());
120c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org}
121c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
122c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgTEST(MinidumpMemoryRangeTest, Set) {
123c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  MinidumpMemoryRange range;
124c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  range.Set(kBuffer, kBufferSize);
125c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(kBufferPointer, range.data());
126c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(kBufferSize, range.length());
127c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
128c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  range.Set(NULL, 0);
129c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(NULL, range.data());
1302971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, range.length());
131c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org}
132c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
133c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgTEST(MinidumpMemoryRangeTest, SubrangeOfEmptyMemoryRange) {
134c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  MinidumpMemoryRange range;
135c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  MinidumpMemoryRange subrange = range.Subrange(0, 10);
136c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(NULL, subrange.data());
1372971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_EQ(0U, subrange.length());
138c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org}
139c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
140c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgTEST(MinidumpMemoryRangeTest, SubrangeAndGetData) {
141c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  MinidumpMemoryRange range(kBuffer, kBufferSize);
142c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  for (size_t i = 0; i < kNumSubranges; ++i) {
143c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    bool valid = kSubranges[i].valid;
144c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    size_t sub_offset = kSubranges[i].offset;
145c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    size_t sub_length = kSubranges[i].length;
146c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    SCOPED_TRACE(Message() << "offset=" << sub_offset
147c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org                 << ", length=" << sub_length);
148c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
149c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    MinidumpMemoryRange subrange = range.Subrange(sub_offset, sub_length);
150c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    if (valid) {
151c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_TRUE(range.Covers(sub_offset, sub_length));
152c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_EQ(kBufferPointer + sub_offset,
153c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org                range.GetData(sub_offset, sub_length));
154c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_EQ(kBufferPointer + sub_offset, subrange.data());
155c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_EQ(sub_length, subrange.length());
156c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    } else {
157c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_FALSE(range.Covers(sub_offset, sub_length));
158c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_EQ(NULL, range.GetData(sub_offset, sub_length));
159c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_EQ(NULL, subrange.data());
1602971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com      EXPECT_EQ(0U, subrange.length());
161c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    }
162c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  }
163c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org}
164c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
165c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgTEST(MinidumpMemoryRangeTest, SubrangeWithMDLocationDescriptor) {
166c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  MinidumpMemoryRange range(kBuffer, kBufferSize);
167c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  for (size_t i = 0; i < kNumSubranges; ++i) {
168c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    bool valid = kSubranges[i].valid;
169c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    size_t sub_offset = kSubranges[i].offset;
170c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    size_t sub_length = kSubranges[i].length;
171c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    SCOPED_TRACE(Message() << "offset=" << sub_offset
172c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org                 << ", length=" << sub_length);
173c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
174c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    MDLocationDescriptor location;
175c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    location.rva = sub_offset;
176c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    location.data_size = sub_length;
177c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    MinidumpMemoryRange subrange = range.Subrange(location);
178c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    if (valid) {
179c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_TRUE(range.Covers(sub_offset, sub_length));
180c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_EQ(kBufferPointer + sub_offset,
181c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org                range.GetData(sub_offset, sub_length));
182c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_EQ(kBufferPointer + sub_offset, subrange.data());
183c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_EQ(sub_length, subrange.length());
184c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    } else {
185c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_FALSE(range.Covers(sub_offset, sub_length));
186c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_EQ(NULL, range.GetData(sub_offset, sub_length));
187c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      EXPECT_EQ(NULL, subrange.data());
1882971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com      EXPECT_EQ(0U, subrange.length());
189c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    }
190c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  }
191c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org}
192c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
193c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgTEST(MinidumpMemoryRangeTest, GetDataWithTemplateType) {
194c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  MinidumpMemoryRange range(kBuffer, kBufferSize);
195c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  const char* char_pointer = range.GetData<char>(0);
196c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(reinterpret_cast<const char*>(kBufferPointer), char_pointer);
197c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  const int* int_pointer = range.GetData<int>(0);
198c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(reinterpret_cast<const int*>(kBufferPointer), int_pointer);
199c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org}
200c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
201c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgTEST(MinidumpMemoryRangeTest, GetArrayElement) {
202c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  MinidumpMemoryRange range(kBuffer, kBufferSize);
203c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  for (size_t i = 0; i < kNumElements; ++i) {
204c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    size_t element_offset = kElements[i].offset;
205c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    size_t element_size = kElements[i].size;
206c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    unsigned element_index = kElements[i].index;
207c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    const void* const element_pointer = kElements[i].pointer;
208c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    SCOPED_TRACE(Message() << "offset=" << element_offset
209c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org                 << ", size=" << element_size
210c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org                 << ", index=" << element_index);
211c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org    EXPECT_EQ(element_pointer, range.GetArrayElement(
212c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org        element_offset, element_size, element_index));
213c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  }
214c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org}
215c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
216c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgTEST(MinidumpMemoryRangeTest, GetArrayElmentWithTemplateType) {
217c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  MinidumpMemoryRange range(kBuffer, kBufferSize);
218c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  const char* char_pointer = range.GetArrayElement<char>(0, 0);
219c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(reinterpret_cast<const char*>(kBufferPointer), char_pointer);
220c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  const int* int_pointer = range.GetArrayElement<int>(0, 0);
221c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ(reinterpret_cast<const int*>(kBufferPointer), int_pointer);
222c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org}
223c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
224c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.orgTEST(MinidumpMemoryRangeTest, GetAsciiMDString) {
2256162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com  uint8_t buffer[100] = { 0 };
226c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
227c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  MDString* md_str = reinterpret_cast<MDString*>(buffer);
228c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->length = 4;
229c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[0] = 'T';
230c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[1] = 'e';
231c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[2] = 's';
232c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[3] = 't';
233c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[4] = '\0';
234c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
235c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  size_t str2_offset =
2366162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com      sizeof(MDString) + (md_str->length + 1) * sizeof(uint16_t);
237c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
238c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str = reinterpret_cast<MDString*>(buffer + str2_offset);
239c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->length = 9;  // Test length larger than actual string
240c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[0] = 'S';
241c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[1] = 't';
242c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[2] = 'r';
243c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[3] = 'i';
244c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[4] = 'n';
245c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[5] = 'g';
246c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[6] = '\0';
247c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[7] = '1';
248c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  md_str->buffer[8] = '2';
249c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
250c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  MinidumpMemoryRange range(buffer, sizeof(buffer));
251c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ("Test", range.GetAsciiMDString(0));
252c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ("String", range.GetAsciiMDString(str2_offset));
253c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org
254c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  // Test out-of-bounds cases.
255c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ("", range.GetAsciiMDString(
256c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org      sizeof(buffer) - sizeof(MDString) + 1));
257c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org  EXPECT_EQ("", range.GetAsciiMDString(sizeof(buffer)));
258c89e2798e27cc57e1d543e49b6303fda80fc6c7bbenchan@chromium.org}
259