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