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