blob: ad31aab623197efa4e8450881edc667757637056 [file]
// Copyright 2026 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/fxcrt/cfx_read_only_container_stream.h"
#include <stdint.h>
#include <utility>
#include "build/build_config.h"
#include "core/fxcrt/data_vector.h"
#include "core/fxcrt/fixed_size_data_vector.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#if BUILDFLAG(IS_POSIX)
#include <fcntl.h>
#include <unistd.h>
#include "core/fxcrt/bytestring.h"
#include "testing/temporary_file_test.h"
#endif
TEST(CFX_ReadOnlyContainerStreamTest, FromDataVector) {
DataVector<uint8_t> data = {'a', 'b', 'c', 'd'};
auto stream =
pdfium::MakeRetain<CFX_ReadOnlyDataVectorStream>(std::move(data));
EXPECT_EQ(4, stream->GetSize());
uint8_t buffer[2];
EXPECT_TRUE(stream->ReadBlockAtOffset(buffer, 1));
EXPECT_THAT(buffer, testing::ElementsAre('b', 'c'));
EXPECT_THAT(stream->span(), testing::ElementsAre('a', 'b', 'c', 'd'));
}
TEST(CFX_ReadOnlyContainerStreamTest, FromFixedSizeDataVector) {
auto data = FixedSizeDataVector<uint8_t>::Uninit(4);
data.span()[0] = 'e';
data.span()[1] = 'f';
data.span()[2] = 'g';
data.span()[3] = 'h';
auto stream = pdfium::MakeRetain<CFX_ReadOnlyFixedSizeDataVectorStream>(
std::move(data));
EXPECT_EQ(4, stream->GetSize());
uint8_t buffer[2];
EXPECT_TRUE(stream->ReadBlockAtOffset(buffer, 2));
EXPECT_THAT(buffer, testing::ElementsAre('g', 'h'));
EXPECT_THAT(stream->span(), testing::ElementsAre('e', 'f', 'g', 'h'));
}
TEST(CFX_ReadOnlyContainerStreamTest, OutOfBoundsRead) {
DataVector<uint8_t> data = {'a', 'b', 'c'};
auto stream =
pdfium::MakeRetain<CFX_ReadOnlyDataVectorStream>(std::move(data));
uint8_t buffer[2];
EXPECT_FALSE(stream->ReadBlockAtOffset(buffer, 2));
EXPECT_FALSE(stream->ReadBlockAtOffset(buffer, 3));
EXPECT_FALSE(stream->ReadBlockAtOffset(buffer, 4));
}
#if BUILDFLAG(IS_POSIX)
class CFX_ReadOnlyTemporaryTest : public TemporaryFileTest {};
TEST_F(CFX_ReadOnlyTemporaryTest, FromFile) {
static const uint8_t kData[] = {'f', 'i', 'l', 'e', 's'};
WriteAndClose(kData);
auto stream = pdfium::MakeRetain<CFX_ReadOnlyMappedDataBytesStream>(
MappedDataBytes::Create(temp_name()));
ASSERT_TRUE(stream);
EXPECT_EQ(5, stream->GetSize());
EXPECT_THAT(stream->span(), testing::ElementsAre('f', 'i', 'l', 'e', 's'));
}
#endif