2 * Copyright (C) 2013, Opera Software ASA. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #include "core/html/track/vtt/BufferedLineReader.h"
34 #include "wtf/text/CString.h"
35 #include "wtf/text/WTFString.h"
36 #include "wtf/unicode/CharacterNames.h"
38 #include <gtest/gtest.h>
40 using blink::BufferedLineReader;
44 TEST(BufferedLineReader, Constructor)
46 BufferedLineReader reader;
47 ASSERT_FALSE(reader.isAtEndOfStream());
49 ASSERT_FALSE(reader.getLine(line));
52 TEST(BufferedLineReader, EOSNoInput)
54 BufferedLineReader reader;
56 ASSERT_FALSE(reader.getLine(line));
57 reader.setEndOfStream();
58 // No input observed, so still no line.
59 ASSERT_FALSE(reader.getLine(line));
62 TEST(BufferedLineReader, EOSInput)
64 BufferedLineReader reader;
66 reader.setEndOfStream();
68 ASSERT_TRUE(reader.getLine(line));
72 TEST(BufferedLineReader, EOSMultipleReads_1)
74 BufferedLineReader reader;
76 reader.setEndOfStream();
78 ASSERT_TRUE(reader.getLine(line));
80 // No more lines returned.
81 ASSERT_FALSE(reader.getLine(line));
82 ASSERT_FALSE(reader.getLine(line));
85 TEST(BufferedLineReader, EOSMultipleReads_2)
87 BufferedLineReader reader;
89 reader.setEndOfStream();
91 ASSERT_TRUE(reader.getLine(line));
93 // No more lines returned.
94 ASSERT_FALSE(reader.getLine(line));
95 ASSERT_FALSE(reader.getLine(line));
98 TEST(BufferedLineReader, LineEndingCR)
100 BufferedLineReader reader;
101 reader.append("X\rY");
102 reader.setEndOfStream();
104 ASSERT_TRUE(reader.getLine(line));
105 ASSERT_EQ(line, "X");
106 ASSERT_TRUE(reader.getLine(line));
107 ASSERT_EQ(line, "Y");
110 TEST(BufferedLineReader, LineEndingCR_EOS)
112 BufferedLineReader reader;
113 reader.append("X\r");
114 reader.setEndOfStream();
116 ASSERT_TRUE(reader.getLine(line));
117 ASSERT_EQ(line, "X");
118 ASSERT_FALSE(reader.getLine(line));
121 TEST(BufferedLineReader, LineEndingLF)
123 BufferedLineReader reader;
124 reader.append("X\nY");
125 reader.setEndOfStream();
127 ASSERT_TRUE(reader.getLine(line));
128 ASSERT_EQ(line, "X");
129 ASSERT_TRUE(reader.getLine(line));
130 ASSERT_EQ(line, "Y");
133 TEST(BufferedLineReader, LineEndingLF_EOS)
135 BufferedLineReader reader;
136 reader.append("X\n");
137 reader.setEndOfStream();
139 ASSERT_TRUE(reader.getLine(line));
140 ASSERT_EQ(line, "X");
141 ASSERT_FALSE(reader.getLine(line));
144 TEST(BufferedLineReader, LineEndingCRLF)
146 BufferedLineReader reader;
147 reader.append("X\r\nY");
148 reader.setEndOfStream();
150 ASSERT_TRUE(reader.getLine(line));
151 ASSERT_EQ(line, "X");
152 ASSERT_TRUE(reader.getLine(line));
153 ASSERT_EQ(line, "Y");
156 TEST(BufferedLineReader, LineEndingCRLF_EOS)
158 BufferedLineReader reader;
159 reader.append("X\r\n");
160 reader.setEndOfStream();
162 ASSERT_TRUE(reader.getLine(line));
163 ASSERT_EQ(line, "X");
164 ASSERT_FALSE(reader.getLine(line));
173 String LineBreakString(LineBreakType type)
175 static const char breakStrings[] = "\r\n";
176 return String(type == Lf ? breakStrings + 1 : breakStrings, type == CrLf ? 2 : 1);
179 String MakeTestData(const char** lines, const LineBreakType* breaks, int count)
181 StringBuilder builder;
182 for (int i = 0; i < count; ++i) {
183 builder.append(lines[i]);
184 builder.append(LineBreakString(breaks[i]));
186 return builder.toString();
189 const size_t blockSizes[] = { 64, 32, 16, 8, 4, 2, 1, 3, 5, 7, 9, 11, 13, 17, 19, 23 };
191 TEST(BufferedLineReader, BufferSizes)
193 const char* lines[] = {
202 const LineBreakType breaks[] = { Lf, Lf, Lf, Lf, Lf, Lf, Lf };
203 const size_t numTestLines = WTF_ARRAY_LENGTH(lines);
204 COMPILE_ASSERT(numTestLines == WTF_ARRAY_LENGTH(breaks), DifferentLengths_lines_and_breaks);
205 String data = MakeTestData(lines, breaks, numTestLines);
207 for (size_t k = 0; k < WTF_ARRAY_LENGTH(blockSizes); ++k) {
208 size_t lineCount = 0;
209 BufferedLineReader reader;
210 size_t blockSize = blockSizes[k];
211 for (size_t i = 0; i < data.length(); i += blockSize) {
212 reader.append(data.substring(i, blockSize));
215 while (reader.getLine(line)) {
216 ASSERT_LT(lineCount, numTestLines);
217 ASSERT_EQ(line, lines[lineCount++]);
220 ASSERT_EQ(lineCount, numTestLines);
224 TEST(BufferedLineReader, BufferSizesMixedEndings)
226 const char* lines[] = {
233 "fffffffffffffffffff"
235 const LineBreakType breaks[] = { Cr, Lf, CrLf, Cr, Lf, CrLf, Lf };
236 const size_t numTestLines = WTF_ARRAY_LENGTH(lines);
237 COMPILE_ASSERT(numTestLines == WTF_ARRAY_LENGTH(breaks), DifferentLengths_lines_and_breaks);
238 String data = MakeTestData(lines, breaks, numTestLines);
240 for (size_t k = 0; k < WTF_ARRAY_LENGTH(blockSizes); ++k) {
241 size_t lineCount = 0;
242 BufferedLineReader reader;
243 size_t blockSize = blockSizes[k];
244 for (size_t i = 0; i < data.length(); i += blockSize) {
245 reader.append(data.substring(i, blockSize));
248 while (reader.getLine(line)) {
249 ASSERT_LT(lineCount, numTestLines);
250 ASSERT_EQ(line, lines[lineCount++]);
253 ASSERT_EQ(lineCount, numTestLines);
257 TEST(BufferedLineReader, BufferBoundaryInCRLF_1)
259 BufferedLineReader reader;
260 reader.append("X\r");
262 ASSERT_TRUE(reader.getLine(line));
263 ASSERT_EQ(line, "X");
265 ASSERT_FALSE(reader.getLine(line));
268 TEST(BufferedLineReader, BufferBoundaryInCRLF_2)
270 BufferedLineReader reader;
271 reader.append("X\r");
273 ASSERT_TRUE(reader.getLine(line));
274 ASSERT_EQ(line, "X");
275 ASSERT_FALSE(reader.getLine(line));
277 ASSERT_FALSE(reader.getLine(line));
278 reader.append("Y\n");
279 ASSERT_TRUE(reader.getLine(line));
280 ASSERT_EQ(line, "Y");
283 TEST(BufferedLineReader, NormalizedNUL)
285 BufferedLineReader reader;
286 reader.append(String("X\0Y\n", 4));
288 ASSERT_TRUE(reader.getLine(line));
289 ASSERT_EQ(line[1], WTF::Unicode::replacementCharacter);