pmp_column_reader_unittest.cc revision a36e5920737c6adbddd3e43b760e5de8431db6e0
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