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