Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(241)

Side by Side Diff: webkit/fileapi/media/picasa/pmp_column_reader_unittest.cc

Issue 12704024: Simple PMP reader to parse Picasa's metadata (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove unused constant. Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <algorithm>
6 #include <vector>
7
8 #include "base/file_util.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "webkit/fileapi/media/picasa/pmp_column_reader.h"
11 #include "webkit/fileapi/media/picasa/pmp_constants.h"
12 #include "webkit/fileapi/media/picasa/pmp_test_helper.h"
13
14 namespace {
15
16 using fileapi::PmpColumnReader;
17 using fileapi::PmpTestHelper;
18
19 // Writes memory into a temporary file for use in test
20 bool ReaderReadFromVector(PmpColumnReader* const reader,
vandebo (ex-Chrome) 2013/03/29 21:35:07 InitColumnReaderFromMemory ?
tommycli 2013/04/01 22:19:18 Done.
21 std::vector<uint8> data, uint32* rows_read) {
22 base::FilePath temppath;
23
24 if(!file_util::CreateTemporaryFile(&temppath) ||
25 !PmpTestHelper::WriteToFile(temppath, data)) {
26 return false;
27 }
28
29 bool success = reader->InitFromFile(temppath, rows_read);
30
31 file_util::Delete(temppath, true);
32
33 return success;
34 }
35
36 // Overridden version of Read method to make test code templatable.
37 bool DoRead(const PmpColumnReader* reader, uint32 row, std::string* target) {
38 return reader->ReadString(row, target);
39 }
40
41 bool DoRead(const PmpColumnReader* reader, uint32 row, uint32* target) {
42 return reader->ReadUInt32(row, target);
43 }
44
45 bool DoRead(const PmpColumnReader* reader, uint32 row, double* target) {
46 return reader->ReadDouble64(row, target);
47 }
48
49 bool DoRead(const PmpColumnReader* reader, uint32 row, uint8* target) {
50 return reader->ReadUInt8(row, target);
51 }
52
53 bool DoRead(const PmpColumnReader* reader, uint32 row, uint64* target) {
54 return reader->ReadUInt64(row, target);
55 }
56
57 // TestValid
58 template<class T>
59 void TestValid(PmpColumnReader* reader, const uint16 field_type,
60 const std::vector<T>& elems) {
61 uint32 rows_read = 0xFF;
62
63 std::vector<uint8> data =
64 PmpTestHelper::MakeHeaderAndBody(field_type, elems.size(), elems);
65 EXPECT_TRUE(ReaderReadFromVector(reader, data, &rows_read));
66 EXPECT_EQ(elems.size(), rows_read);
67
68 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.
69 T target;
70 EXPECT_TRUE(DoRead(reader, i, &target));
71 EXPECT_EQ(elems[i], target);
72 }
73 }
74
75 template<class T>
76 void TestMalformed(PmpColumnReader* reader, const uint16 field_type,
77 const std::vector<T>& elems) {
78
79 std::vector<uint8> data_too_few_declared_rows =
80 PmpTestHelper::MakeHeaderAndBody(field_type, elems.size()-1, elems);
81 EXPECT_FALSE(ReaderReadFromVector(reader, data_too_few_declared_rows, NULL));
82
83 std::vector<uint8> data_too_many_declared_rows =
84 PmpTestHelper::MakeHeaderAndBody(field_type, elems.size()+1, elems);
85 EXPECT_FALSE(ReaderReadFromVector(reader, data_too_many_declared_rows, NULL));
86
87 std::vector<uint8> data_truncated =
88 PmpTestHelper::MakeHeaderAndBody(field_type, elems.size(), elems);
89 data_truncated.resize(data_truncated.size()-10);
90
91 EXPECT_FALSE(ReaderReadFromVector(reader, data_truncated, NULL));
92
93 std::vector<uint8> data_padded =
94 PmpTestHelper::MakeHeaderAndBody(field_type, elems.size(), elems);
95 data_padded.resize(data_padded.size()+10);
96 EXPECT_FALSE(ReaderReadFromVector(reader, data_padded, NULL));
97 }
98
99 template<class T>
100 void TestPrimitives(const uint16 field_type) {
101 PmpColumnReader reader;
102
103 // Make an ascending vector of the primitive.
104 uint32 n = 100;
105 std::vector<T> data(n, 0);
106 for(uint32 i = 0; i < n; i++) {
107 data[i] = i*3;
108 }
109
110 TestValid<T>(&reader, field_type, data);
111 TestMalformed<T>(&reader, field_type, data);
112 }
113
114
115 TEST(PmpColumnReaderTest, HeaderParsingAndValidation) {
116 PmpColumnReader reader;
117
118 // Good header.
119 uint32 rows_read = 0xFF;
120 std::vector<uint8> good_header = PmpTestHelper::MakeHeader(0x00, 0);
121 EXPECT_TRUE(ReaderReadFromVector(&reader, good_header, &rows_read));
122 EXPECT_EQ(0U, rows_read) << "Read non-zero rows from header-only data.";
123
124 // Botch up elements of the header.
125 std::vector<uint8> bad_magic_byte = PmpTestHelper::MakeHeader(0x00, 0);
126 bad_magic_byte[0] = 0xff;
127 EXPECT_FALSE(ReaderReadFromVector(&reader, bad_magic_byte, NULL));
128
129 // Corrupt means the type fields don't agree.
130 std::vector<uint8> corrupt_type = PmpTestHelper::MakeHeader(0x00, 0);
131 corrupt_type[fileapi::kPmpFieldType1Offset] = 0xff;
132 EXPECT_FALSE(ReaderReadFromVector(&reader, corrupt_type, NULL));
133
134 std::vector<uint8> invalid_type = PmpTestHelper::MakeHeader(0x00, 0);
135 invalid_type[fileapi::kPmpFieldType1Offset] = 0xff;
136 invalid_type[fileapi::kPmpFieldType2Offset] = 0xff;
137 EXPECT_FALSE(ReaderReadFromVector(&reader, invalid_type, NULL));
138
139 std::vector<uint8> incomplete_header = PmpTestHelper::MakeHeader(0x00, 0);
140 incomplete_header.resize(10);
141 EXPECT_FALSE(ReaderReadFromVector(&reader, incomplete_header, NULL));
142 }
143
144 TEST(PmpColumnReaderTest, StringParsing) {
145 PmpColumnReader reader;
146
147 std::vector<std::string> empty_strings(100, "");
148
149 // Test empty strings read okay.
150 TestValid(&reader, fileapi::kPmpFieldTypeString, empty_strings);
151
152 std::vector<std::string> mixed_strings;
153 mixed_strings.push_back("");
154 mixed_strings.push_back("Hello");
155 mixed_strings.push_back("World");
156 mixed_strings.push_back("");
157 mixed_strings.push_back("123123");
158 mixed_strings.push_back("Q");
159 mixed_strings.push_back("");
160
161 // Test that a mixed set of strings read correctly.
162 TestValid(&reader, fileapi::kPmpFieldTypeString, mixed_strings);
163
164 // Test with the data messed up in a variety of ways.
165 TestMalformed(&reader, fileapi::kPmpFieldTypeString, mixed_strings);
166 }
167
168 TEST(PmpColumnReaderTest, PrimitiveParsing) {
169 TestPrimitives<uint32>(fileapi::kPmpFieldTypeUInt32);
170 TestPrimitives<double>(fileapi::kPmpFieldTypeDouble64);
171 TestPrimitives<uint8>(fileapi::kPmpFieldTypeUInt8);
172 TestPrimitives<uint64>(fileapi::kPmpFieldTypeUInt64);
173 }
174
175 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698