1 // Copyright 2022 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/fxcrt/fixed_try_alloc_zeroed_data_vector.h"
6
7 #include <limits>
8 #include <utility>
9
10 #include "core/fxcrt/fixed_uninit_data_vector.h"
11 #include "core/fxcrt/fixed_zeroed_data_vector.h"
12 #include "core/fxcrt/span_util.h"
13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "third_party/base/containers/span.h"
16
TEST(FixedTryAllocZeroedDataVector,NoData)17 TEST(FixedTryAllocZeroedDataVector, NoData) {
18 FixedTryAllocZeroedDataVector<int> vec;
19 EXPECT_EQ(0u, vec.size());
20 EXPECT_TRUE(vec.empty());
21 EXPECT_TRUE(vec.span().empty());
22 EXPECT_TRUE(vec.writable_span().empty());
23 }
24
TEST(FixedTryAllocZeroedDataVector,WithData)25 TEST(FixedTryAllocZeroedDataVector, WithData) {
26 FixedTryAllocZeroedDataVector<int> vec(4);
27 EXPECT_FALSE(vec.empty());
28 EXPECT_EQ(4u, vec.size());
29 EXPECT_EQ(4u, vec.span().size());
30 EXPECT_EQ(4u, vec.writable_span().size());
31 EXPECT_THAT(vec.span(), testing::ElementsAre(0, 0, 0, 0));
32
33 constexpr int kData[] = {1, 2, 3, 4};
34 fxcrt::spancpy(vec.writable_span(), pdfium::make_span(kData));
35 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
36 }
37
TEST(FixedTryAllocZeroedDataVector,AllocFailure)38 TEST(FixedTryAllocZeroedDataVector, AllocFailure) {
39 constexpr size_t kCloseToMaxByteAlloc =
40 std::numeric_limits<size_t>::max() - 100;
41 FixedTryAllocZeroedDataVector<int> vec(kCloseToMaxByteAlloc);
42 EXPECT_TRUE(vec.empty());
43 EXPECT_EQ(0u, vec.size());
44 EXPECT_EQ(0u, vec.span().size());
45 EXPECT_EQ(0u, vec.writable_span().size());
46 }
47
TEST(FixedTryAllocZeroedDataVector,Move)48 TEST(FixedTryAllocZeroedDataVector, Move) {
49 FixedTryAllocZeroedDataVector<int> vec(4);
50 constexpr int kData[] = {1, 2, 3, 4};
51 ASSERT_EQ(4u, vec.writable_span().size());
52 fxcrt::spancpy(vec.writable_span(), pdfium::make_span(kData));
53 const int* const original_data_ptr = vec.span().data();
54
55 FixedTryAllocZeroedDataVector<int> vec2(std::move(vec));
56 EXPECT_FALSE(vec2.empty());
57 EXPECT_EQ(4u, vec2.size());
58 EXPECT_EQ(4u, vec2.span().size());
59 EXPECT_EQ(4u, vec2.writable_span().size());
60 EXPECT_THAT(vec2.span(), testing::ElementsAre(1, 2, 3, 4));
61 EXPECT_EQ(vec2.span().data(), original_data_ptr);
62
63 EXPECT_EQ(0u, vec.size());
64 EXPECT_TRUE(vec.empty());
65 EXPECT_TRUE(vec.span().empty());
66 EXPECT_TRUE(vec.writable_span().empty());
67
68 vec = std::move(vec2);
69 EXPECT_FALSE(vec.empty());
70 EXPECT_EQ(4u, vec.size());
71 EXPECT_EQ(4u, vec.span().size());
72 EXPECT_EQ(4u, vec.writable_span().size());
73 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
74 EXPECT_EQ(vec.span().data(), original_data_ptr);
75
76 EXPECT_EQ(0u, vec2.size());
77 EXPECT_TRUE(vec2.empty());
78 EXPECT_TRUE(vec2.span().empty());
79 EXPECT_TRUE(vec2.writable_span().empty());
80 }
81
TEST(FixedTryAllocZeroedDataVector,AssignFromFixedZeroedDataVector)82 TEST(FixedTryAllocZeroedDataVector, AssignFromFixedZeroedDataVector) {
83 FixedTryAllocZeroedDataVector<int> vec;
84
85 FixedZeroedDataVector<int> vec2(4);
86 constexpr int kData[] = {1, 2, 3, 4};
87 ASSERT_EQ(4u, vec2.writable_span().size());
88 fxcrt::spancpy(vec2.writable_span(), pdfium::make_span(kData));
89
90 vec = std::move(vec2);
91 EXPECT_TRUE(vec2.empty());
92 EXPECT_EQ(4u, vec.span().size());
93 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
94 }
95
TEST(FixedTryAllocZeroedDataVector,AssignFromFixedUninitDataVector)96 TEST(FixedTryAllocZeroedDataVector, AssignFromFixedUninitDataVector) {
97 FixedTryAllocZeroedDataVector<int> vec;
98
99 FixedUninitDataVector<int> vec2(4);
100 constexpr int kData[] = {1, 2, 3, 4};
101 ASSERT_EQ(4u, vec2.writable_span().size());
102 fxcrt::spancpy(vec2.writable_span(), pdfium::make_span(kData));
103
104 vec = std::move(vec2);
105 EXPECT_TRUE(vec2.empty());
106 EXPECT_EQ(4u, vec.span().size());
107 EXPECT_THAT(vec.span(), testing::ElementsAre(1, 2, 3, 4));
108 }
109