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