1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <algorithm>
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector>
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/file_util.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/platform_file.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/media_galleries/pmp_constants.h"
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/media_galleries/pmp_test_helper.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/utility/media_galleries/pmp_column_reader.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace picasa {
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool InitColumnReaderFromBytes(
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    PmpColumnReader* const reader,
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const std::vector<char>& data,
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const PmpFieldType expected_type) {
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::ScopedTempDir temp_dir;
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!temp_dir.CreateUniqueTempDir())
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::FilePath temp_path;
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!file_util::CreateTemporaryFileInDir(temp_dir.path(), &temp_path))
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Explicit conversion from signed to unsigned.
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  size_t bytes_written = file_util::WriteFile(temp_path, &data[0], data.size());
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (bytes_written != data.size())
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int flags = base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ;
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::PlatformFile platform_file =
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::CreatePlatformFile(temp_path, flags, NULL, NULL);
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (platform_file == base::kInvalidPlatformFileValue)
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool read_success = reader->ReadFile(platform_file, expected_type);
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::ClosePlatformFile(platform_file);
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return read_success;
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Overridden version of Read method to make test code templatable.
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DoRead(const PmpColumnReader* reader, uint32 row, std::string* target) {
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return reader->ReadString(row, target);
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DoRead(const PmpColumnReader* reader, uint32 row, uint32* target) {
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return reader->ReadUInt32(row, target);
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DoRead(const PmpColumnReader* reader, uint32 row, double* target) {
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return reader->ReadDouble64(row, target);
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DoRead(const PmpColumnReader* reader, uint32 row, uint8* target) {
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return reader->ReadUInt8(row, target);
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool DoRead(const PmpColumnReader* reader, uint32 row, uint64* target) {
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return reader->ReadUInt64(row, target);
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TestValid
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<class T>
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void TestValid(const PmpFieldType field_type,
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               const std::vector<T>& elems) {
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PmpTestHelper test_helper("test");
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(test_helper.Init());
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PmpColumnReader reader;
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<char> data =
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PmpTestHelper::MakeHeaderAndBody(field_type, elems.size(), elems);
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(InitColumnReaderFromBytes(&reader, data, field_type));
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(elems.size(), reader.rows_read());
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  for (uint32 i = 0; i < elems.size() && i < reader.rows_read(); i++) {
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    T target;
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(DoRead(&reader, i, &target));
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(elems[i], target);
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<class T>
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void TestMalformed(const PmpFieldType field_type,
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   const std::vector<T>& elems) {
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PmpTestHelper test_helper("test");
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(test_helper.Init());
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PmpColumnReader reader_too_few_declared_rows;
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<char> data_too_few_declared_rows =
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PmpTestHelper::MakeHeaderAndBody(field_type, elems.size()-1, elems);
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(InitColumnReaderFromBytes(&reader_too_few_declared_rows,
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         data_too_few_declared_rows,
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         field_type));
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PmpColumnReader reader_too_many_declared_rows;
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<char> data_too_many_declared_rows =
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PmpTestHelper::MakeHeaderAndBody(field_type, elems.size()+1, elems);
107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(InitColumnReaderFromBytes(&reader_too_many_declared_rows,
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         data_too_many_declared_rows,
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         field_type));
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PmpColumnReader reader_truncated;
112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<char> data_truncated =
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PmpTestHelper::MakeHeaderAndBody(field_type, elems.size(), elems);
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  data_truncated.resize(data_truncated.size()-10);
115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(InitColumnReaderFromBytes(&reader_truncated,
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         data_truncated,
117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         field_type));
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PmpColumnReader reader_padded;
120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<char> data_padded =
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PmpTestHelper::MakeHeaderAndBody(field_type, elems.size(), elems);
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  data_padded.resize(data_padded.size()+10);
123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(InitColumnReaderFromBytes(&reader_padded,
124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         data_padded,
125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         field_type));
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<class T>
129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void TestPrimitive(const PmpFieldType field_type) {
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Make an ascending vector of the primitive.
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint32 n = 100;
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<T> data(n, 0);
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (uint32 i = 0; i < n; i++) {
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    data[i] = i*3;
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestValid<T>(field_type, data);
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestMalformed<T>(field_type, data);
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PmpColumnReaderTest, HeaderParsingAndValidation) {
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PmpTestHelper test_helper("test");
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(test_helper.Init());
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PmpColumnReader reader_good_header;
147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<char> good_header =
148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      PmpTestHelper::MakeHeader(PMP_TYPE_STRING, 0);
149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_TRUE(InitColumnReaderFromBytes(&reader_good_header,
150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                        good_header,
151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                        PMP_TYPE_STRING));
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0U, reader_good_header.rows_read()) <<
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "Read non-zero rows from header-only data.";
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PmpColumnReader reader_bad_magic_bytes;
156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<char> bad_magic_bytes =
157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      PmpTestHelper::MakeHeader(PMP_TYPE_STRING, 0);
158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bad_magic_bytes[0] = (char)0xff;
159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(InitColumnReaderFromBytes(&reader_bad_magic_bytes,
160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         bad_magic_bytes,
161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         PMP_TYPE_STRING));
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PmpColumnReader reader_inconsistent_types;
164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<char> inconsistent_type =
165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      PmpTestHelper::MakeHeader(PMP_TYPE_STRING, 0);
166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  inconsistent_type[kPmpFieldType1Offset] = (char)0xff;
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(InitColumnReaderFromBytes(&reader_inconsistent_types,
168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         inconsistent_type,
169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         PMP_TYPE_STRING));
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PmpColumnReader reader_invalid_type;
172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<char> invalid_type =
173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      PmpTestHelper::MakeHeader(PMP_TYPE_STRING, 0);
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  invalid_type[kPmpFieldType1Offset] = (char)0xff;
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  invalid_type[kPmpFieldType2Offset] = (char)0xff;
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(InitColumnReaderFromBytes(&reader_invalid_type,
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         invalid_type,
178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         PMP_TYPE_STRING));
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PmpColumnReader reader_incomplete_header;
181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::vector<char> incomplete_header =
182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      PmpTestHelper::MakeHeader(PMP_TYPE_STRING, 0);
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  incomplete_header.resize(10);
184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(InitColumnReaderFromBytes(&reader_incomplete_header,
185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         incomplete_header,
186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                         PMP_TYPE_STRING));
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PmpColumnReaderTest, StringParsing) {
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> empty_strings(100, "");
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Test empty strings read okay.
193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestValid(PMP_TYPE_STRING, empty_strings);
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> mixed_strings;
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mixed_strings.push_back("");
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mixed_strings.push_back("Hello");
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mixed_strings.push_back("World");
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mixed_strings.push_back("");
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mixed_strings.push_back("123123");
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mixed_strings.push_back("Q");
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  mixed_strings.push_back("");
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Test that a mixed set of strings read correctly.
205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestValid(PMP_TYPE_STRING, mixed_strings);
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Test with the data messed up in a variety of ways.
208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestMalformed(PMP_TYPE_STRING, mixed_strings);
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST(PmpColumnReaderTest, PrimitiveParsing) {
212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestPrimitive<uint32>(PMP_TYPE_UINT32);
213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestPrimitive<double>(PMP_TYPE_DOUBLE64);
214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestPrimitive<uint8>(PMP_TYPE_UINT8);
215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestPrimitive<uint64>(PMP_TYPE_UINT64);
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace picasa
221