Chromium Code Reviews| Index: webkit/fileapi/media/picasa/pmp_column_reader_unittest.cc |
| diff --git a/webkit/fileapi/media/picasa/pmp_column_reader_unittest.cc b/webkit/fileapi/media/picasa/pmp_column_reader_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..9cebb00c662d75df2cd7d136c6fd7194e66e6cfb |
| --- /dev/null |
| +++ b/webkit/fileapi/media/picasa/pmp_column_reader_unittest.cc |
| @@ -0,0 +1,175 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include <algorithm> |
| +#include <vector> |
| + |
| +#include "base/file_util.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| +#include "webkit/fileapi/media/picasa/pmp_column_reader.h" |
| +#include "webkit/fileapi/media/picasa/pmp_constants.h" |
| +#include "webkit/fileapi/media/picasa/pmp_test_helper.h" |
| + |
| +namespace { |
| + |
| +using fileapi::PmpColumnReader; |
| +using fileapi::PmpTestHelper; |
| + |
| +// Writes memory into a temporary file for use in test |
| +bool ReaderReadFromVector(PmpColumnReader* const reader, |
|
vandebo (ex-Chrome)
2013/03/29 21:35:07
InitColumnReaderFromMemory ?
tommycli
2013/04/01 22:19:18
Done.
|
| + std::vector<uint8> data, uint32* rows_read) { |
| + base::FilePath temppath; |
| + |
| + if(!file_util::CreateTemporaryFile(&temppath) || |
| + !PmpTestHelper::WriteToFile(temppath, data)) { |
| + return false; |
| + } |
| + |
| + bool success = reader->InitFromFile(temppath, rows_read); |
| + |
| + file_util::Delete(temppath, true); |
| + |
| + return success; |
| +} |
| + |
| +// Overridden version of Read method to make test code templatable. |
| +bool DoRead(const PmpColumnReader* reader, uint32 row, std::string* target) { |
| + return reader->ReadString(row, target); |
| +} |
| + |
| +bool DoRead(const PmpColumnReader* reader, uint32 row, uint32* target) { |
| + return reader->ReadUInt32(row, target); |
| +} |
| + |
| +bool DoRead(const PmpColumnReader* reader, uint32 row, double* target) { |
| + return reader->ReadDouble64(row, target); |
| +} |
| + |
| +bool DoRead(const PmpColumnReader* reader, uint32 row, uint8* target) { |
| + return reader->ReadUInt8(row, target); |
| +} |
| + |
| +bool DoRead(const PmpColumnReader* reader, uint32 row, uint64* target) { |
| + return reader->ReadUInt64(row, target); |
| +} |
| + |
| +// TestValid |
| +template<class T> |
| +void TestValid(PmpColumnReader* reader, const uint16 field_type, |
| + const std::vector<T>& elems) { |
| + uint32 rows_read = 0xFF; |
| + |
| + std::vector<uint8> data = |
| + PmpTestHelper::MakeHeaderAndBody(field_type, elems.size(), elems); |
| + EXPECT_TRUE(ReaderReadFromVector(reader, data, &rows_read)); |
| + EXPECT_EQ(elems.size(), rows_read); |
| + |
| + for(uint32 i = 0; i < elems.size(); i++) { |
|
vandebo (ex-Chrome)
2013/03/29 21:35:07
i < elems.size() && i < rows_read. You've already
tommycli
2013/04/01 22:19:18
Done.
|
| + T target; |
| + EXPECT_TRUE(DoRead(reader, i, &target)); |
| + EXPECT_EQ(elems[i], target); |
| + } |
| +} |
| + |
| +template<class T> |
| +void TestMalformed(PmpColumnReader* reader, const uint16 field_type, |
| + const std::vector<T>& elems) { |
| + |
| + std::vector<uint8> data_too_few_declared_rows = |
| + PmpTestHelper::MakeHeaderAndBody(field_type, elems.size()-1, elems); |
| + EXPECT_FALSE(ReaderReadFromVector(reader, data_too_few_declared_rows, NULL)); |
| + |
| + std::vector<uint8> data_too_many_declared_rows = |
| + PmpTestHelper::MakeHeaderAndBody(field_type, elems.size()+1, elems); |
| + EXPECT_FALSE(ReaderReadFromVector(reader, data_too_many_declared_rows, NULL)); |
| + |
| + std::vector<uint8> data_truncated = |
| + PmpTestHelper::MakeHeaderAndBody(field_type, elems.size(), elems); |
| + data_truncated.resize(data_truncated.size()-10); |
| + |
| + EXPECT_FALSE(ReaderReadFromVector(reader, data_truncated, NULL)); |
| + |
| + std::vector<uint8> data_padded = |
| + PmpTestHelper::MakeHeaderAndBody(field_type, elems.size(), elems); |
| + data_padded.resize(data_padded.size()+10); |
| + EXPECT_FALSE(ReaderReadFromVector(reader, data_padded, NULL)); |
| +} |
| + |
| +template<class T> |
| +void TestPrimitives(const uint16 field_type) { |
| + PmpColumnReader reader; |
| + |
| + // Make an ascending vector of the primitive. |
| + uint32 n = 100; |
| + std::vector<T> data(n, 0); |
| + for(uint32 i = 0; i < n; i++) { |
| + data[i] = i*3; |
| + } |
| + |
| + TestValid<T>(&reader, field_type, data); |
| + TestMalformed<T>(&reader, field_type, data); |
| +} |
| + |
| + |
| +TEST(PmpColumnReaderTest, HeaderParsingAndValidation) { |
| + PmpColumnReader reader; |
| + |
| + // Good header. |
| + uint32 rows_read = 0xFF; |
| + std::vector<uint8> good_header = PmpTestHelper::MakeHeader(0x00, 0); |
| + EXPECT_TRUE(ReaderReadFromVector(&reader, good_header, &rows_read)); |
| + EXPECT_EQ(0U, rows_read) << "Read non-zero rows from header-only data."; |
| + |
| + // Botch up elements of the header. |
| + std::vector<uint8> bad_magic_byte = PmpTestHelper::MakeHeader(0x00, 0); |
| + bad_magic_byte[0] = 0xff; |
| + EXPECT_FALSE(ReaderReadFromVector(&reader, bad_magic_byte, NULL)); |
| + |
| + // Corrupt means the type fields don't agree. |
| + std::vector<uint8> corrupt_type = PmpTestHelper::MakeHeader(0x00, 0); |
| + corrupt_type[fileapi::kPmpFieldType1Offset] = 0xff; |
| + EXPECT_FALSE(ReaderReadFromVector(&reader, corrupt_type, NULL)); |
| + |
| + std::vector<uint8> invalid_type = PmpTestHelper::MakeHeader(0x00, 0); |
| + invalid_type[fileapi::kPmpFieldType1Offset] = 0xff; |
| + invalid_type[fileapi::kPmpFieldType2Offset] = 0xff; |
| + EXPECT_FALSE(ReaderReadFromVector(&reader, invalid_type, NULL)); |
| + |
| + std::vector<uint8> incomplete_header = PmpTestHelper::MakeHeader(0x00, 0); |
| + incomplete_header.resize(10); |
| + EXPECT_FALSE(ReaderReadFromVector(&reader, incomplete_header, NULL)); |
| +} |
| + |
| +TEST(PmpColumnReaderTest, StringParsing) { |
| + PmpColumnReader reader; |
| + |
| + std::vector<std::string> empty_strings(100, ""); |
| + |
| + // Test empty strings read okay. |
| + TestValid(&reader, fileapi::kPmpFieldTypeString, empty_strings); |
| + |
| + std::vector<std::string> mixed_strings; |
| + mixed_strings.push_back(""); |
| + mixed_strings.push_back("Hello"); |
| + mixed_strings.push_back("World"); |
| + mixed_strings.push_back(""); |
| + mixed_strings.push_back("123123"); |
| + mixed_strings.push_back("Q"); |
| + mixed_strings.push_back(""); |
| + |
| + // Test that a mixed set of strings read correctly. |
| + TestValid(&reader, fileapi::kPmpFieldTypeString, mixed_strings); |
| + |
| + // Test with the data messed up in a variety of ways. |
| + TestMalformed(&reader, fileapi::kPmpFieldTypeString, mixed_strings); |
| +} |
| + |
| +TEST(PmpColumnReaderTest, PrimitiveParsing) { |
| + TestPrimitives<uint32>(fileapi::kPmpFieldTypeUInt32); |
| + TestPrimitives<double>(fileapi::kPmpFieldTypeDouble64); |
| + TestPrimitives<uint8>(fileapi::kPmpFieldTypeUInt8); |
| + TestPrimitives<uint64>(fileapi::kPmpFieldTypeUInt64); |
| +} |
| + |
| +} // namespace |