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/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