• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 The PDFium Authors
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/fpdfapi/parser/cpdf_seekablemultistream.h"
6 
7 #include <utility>
8 #include <vector>
9 
10 #include "core/fpdfapi/parser/cpdf_dictionary.h"
11 #include "core/fpdfapi/parser/cpdf_stream.h"
12 #include "core/fxcrt/data_vector.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 
TEST(CPDFSeekableMultiStreamTest,NoStreams)15 TEST(CPDFSeekableMultiStreamTest, NoStreams) {
16   std::vector<RetainPtr<const CPDF_Stream>> streams;
17   auto fileread =
18       pdfium::MakeRetain<CPDF_SeekableMultiStream>(std::move(streams));
19 
20   uint8_t output_buffer[16];
21   memset(output_buffer, 0xbd, sizeof(output_buffer));
22   EXPECT_FALSE(fileread->ReadBlockAtOffset({output_buffer, 0}, 0));
23   EXPECT_EQ(0xbd, output_buffer[0]);
24 }
25 
TEST(CXFAFileReadTest,EmptyStreams)26 TEST(CXFAFileReadTest, EmptyStreams) {
27   std::vector<RetainPtr<const CPDF_Stream>> streams;
28   streams.push_back(pdfium::MakeRetain<CPDF_Stream>());
29   auto fileread =
30       pdfium::MakeRetain<CPDF_SeekableMultiStream>(std::move(streams));
31 
32   uint8_t output_buffer[16];
33   memset(output_buffer, 0xbd, sizeof(output_buffer));
34   EXPECT_FALSE(fileread->ReadBlockAtOffset({output_buffer, 0}, 0));
35   EXPECT_EQ(0xbd, output_buffer[0]);
36 }
37 
TEST(CXFAFileReadTest,NormalStreams)38 TEST(CXFAFileReadTest, NormalStreams) {
39   // 16 chars total.
40   static const char kOne[] = "one t";
41   static const char kTwo[] = "wo ";
42   static const char kThree[] = "three!!!";
43 
44   ByteStringView one_view(kOne);
45   ByteStringView two_view(kTwo);
46   ByteStringView three_view(kThree);
47   auto stream1 = pdfium::MakeRetain<CPDF_Stream>(
48       DataVector<uint8_t>(one_view.begin(), one_view.end()),
49       pdfium::MakeRetain<CPDF_Dictionary>());
50   auto stream2 = pdfium::MakeRetain<CPDF_Stream>(
51       DataVector<uint8_t>(two_view.begin(), two_view.end()),
52       pdfium::MakeRetain<CPDF_Dictionary>());
53   auto stream3 = pdfium::MakeRetain<CPDF_Stream>(
54       DataVector<uint8_t>(three_view.begin(), three_view.end()),
55       pdfium::MakeRetain<CPDF_Dictionary>());
56 
57   std::vector<RetainPtr<const CPDF_Stream>> streams;
58   streams.push_back(std::move(stream1));
59   streams.push_back(std::move(stream2));
60   streams.push_back(std::move(stream3));
61   auto fileread =
62       pdfium::MakeRetain<CPDF_SeekableMultiStream>(std::move(streams));
63 
64   uint8_t output_buffer[16];
65   memset(output_buffer, 0xbd, sizeof(output_buffer));
66   EXPECT_TRUE(fileread->ReadBlockAtOffset({output_buffer, 0}, 0));
67   EXPECT_EQ(0xbd, output_buffer[0]);
68 
69   memset(output_buffer, 0xbd, sizeof(output_buffer));
70   EXPECT_TRUE(fileread->ReadBlockAtOffset({output_buffer, 0}, 1));
71   EXPECT_EQ(0xbd, output_buffer[0]);
72 
73   memset(output_buffer, 0xbd, sizeof(output_buffer));
74   EXPECT_TRUE(fileread->ReadBlockAtOffset({output_buffer, 1}, 0));
75   EXPECT_EQ(0, memcmp(output_buffer, "o", 1));
76   EXPECT_EQ(0xbd, output_buffer[1]);
77 
78   memset(output_buffer, 0xbd, sizeof(output_buffer));
79   EXPECT_TRUE(fileread->ReadBlockAtOffset(output_buffer, 0));
80   EXPECT_EQ(0, memcmp(output_buffer, "one two three!!!", 16));
81 
82   memset(output_buffer, 0xbd, sizeof(output_buffer));
83   EXPECT_TRUE(fileread->ReadBlockAtOffset({output_buffer, 10}, 2));
84   EXPECT_EQ(0, memcmp(output_buffer, "e two thre", 10));
85   EXPECT_EQ(0xbd, output_buffer[11]);
86 
87   memset(output_buffer, 0xbd, sizeof(output_buffer));
88   EXPECT_FALSE(fileread->ReadBlockAtOffset(output_buffer, 1));
89   EXPECT_EQ(0, memcmp(output_buffer, "ne two three!!!", 15));
90   EXPECT_EQ(0xbd, output_buffer[15]);
91 }
92