1 // Copyright 2016 PDFium 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 <limits> 6 #include <string> 7 8 #include "core/fpdfapi/parser/cpdf_object.h" 9 #include "core/fpdfapi/parser/cpdf_parser.h" 10 #include "core/fpdfapi/parser/cpdf_syntax_parser.h" 11 #include "core/fxcrt/fx_ext.h" 12 #include "core/fxcrt/fx_stream.h" 13 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/utils/path_service.h" 15 16 TEST(cpdf_syntax_parser, ReadHexString) { 17 { 18 // Empty string. 19 uint8_t data[] = ""; 20 CPDF_SyntaxParser parser; 21 parser.InitParser(IFX_MemoryStream::Create(data, 0, false), 0); 22 EXPECT_EQ("", parser.ReadHexString()); 23 EXPECT_EQ(0, parser.SavePos()); 24 } 25 26 { 27 // Blank string. 28 uint8_t data[] = " "; 29 CPDF_SyntaxParser parser; 30 parser.InitParser(IFX_MemoryStream::Create(data, 2, false), 0); 31 EXPECT_EQ("", parser.ReadHexString()); 32 EXPECT_EQ(2, parser.SavePos()); 33 } 34 35 { 36 // Skips unknown characters. 37 uint8_t data[] = "z12b"; 38 CPDF_SyntaxParser parser; 39 parser.InitParser(IFX_MemoryStream::Create(data, 4, false), 0); 40 EXPECT_EQ("\x12\xb0", parser.ReadHexString()); 41 EXPECT_EQ(4, parser.SavePos()); 42 } 43 44 { 45 // Skips unknown characters. 46 uint8_t data[] = "*<&*#$^&@1"; 47 CPDF_SyntaxParser parser; 48 parser.InitParser(IFX_MemoryStream::Create(data, 10, false), 0); 49 EXPECT_EQ("\x10", parser.ReadHexString()); 50 EXPECT_EQ(10, parser.SavePos()); 51 } 52 53 { 54 // Skips unknown characters. 55 uint8_t data[] = "\x80zab"; 56 CPDF_SyntaxParser parser; 57 parser.InitParser(IFX_MemoryStream::Create(data, 4, false), 0); 58 EXPECT_EQ("\xab", parser.ReadHexString()); 59 EXPECT_EQ(4, parser.SavePos()); 60 } 61 62 { 63 // Skips unknown characters. 64 uint8_t data[] = "\xffzab"; 65 CPDF_SyntaxParser parser; 66 parser.InitParser(IFX_MemoryStream::Create(data, 4, false), 0); 67 EXPECT_EQ("\xab", parser.ReadHexString()); 68 EXPECT_EQ(4, parser.SavePos()); 69 } 70 71 { 72 // Regular conversion. 73 uint8_t data[] = "1A2b>abcd"; 74 CPDF_SyntaxParser parser; 75 parser.InitParser(IFX_MemoryStream::Create(data, 9, false), 0); 76 EXPECT_EQ("\x1a\x2b", parser.ReadHexString()); 77 EXPECT_EQ(5, parser.SavePos()); 78 } 79 80 { 81 // Position out of bounds. 82 uint8_t data[] = "12ab>"; 83 CPDF_SyntaxParser parser; 84 parser.InitParser(IFX_MemoryStream::Create(data, 5, false), 0); 85 parser.RestorePos(5); 86 EXPECT_EQ("", parser.ReadHexString()); 87 88 parser.RestorePos(6); 89 EXPECT_EQ("", parser.ReadHexString()); 90 91 parser.RestorePos(-1); 92 EXPECT_EQ("", parser.ReadHexString()); 93 94 parser.RestorePos(std::numeric_limits<FX_FILESIZE>::max()); 95 EXPECT_EQ("", parser.ReadHexString()); 96 97 // Check string still parses when set to 0. 98 parser.RestorePos(0); 99 EXPECT_EQ("\x12\xab", parser.ReadHexString()); 100 } 101 102 { 103 // Missing ending >. 104 uint8_t data[] = "1A2b"; 105 CPDF_SyntaxParser parser; 106 parser.InitParser(IFX_MemoryStream::Create(data, 4, false), 0); 107 EXPECT_EQ("\x1a\x2b", parser.ReadHexString()); 108 EXPECT_EQ(4, parser.SavePos()); 109 } 110 111 { 112 // Missing ending >. 113 uint8_t data[] = "12abz"; 114 CPDF_SyntaxParser parser; 115 parser.InitParser(IFX_MemoryStream::Create(data, 5, false), 0); 116 EXPECT_EQ("\x12\xab", parser.ReadHexString()); 117 EXPECT_EQ(5, parser.SavePos()); 118 } 119 120 { 121 // Uneven number of bytes. 122 uint8_t data[] = "1A2>asdf"; 123 CPDF_SyntaxParser parser; 124 parser.InitParser(IFX_MemoryStream::Create(data, 8, false), 0); 125 EXPECT_EQ("\x1a\x20", parser.ReadHexString()); 126 EXPECT_EQ(4, parser.SavePos()); 127 } 128 129 { 130 // Uneven number of bytes. 131 uint8_t data[] = "1A2zasdf"; 132 CPDF_SyntaxParser parser; 133 parser.InitParser(IFX_MemoryStream::Create(data, 8, false), 0); 134 EXPECT_EQ("\x1a\x2a\xdf", parser.ReadHexString()); 135 EXPECT_EQ(8, parser.SavePos()); 136 } 137 138 { 139 // Just ending character. 140 uint8_t data[] = ">"; 141 CPDF_SyntaxParser parser; 142 parser.InitParser(IFX_MemoryStream::Create(data, 1, false), 0); 143 EXPECT_EQ("", parser.ReadHexString()); 144 EXPECT_EQ(1, parser.SavePos()); 145 } 146 } 147 148 TEST(cpdf_syntax_parser, GetInvalidReference) { 149 CPDF_SyntaxParser parser; 150 // Data with a reference with number CPDF_Object::kInvalidObjNum 151 uint8_t data[] = "4294967295 0 R"; 152 parser.InitParser(IFX_MemoryStream::Create(data, 14, false), 0); 153 std::unique_ptr<CPDF_Object> ref = 154 parser.GetObject(nullptr, CPDF_Object::kInvalidObjNum, 0, false); 155 EXPECT_FALSE(ref); 156 } 157