1 // Copyright 2016 The Chromium 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.
5 #include "pdf/chunk_stream.h"
11 #include "testing/gtest/include/gtest/gtest.h"
13 namespace chrome_pdf {
15 typedef ChunkStream<10> TestChunkStream;
17 std::unique_ptr<TestChunkStream::ChunkData> CreateChunkData() {
18 return std::make_unique<TestChunkStream::ChunkData>();
22 TEST(ChunkStreamTest, InRow) {
23 TestChunkStream stream;
24 EXPECT_FALSE(stream.IsComplete());
25 EXPECT_FALSE(stream.IsRangeAvailable(gfx::Range(0, 10)));
26 stream.SetChunkData(0, CreateChunkData());
27 EXPECT_TRUE(stream.IsRangeAvailable(gfx::Range(0, 10)));
28 EXPECT_FALSE(stream.IsRangeAvailable(gfx::Range(0, 20)));
29 stream.SetChunkData(1, CreateChunkData());
30 EXPECT_TRUE(stream.IsRangeAvailable(gfx::Range(0, 20)));
31 EXPECT_FALSE(stream.IsRangeAvailable(gfx::Range(0, 30)));
32 stream.SetChunkData(2, CreateChunkData());
33 EXPECT_TRUE(stream.IsRangeAvailable(gfx::Range(0, 30)));
34 stream.set_eof_pos(25);
35 EXPECT_FALSE(stream.IsRangeAvailable(gfx::Range(0, 30)));
36 EXPECT_TRUE(stream.IsRangeAvailable(gfx::Range(0, 25)));
37 EXPECT_TRUE(stream.IsComplete());
40 TEST(ChunkStreamTest, InBackRow) {
41 TestChunkStream stream;
42 stream.set_eof_pos(25);
43 EXPECT_FALSE(stream.IsComplete());
44 EXPECT_FALSE(stream.IsRangeAvailable(gfx::Range(20, 25)));
45 stream.SetChunkData(2, CreateChunkData());
46 EXPECT_TRUE(stream.IsRangeAvailable(gfx::Range(20, 25)));
47 EXPECT_FALSE(stream.IsRangeAvailable(gfx::Range(10, 20)));
48 stream.SetChunkData(1, CreateChunkData());
49 EXPECT_TRUE(stream.IsRangeAvailable(gfx::Range(10, 20)));
50 EXPECT_FALSE(stream.IsRangeAvailable(gfx::Range(0, 10)));
51 stream.SetChunkData(0, CreateChunkData());
52 EXPECT_TRUE(stream.IsRangeAvailable(gfx::Range(0, 10)));
53 EXPECT_TRUE(stream.IsComplete());
56 TEST(ChunkStreamTest, FillGap) {
57 TestChunkStream stream;
58 stream.set_eof_pos(25);
59 EXPECT_FALSE(stream.IsComplete());
60 stream.SetChunkData(0, CreateChunkData());
61 stream.SetChunkData(2, CreateChunkData());
62 EXPECT_TRUE(stream.IsRangeAvailable(gfx::Range(0, 10)));
63 EXPECT_TRUE(stream.IsRangeAvailable(gfx::Range(20, 25)));
64 EXPECT_FALSE(stream.IsRangeAvailable(gfx::Range(0, 25)));
65 stream.SetChunkData(1, CreateChunkData());
66 EXPECT_TRUE(stream.IsRangeAvailable(gfx::Range(0, 25)));
67 EXPECT_TRUE(stream.IsComplete());
70 TEST(ChunkStreamTest, Read) {
71 TestChunkStream stream;
72 stream.set_eof_pos(25);
73 constexpr unsigned char start_value = 33;
74 unsigned char value = start_value;
75 auto chunk_0 = CreateChunkData();
76 for (auto& it : *chunk_0) {
79 auto chunk_1 = CreateChunkData();
80 for (auto& it : *chunk_1) {
83 auto chunk_2 = CreateChunkData();
84 for (auto& it : *chunk_2) {
87 stream.SetChunkData(0, std::move(chunk_0));
88 stream.SetChunkData(2, std::move(chunk_2));
89 stream.SetChunkData(1, std::move(chunk_1));
91 std::array<unsigned char, 25> result_data;
92 EXPECT_TRUE(stream.ReadData(gfx::Range(0, 25), result_data.data()));
95 for (const auto& it : result_data) {
96 EXPECT_EQ(++value, it);
99 } // namespace chrome_pdf