18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (C) 2013, Opera Software ASA. All rights reserved. 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Redistribution and use in source and binary forms, with or without 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * modification, are permitted provided that the following conditions are 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * met: 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * * Redistributions of source code must retain the above copyright 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * notice, this list of conditions and the following disclaimer. 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * * Redistributions in binary form must reproduce the above 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * copyright notice, this list of conditions and the following disclaimer 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * in the documentation and/or other materials provided with the 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * distribution. 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * * Neither the name of Google Inc. nor the names of its 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * contributors may be used to endorse or promote products derived from 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * this software without specific prior written permission. 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt */ 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "config.h" 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "core/html/track/vtt/BufferedLineReader.h" 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wtf/text/CString.h" 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wtf/text/WTFString.h" 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "wtf/unicode/CharacterNames.h" 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <gtest/gtest.h> 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing blink::BufferedLineReader; 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace { 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, Constructor) 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BufferedLineReader reader; 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_FALSE(reader.isAtEndOfStream()); 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt String line; 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_FALSE(reader.getLine(line)); 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, EOSNoInput) 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BufferedLineReader reader; 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt String line; 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_FALSE(reader.getLine(line)); 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.setEndOfStream(); 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // No input observed, so still no line. 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_FALSE(reader.getLine(line)); 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, EOSInput) 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BufferedLineReader reader; 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.append("A"); 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.setEndOfStream(); 67c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt String line; 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(reader.getLine(line)); 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(line, "A"); 70c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} 71c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, EOSMultipleReads_1) 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BufferedLineReader reader; 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.append("A"); 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.setEndOfStream(); 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt String line; 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(reader.getLine(line)); 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(line, "A"); 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // No more lines returned. 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_FALSE(reader.getLine(line)); 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_FALSE(reader.getLine(line)); 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry ShmidtTEST(BufferedLineReader, EOSMultipleReads_2) 86c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt{ 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BufferedLineReader reader; 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.append("A\n"); 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.setEndOfStream(); 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt String line; 9161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ASSERT_TRUE(reader.getLine(line)); 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(line, "A"); 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // No more lines returned. 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_FALSE(reader.getLine(line)); 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_FALSE(reader.getLine(line)); 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, LineEndingCR) 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BufferedLineReader reader; 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.append("X\rY"); 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.setEndOfStream(); 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt String line; 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(reader.getLine(line)); 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(line, "X"); 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(reader.getLine(line)); 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(line, "Y"); 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, LineEndingCR_EOS) 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BufferedLineReader reader; 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.append("X\r"); 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.setEndOfStream(); 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt String line; 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(reader.getLine(line)); 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(line, "X"); 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_FALSE(reader.getLine(line)); 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, LineEndingLF) 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BufferedLineReader reader; 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.append("X\nY"); 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.setEndOfStream(); 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt String line; 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(reader.getLine(line)); 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(line, "X"); 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(reader.getLine(line)); 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(line, "Y"); 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, LineEndingLF_EOS) 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BufferedLineReader reader; 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.append("X\n"); 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.setEndOfStream(); 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt String line; 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(reader.getLine(line)); 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(line, "X"); 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_FALSE(reader.getLine(line)); 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, LineEndingCRLF) 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BufferedLineReader reader; 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.append("X\r\nY"); 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.setEndOfStream(); 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt String line; 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(reader.getLine(line)); 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(line, "X"); 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(reader.getLine(line)); 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(line, "Y"); 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, LineEndingCRLF_EOS) 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BufferedLineReader reader; 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.append("X\r\n"); 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.setEndOfStream(); 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt String line; 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_TRUE(reader.getLine(line)); 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(line, "X"); 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_FALSE(reader.getLine(line)); 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum LineBreakType { 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Cr, 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Lf, 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt CrLf 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtString LineBreakString(LineBreakType type) 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt static const char breakStrings[] = "\r\n"; 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return String(type == Lf ? breakStrings + 1 : breakStrings, type == CrLf ? 2 : 1); 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtString MakeTestData(const char** lines, const LineBreakType* breaks, int count) 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt StringBuilder builder; 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (int i = 0; i < count; ++i) { 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt builder.append(lines[i]); 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt builder.append(LineBreakString(breaks[i])); 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return builder.toString(); 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst size_t blockSizes[] = { 64, 32, 16, 8, 4, 2, 1, 3, 5, 7, 9, 11, 13, 17, 19, 23 }; 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, BufferSizes) 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char* lines[] = { 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "aaaaaaaaaaaaaaaa", 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bbbbbbbbbb", 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ccccccccccccc", 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "", 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "dddddd", 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "", 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "eeeeeeeeee" 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const LineBreakType breaks[] = { Lf, Lf, Lf, Lf, Lf, Lf, Lf }; 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const size_t numTestLines = WTF_ARRAY_LENGTH(lines); 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt COMPILE_ASSERT(numTestLines == WTF_ARRAY_LENGTH(breaks), DifferentLengths_lines_and_breaks); 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt String data = MakeTestData(lines, breaks, numTestLines); 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (size_t k = 0; k < WTF_ARRAY_LENGTH(blockSizes); ++k) { 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t lineCount = 0; 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt BufferedLineReader reader; 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t blockSize = blockSizes[k]; 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (size_t i = 0; i < data.length(); i += blockSize) { 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt reader.append(data.substring(i, blockSize)); 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt String line; 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (reader.getLine(line)) { 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_LT(lineCount, numTestLines); 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(line, lines[lineCount++]); 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ASSERT_EQ(lineCount, numTestLines); 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTEST(BufferedLineReader, BufferSizesMixedEndings) 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char* lines[] = { 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "aaaaaaaaaaaaaaaa", 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "bbbbbbbbbb", 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "ccccccccccccc", 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "", 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "dddddd", 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "eeeeeeeeee", 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "fffffffffffffffffff" 234 }; 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); 239 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)); 246 247 String line; 248 while (reader.getLine(line)) { 249 ASSERT_LT(lineCount, numTestLines); 250 ASSERT_EQ(line, lines[lineCount++]); 251 } 252 } 253 ASSERT_EQ(lineCount, numTestLines); 254 } 255} 256 257TEST(BufferedLineReader, BufferBoundaryInCRLF_1) 258{ 259 BufferedLineReader reader; 260 reader.append("X\r"); 261 String line; 262 ASSERT_TRUE(reader.getLine(line)); 263 ASSERT_EQ(line, "X"); 264 reader.append("\n"); 265 ASSERT_FALSE(reader.getLine(line)); 266} 267 268TEST(BufferedLineReader, BufferBoundaryInCRLF_2) 269{ 270 BufferedLineReader reader; 271 reader.append("X\r"); 272 String line; 273 ASSERT_TRUE(reader.getLine(line)); 274 ASSERT_EQ(line, "X"); 275 ASSERT_FALSE(reader.getLine(line)); 276 reader.append("\n"); 277 ASSERT_FALSE(reader.getLine(line)); 278 reader.append("Y\n"); 279 ASSERT_TRUE(reader.getLine(line)); 280 ASSERT_EQ(line, "Y"); 281} 282 283TEST(BufferedLineReader, NormalizedNUL) 284{ 285 BufferedLineReader reader; 286 reader.append(String("X\0Y\n", 4)); 287 String line; 288 ASSERT_TRUE(reader.getLine(line)); 289 ASSERT_EQ(line[1], WTF::Unicode::replacementCharacter); 290} 291 292} // namespace 293