Home | History | Annotate | Download | only in app
      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 "xfa/fxfa/xfa_ffapp.h"
      6 
      7 #include <memory>
      8 #include <vector>
      9 
     10 #include "core/fpdfapi/parser/cpdf_dictionary.h"
     11 #include "core/fpdfapi/parser/cpdf_stream.h"
     12 #include "core/fxcrt/fx_memory.h"
     13 #include "testing/gtest/include/gtest/gtest.h"
     14 #include "third_party/base/ptr_util.h"
     15 
     16 TEST(CXFAFileRead, NoStreams) {
     17   std::vector<CPDF_Stream*> streams;
     18   CFX_RetainPtr<IFX_SeekableReadStream> fileread =
     19       MakeSeekableReadStream(streams);
     20 
     21   uint8_t output_buffer[16];
     22   memset(output_buffer, 0xbd, sizeof(output_buffer));
     23   EXPECT_FALSE(fileread->ReadBlock(output_buffer, 0, 0));
     24   EXPECT_EQ(0xbd, output_buffer[0]);
     25 }
     26 
     27 TEST(CXFAFileRead, EmptyStreams) {
     28   std::vector<CPDF_Stream*> streams;
     29   auto stream1 = pdfium::MakeUnique<CPDF_Stream>();
     30   streams.push_back(stream1.get());
     31   CFX_RetainPtr<IFX_SeekableReadStream> fileread =
     32       MakeSeekableReadStream(streams);
     33 
     34   uint8_t output_buffer[16];
     35   memset(output_buffer, 0xbd, sizeof(output_buffer));
     36   EXPECT_FALSE(fileread->ReadBlock(output_buffer, 0, 0));
     37   EXPECT_EQ(0xbd, output_buffer[0]);
     38 }
     39 
     40 TEST(CXFAFileRead, NormalStreams) {
     41   std::vector<CPDF_Stream*> streams;
     42   auto stream1 = pdfium::MakeUnique<CPDF_Stream>();
     43   auto stream2 = pdfium::MakeUnique<CPDF_Stream>();
     44   auto stream3 = pdfium::MakeUnique<CPDF_Stream>();
     45 
     46   // 16 chars total.
     47   stream1->InitStream(reinterpret_cast<const uint8_t*>("one t"), 5,
     48                       pdfium::MakeUnique<CPDF_Dictionary>());
     49   stream2->InitStream(reinterpret_cast<const uint8_t*>("wo "), 3,
     50                       pdfium::MakeUnique<CPDF_Dictionary>());
     51   stream3->InitStream(reinterpret_cast<const uint8_t*>("three!!!"), 8,
     52                       pdfium::MakeUnique<CPDF_Dictionary>());
     53 
     54   streams.push_back(stream1.get());
     55   streams.push_back(stream2.get());
     56   streams.push_back(stream3.get());
     57   CFX_RetainPtr<IFX_SeekableReadStream> fileread =
     58       MakeSeekableReadStream(streams);
     59 
     60   uint8_t output_buffer[16];
     61   memset(output_buffer, 0xbd, sizeof(output_buffer));
     62   EXPECT_TRUE(fileread->ReadBlock(output_buffer, 0, 0));
     63   EXPECT_EQ(0xbd, output_buffer[0]);
     64 
     65   memset(output_buffer, 0xbd, sizeof(output_buffer));
     66   EXPECT_TRUE(fileread->ReadBlock(output_buffer, 1, 0));
     67   EXPECT_EQ(0xbd, output_buffer[0]);
     68 
     69   memset(output_buffer, 0xbd, sizeof(output_buffer));
     70   EXPECT_TRUE(fileread->ReadBlock(output_buffer, 0, 1));
     71   EXPECT_EQ(0, memcmp(output_buffer, "o", 1));
     72   EXPECT_EQ(0xbd, output_buffer[1]);
     73 
     74   memset(output_buffer, 0xbd, sizeof(output_buffer));
     75   EXPECT_TRUE(fileread->ReadBlock(output_buffer, 0, sizeof(output_buffer)));
     76   EXPECT_EQ(0, memcmp(output_buffer, "one two three!!!", 16));
     77 
     78   memset(output_buffer, 0xbd, sizeof(output_buffer));
     79   EXPECT_TRUE(fileread->ReadBlock(output_buffer, 2, 10));
     80   EXPECT_EQ(0, memcmp(output_buffer, "e two thre", 10));
     81   EXPECT_EQ(0xbd, output_buffer[11]);
     82 
     83   memset(output_buffer, 0xbd, sizeof(output_buffer));
     84   EXPECT_FALSE(fileread->ReadBlock(output_buffer, 1, sizeof(output_buffer)));
     85   EXPECT_EQ(0, memcmp(output_buffer, "ne two three!!!", 15));
     86   EXPECT_EQ(0xbd, output_buffer[15]);
     87 }
     88