1972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// Copyright (c) 2013, Google Inc.
2972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// All rights reserved.
3972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org//
4972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// Redistribution and use in source and binary forms, with or without
5972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// modification, are permitted provided that the following conditions are
6972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// met:
7972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org//
8972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org//     * Redistributions of source code must retain the above copyright
9972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// notice, this list of conditions and the following disclaimer.
10972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org//     * Redistributions in binary form must reproduce the above
11972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// copyright notice, this list of conditions and the following disclaimer
12972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// in the documentation and/or other materials provided with the
13972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// distribution.
14972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org//     * Neither the name of Google Inc. nor the names of its
15972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// contributors may be used to endorse or promote products derived from
16972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// this software without specific prior written permission.
17972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org//
18972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
30972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include <stdlib.h>
31972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include <unistd.h>
32972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include <sys/types.h>
33972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include <stdio.h>
34972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include <errno.h>
35972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include <string.h>
36972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
37972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include "client/linux/minidump_writer/proc_cpuinfo_reader.h"
38972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#include "breakpad_googletest_includes.h"
390cd0f17fd73c3e0619d5506afbee284dc46d3ad7mark@chromium.org#include "common/linux/tests/auto_testfile.h"
40972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
41972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgusing namespace google_breakpad;
42972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
43972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#if !defined(__ANDROID__)
44972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#define TEMPDIR "/tmp"
45972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#else
46972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#define TEMPDIR "/data/local/tmp"
47972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org#endif
48972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
49972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
50972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgnamespace {
51972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
52972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgtypedef testing::Test ProcCpuInfoReaderTest;
53972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
54972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgclass ScopedTestFile : public AutoTestFile {
55972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgpublic:
56972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  explicit ScopedTestFile(const char* text)
57972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org    : AutoTestFile("proc_cpuinfo_reader", text) {
58972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  }
59972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org};
60972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
61972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
62972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
63972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(ProcCpuInfoReaderTest, EmptyFile) {
64972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("");
65972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
66972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ProcCpuInfoReader reader(file.GetFd());
67972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
68972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  const char *field;
69972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_FALSE(reader.GetNextField(&field));
70972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
71972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
72972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(ProcCpuInfoReaderTest, OneLineTerminated) {
73972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("foo : bar\n");
74972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
75972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ProcCpuInfoReader reader(file.GetFd());
76972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
77972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  const char *field;
78972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(reader.GetNextField(&field));
79972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("foo", field);
80972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("bar", reader.GetValue());
81972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
82972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_FALSE(reader.GetNextField(&field));
83972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
84972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
85972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(ProcCpuInfoReaderTest, OneLine) {
86972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("foo : bar");
87972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
88972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ProcCpuInfoReader reader(file.GetFd());
89972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
90972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  const char *field;
91972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  size_t value_len;
92972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(reader.GetNextField(&field));
93972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("foo", field);
94972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("bar", reader.GetValueAndLen(&value_len));
95972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(3U, value_len);
96972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
97972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_FALSE(reader.GetNextField(&field));
98972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
99972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
100972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(ProcCpuInfoReaderTest, TwoLinesTerminated) {
101972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("foo : bar\nzoo : tut\n");
102972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
103972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ProcCpuInfoReader reader(file.GetFd());
104972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
105972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  const char* field;
106972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(reader.GetNextField(&field));
107972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("foo", field);
108972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("bar", reader.GetValue());
109972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
110972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(reader.GetNextField(&field));
111972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("zoo", field);
112972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("tut", reader.GetValue());
113972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
114972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_FALSE(reader.GetNextField(&field));
115972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
116972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
117972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(ProcCpuInfoReaderTest, SkipMalformedLine) {
118972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("this line should have a column\nfoo : bar\n");
119972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
120972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ProcCpuInfoReader reader(file.GetFd());
121972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
122972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  const char* field;
123972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(reader.GetNextField(&field));
124972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("foo", field);
125972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("bar", reader.GetValue());
126972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
127972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_FALSE(reader.GetNextField(&field));
128972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
129972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
130972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(ProcCpuInfoReaderTest, SkipOneEmptyLine) {
131972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("\n\nfoo : bar\n");
132972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
133972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ProcCpuInfoReader reader(file.GetFd());
134972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
135972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  const char* field;
136972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(reader.GetNextField(&field));
137972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("foo", field);
138972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("bar", reader.GetValue());
139972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
140972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_FALSE(reader.GetNextField(&field));
141972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
142972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
143972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(ProcCpuInfoReaderTest, SkipEmptyField) {
144972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file(" : bar\nzoo : tut\n");
145972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
146972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ProcCpuInfoReader reader(file.GetFd());
147972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
148972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  const char* field;
149972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(reader.GetNextField(&field));
150972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("zoo", field);
151972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("tut", reader.GetValue());
152972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
153972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_FALSE(reader.GetNextField(&field));
154972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
155972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
156972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(ProcCpuInfoReaderTest, SkipTwoEmptyLines) {
157972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("foo : bar\n\n\nfoo : bar\n");
158972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
159972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ProcCpuInfoReader reader(file.GetFd());
160972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
161972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  const char* field;
162972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(reader.GetNextField(&field));
163972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("foo", field);
164972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("bar", reader.GetValue());
165972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
166972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(reader.GetNextField(&field));
167972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("foo", field);
168972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("bar", reader.GetValue());
169972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
170972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_FALSE(reader.GetNextField(&field));
171972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
172972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
173972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(ProcCpuInfoReaderTest, FieldWithSpaces) {
174972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("foo bar    : zoo\n");
175972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
176972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ProcCpuInfoReader reader(file.GetFd());
177972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
178972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  const char* field;
179972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(reader.GetNextField(&field));
180972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("foo bar", field);
181972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("zoo", reader.GetValue());
182972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
183972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_FALSE(reader.GetNextField(&field));
184972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
185972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
186972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.orgTEST(ProcCpuInfoReaderTest, EmptyValue) {
187972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ScopedTestFile file("foo :\n");
188972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(file.IsOk());
189972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ProcCpuInfoReader reader(file.GetFd());
190972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
191972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  const char* field;
192972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_TRUE(reader.GetNextField(&field));
193972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("foo", field);
194972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  size_t value_len;
195972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_STREQ("", reader.GetValueAndLen(&value_len));
196972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_EQ(0U, value_len);
197972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org
198972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org  ASSERT_FALSE(reader.GetNextField(&field));
199972816ca0a2c53907b4a75c8351bed0802c9e91bdigit@chromium.org}
200