Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser_unittest.cpp |
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser_unittest.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser_unittest.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8063d6fd9c2a949a47c7de8141fda8ddd7d445eb |
--- /dev/null |
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser_unittest.cpp |
@@ -0,0 +1,170 @@ |
+// Copyright 2015 PDFium 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 "testing/gtest/include/gtest/gtest.h" |
+ |
+#include "../../../include/fpdfapi/fpdf_parser.h" |
+ |
+// TODO(thestig) Using unique_ptr with ReleaseDeleter is still not ideal. |
+// Come up or wait for something better. |
+using ScopedFileStream = |
+ nonstd::unique_ptr<IFX_FileStream, ReleaseDeleter<IFX_FileStream>>; |
+ |
+TEST(fpdf_parser_parser, ReadHexString) { |
+ { |
+ // Empty string. |
+ uint8_t data[] = ""; |
+ ScopedFileStream stream(FX_CreateMemoryStream(data, 0, FALSE)); |
+ |
+ CPDF_SyntaxParser parser; |
+ parser.InitParser(stream.get(), 0); |
+ EXPECT_EQ("", parser.ReadHexString()); |
+ EXPECT_EQ(0, parser.SavePos()); |
+ } |
+ |
+ { |
+ // Blank string. |
+ uint8_t data[] = " "; |
+ ScopedFileStream stream(FX_CreateMemoryStream(data, 2, FALSE)); |
+ |
+ CPDF_SyntaxParser parser; |
+ parser.InitParser(stream.get(), 0); |
+ EXPECT_EQ("", parser.ReadHexString()); |
+ EXPECT_EQ(2, parser.SavePos()); |
+ } |
+ |
+ { |
+ // Skips unknown characters. |
+ uint8_t data[] = "z12b"; |
+ ScopedFileStream stream(FX_CreateMemoryStream(data, 4, FALSE)); |
+ |
+ CPDF_SyntaxParser parser; |
+ parser.InitParser(stream.get(), 0); |
+ EXPECT_EQ("\x12\xb0", parser.ReadHexString()); |
+ EXPECT_EQ(4, parser.SavePos()); |
+ } |
+ |
+ { |
+ // Skips unknown characters. |
+ uint8_t data[] = "*<&*#$^&@1"; |
+ ScopedFileStream stream(FX_CreateMemoryStream(data, 10, FALSE)); |
+ |
+ CPDF_SyntaxParser parser; |
+ parser.InitParser(stream.get(), 0); |
+ EXPECT_EQ("\x10", parser.ReadHexString()); |
+ EXPECT_EQ(10, parser.SavePos()); |
+ } |
+ |
+ { |
+ // Skips unknown characters. |
+ uint8_t data[] = "\x80zab"; |
+ ScopedFileStream stream(FX_CreateMemoryStream(data, 4, FALSE)); |
+ |
+ CPDF_SyntaxParser parser; |
+ parser.InitParser(stream.get(), 0); |
+ EXPECT_EQ("\xab", parser.ReadHexString()); |
+ EXPECT_EQ(4, parser.SavePos()); |
+ } |
+ |
+ { |
+ // Skips unknown characters. |
+ uint8_t data[] = "\xffzab"; |
+ ScopedFileStream stream(FX_CreateMemoryStream(data, 4, FALSE)); |
+ |
+ CPDF_SyntaxParser parser; |
+ parser.InitParser(stream.get(), 0); |
+ EXPECT_EQ("\xab", parser.ReadHexString()); |
+ EXPECT_EQ(4, parser.SavePos()); |
+ } |
+ |
+ { |
+ // Regular conversion. |
+ uint8_t data[] = "1A2b>abcd"; |
+ ScopedFileStream stream(FX_CreateMemoryStream(data, 9, FALSE)); |
+ |
+ CPDF_SyntaxParser parser; |
+ parser.InitParser(stream.get(), 0); |
+ EXPECT_EQ("\x1a\x2b", parser.ReadHexString()); |
+ EXPECT_EQ(5, parser.SavePos()); |
+ } |
+ |
+ { |
+ // Position out of bounds. |
+ uint8_t data[] = "12ab>"; |
+ ScopedFileStream stream(FX_CreateMemoryStream(data, 5, FALSE)); |
+ |
+ CPDF_SyntaxParser parser; |
+ parser.InitParser(stream.get(), 0); |
+ parser.RestorePos(5); |
+ EXPECT_EQ("", parser.ReadHexString()); |
+ |
+ parser.RestorePos(6); |
+ EXPECT_EQ("", parser.ReadHexString()); |
+ |
+ parser.RestorePos(-1); |
+ EXPECT_EQ("", parser.ReadHexString()); |
+ |
+ parser.RestorePos(0xfffffffffff); |
Tom Sepez
2015/11/03 19:10:15
Nit: ULL suffix.
Tom Sepez
2015/11/03 19:12:10
It also dawns on me that 0xff00000001 might be a b
|
+ EXPECT_EQ("", parser.ReadHexString()); |
+ |
+ // Check string still parses when set to 0. |
+ parser.RestorePos(0); |
+ EXPECT_EQ("\x12\xab", parser.ReadHexString()); |
+ } |
+ |
+ { |
+ // Missing ending >. |
+ uint8_t data[] = "1A2b"; |
+ ScopedFileStream stream(FX_CreateMemoryStream(data, 4, FALSE)); |
+ |
+ CPDF_SyntaxParser parser; |
+ parser.InitParser(stream.get(), 0); |
+ EXPECT_EQ("\x1a\x2b", parser.ReadHexString()); |
+ EXPECT_EQ(4, parser.SavePos()); |
+ } |
+ |
+ { |
+ // Missing ending >. |
+ uint8_t data[] = "12abz"; |
+ ScopedFileStream stream(FX_CreateMemoryStream(data, 5, FALSE)); |
+ |
+ CPDF_SyntaxParser parser; |
+ parser.InitParser(stream.get(), 0); |
+ EXPECT_EQ("\x12\xab", parser.ReadHexString()); |
+ EXPECT_EQ(5, parser.SavePos()); |
+ } |
+ |
+ { |
+ // Uneven number of bytes. |
+ uint8_t data[] = "1A2>asdf"; |
+ ScopedFileStream stream(FX_CreateMemoryStream(data, 8, FALSE)); |
+ |
+ CPDF_SyntaxParser parser; |
+ parser.InitParser(stream.get(), 0); |
+ EXPECT_EQ("\x1a\x20", parser.ReadHexString()); |
+ EXPECT_EQ(4, parser.SavePos()); |
+ } |
+ |
+ { |
+ // Uneven number of bytes. |
+ uint8_t data[] = "1A2zasdf"; |
+ ScopedFileStream stream(FX_CreateMemoryStream(data, 8, FALSE)); |
+ |
+ CPDF_SyntaxParser parser; |
+ parser.InitParser(stream.get(), 0); |
+ EXPECT_EQ("\x1a\x2a\xdf", parser.ReadHexString()); |
+ EXPECT_EQ(8, parser.SavePos()); |
+ } |
+ |
+ { |
+ // Just ending character. |
+ uint8_t data[] = ">"; |
+ ScopedFileStream stream(FX_CreateMemoryStream(data, 1, FALSE)); |
+ |
+ CPDF_SyntaxParser parser; |
+ parser.InitParser(stream.get(), 0); |
+ EXPECT_EQ("", parser.ReadHexString()); |
+ EXPECT_EQ(1, parser.SavePos()); |
+ } |
+} |