Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Side by Side Diff: chrome/test/base/mof_data_parser_test_win.cc

Issue 9584017: New test infrastructure for producing verbose logs in failing tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: addressed robert's comments Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <vector>
6
7 #include "base/basictypes.h"
8 #include "chrome/test/base/mof_data_parser_win.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 // A test fixture for Mof parser tests.
12 class MofDataParserTest : public ::testing::Test {
Paweł Hajdan Jr. 2012/03/09 18:12:12 nit: Could you just rename the file to say unittes
grt (UTC plus 2) 2012/03/09 20:38:58 Done.
13 protected:
14 EVENT_TRACE* MakeEventWithDataOfSize(size_t size);
15 template<typename T> EVENT_TRACE* MakeEventWithBlittedValue(T value) {
16 EVENT_TRACE* event = MakeEventWithDataOfSize(sizeof(value));
17 *reinterpret_cast<T*>(event->MofData) = value;
18 return event;
19 }
20 EVENT_TRACE* MakeEventWithDWORD(DWORD value);
21 EVENT_TRACE* MakeEventWithPointerArray(const void* const* pointers,
22 DWORD size);
23 EVENT_TRACE* MakeEventWithString(const char* a_string, size_t length);
24
25 std::vector<uint8> buffer_;
26 };
27
28 EVENT_TRACE* MofDataParserTest::MakeEventWithDataOfSize(size_t size) {
29 buffer_.assign(sizeof(EVENT_TRACE) + size, 0);
30 EVENT_TRACE* event = reinterpret_cast<EVENT_TRACE*>(&buffer_[0]);
31 event->MofLength = size;
32 event->MofData = &buffer_[sizeof(EVENT_TRACE)];
33 return event;
34 }
35
36 EVENT_TRACE* MofDataParserTest::MakeEventWithDWORD(DWORD value) {
37 return MakeEventWithBlittedValue(value);
38 }
39
40 EVENT_TRACE* MofDataParserTest::MakeEventWithPointerArray(
41 const void* const* pointers,
42 DWORD size) {
43 EVENT_TRACE* event =
44 MakeEventWithDataOfSize(sizeof(DWORD) + sizeof(*pointers) * size);
45 *reinterpret_cast<DWORD*>(event->MofData) = size;
46 ::memcpy(reinterpret_cast<DWORD*>(event->MofData) + 1, pointers,
47 sizeof(*pointers) * size);
48 return event;
49 }
50
51 // |length| is the number of bytes to put in (i.e., include the terminator if
52 // you want one).
53 EVENT_TRACE* MofDataParserTest::MakeEventWithString(const char* a_string,
54 size_t length) {
55 EVENT_TRACE* event = MakeEventWithDataOfSize(length);
56 ::memcpy(event->MofData, a_string, length);
57 return event;
58 }
59
60 // Tests reading a primitive value. ReadDWORD, ReadInt, and ReadPointer share
61 // the same implementation, so this test covers all three.
62 TEST_F(MofDataParserTest, ReadPrimitive) {
63
64 // Read a valid DWORD.
65 EVENT_TRACE* event = MakeEventWithDWORD(5);
66 {
67 DWORD value = 0;
68 logging_win::MofDataParser parser(event);
69 EXPECT_FALSE(parser.empty());
70 EXPECT_TRUE(parser.ReadDWORD(&value));
71 EXPECT_EQ(5UL, value);
72 EXPECT_TRUE(parser.empty());
73 }
74
75 // Try again if there's insufficient data.
76 --(event->MofLength);
77 {
78 DWORD value = 0;
79 logging_win::MofDataParser parser(event);
80 EXPECT_FALSE(parser.empty());
81 EXPECT_FALSE(parser.ReadDWORD(&value));
82 EXPECT_EQ(0UL, value);
83 }
84 }
85
86 // Tests reading an array of pointer-sized values. These arrays are encoded by
87 // writing a DWORD item count followed by the items.
88 TEST_F(MofDataParserTest, ReadPointerArray) {
89 const void* const pointers[] = { this, &buffer_ };
90 const DWORD array_size = arraysize(pointers);
91
92 // Read a valid array of two pointers.
93 EVENT_TRACE* event = MakeEventWithPointerArray(&pointers[0], array_size);
94 {
95 DWORD size = 0;
96 const intptr_t* values = NULL;
97
98 logging_win::MofDataParser parser(event);
99 EXPECT_FALSE(parser.empty());
100 EXPECT_TRUE(parser.ReadDWORD(&size));
101 EXPECT_EQ(array_size, size);
102 EXPECT_TRUE(parser.ReadPointerArray(size, &values));
103 EXPECT_EQ(0, ::memcmp(&pointers[0], values, sizeof(*values) * size));
104 EXPECT_TRUE(parser.empty());
105 }
106
107 // Try again if there's insufficient data.
108 --(event->MofLength);
109 {
110 DWORD size = 0;
111 const intptr_t* values = NULL;
112
113 logging_win::MofDataParser parser(event);
114 EXPECT_FALSE(parser.empty());
115 EXPECT_TRUE(parser.ReadDWORD(&size));
116 EXPECT_EQ(array_size, size);
117 EXPECT_FALSE(parser.ReadPointerArray(size, &values));
118 EXPECT_FALSE(parser.empty());
119 }
120 }
121
122 // Tests reading a structure.
123 TEST_F(MofDataParserTest, ReadStructure) {
124 struct Spam {
125 int blorf;
126 char spiffy;
127 };
128 const Spam canned_meat = { 47, 'Y' };
129
130 // Read a pointer to a structure.
131 EVENT_TRACE* event = MakeEventWithBlittedValue(canned_meat);
132 {
133 const Spam* value = NULL;
134 logging_win::MofDataParser parser(event);
135 EXPECT_FALSE(parser.empty());
136 EXPECT_TRUE(parser.ReadStructure(&value));
137 EXPECT_EQ(canned_meat.blorf, value->blorf);
138 EXPECT_EQ(canned_meat.spiffy, value->spiffy);
139 EXPECT_TRUE(parser.empty());
140 }
141
142 // Try again if there's insufficient data.
143 --(event->MofLength);
144 {
145 const Spam* value = NULL;
146 logging_win::MofDataParser parser(event);
147 EXPECT_FALSE(parser.empty());
148 EXPECT_FALSE(parser.ReadStructure(&value));
149 EXPECT_FALSE(parser.empty());
150 }
151 }
152
153 // Tests reading null-terminated string.
154 TEST_F(MofDataParserTest, ReadString) {
155 const char a_string_nl[] = "sometimes i get lost in my own thoughts.\n";
156 const char a_string[] = "sometimes i get lost in my own thoughts.";
157
158 // Read a string with a trailing newline.
159 EVENT_TRACE* event =
160 MakeEventWithString(a_string_nl, arraysize(a_string_nl));
161 {
162 base::StringPiece value;
163 logging_win::MofDataParser parser(event);
164 EXPECT_FALSE(parser.empty());
165 EXPECT_TRUE(parser.ReadString(&value));
166 EXPECT_EQ(base::StringPiece(&a_string_nl[0], arraysize(a_string_nl) - 2),
167 value);
168 EXPECT_TRUE(parser.empty());
169 }
170
171 // Read a string without a trailing newline.
172 event = MakeEventWithString(a_string, arraysize(a_string));
173 {
174 base::StringPiece value;
175 logging_win::MofDataParser parser(event);
176 EXPECT_FALSE(parser.empty());
177 EXPECT_TRUE(parser.ReadString(&value));
178 EXPECT_EQ(base::StringPiece(&a_string[0], arraysize(a_string) - 1), value);
179 EXPECT_TRUE(parser.empty());
180 }
181
182 // Try a string that isn't terminated.
183 event = MakeEventWithString(a_string, arraysize(a_string) - 1);
184 {
185 base::StringPiece value;
186 logging_win::MofDataParser parser(event);
187 EXPECT_FALSE(parser.empty());
188 EXPECT_FALSE(parser.ReadString(&value));
189 EXPECT_FALSE(parser.empty());
190 }
191 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698