blob: b1bbf347a2f71128f4868848572f69bb1536cc17 [file] [log] [blame]
Tomasz Wiszkowskia449e9c2017-05-25 14:30:56 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#include "common/libs/auto_resources/auto_resources.h"
17
18#include <stdio.h>
19
20#include <gtest/gtest.h>
21#include <gmock/gmock.h>
22
23using ::testing::StrEq;
24
25namespace test {
26static constexpr size_t kImmutableReserveSize =
27 AutoFreeBuffer::kAutoBufferShrinkReserveThreshold;
28
29class AutoFreeBufferTest : public ::testing::Test {
30 public:
31 AutoFreeBufferTest() = default;
32 ~AutoFreeBufferTest() override = default;
33
34 void SetUp() override {}
35 void TearDown() override {}
36
37 protected:
38 AutoFreeBuffer buffer_;
39};
40
41TEST_F(AutoFreeBufferTest, ShrinkingSmallReservationsDoesNotRealloc) {
42
43 buffer_.Reserve(kImmutableReserveSize);
44 const void* const data = buffer_.data();
45
46 EXPECT_EQ(0u, buffer_.size());
47 EXPECT_EQ(kImmutableReserveSize, buffer_.reserve_size());
48 EXPECT_NE(nullptr, data);
49
50 buffer_.Resize(kImmutableReserveSize);
51 EXPECT_EQ(kImmutableReserveSize, buffer_.size());
52 EXPECT_EQ(data, buffer_.data());
53
54 // Reduce size of buffer.
55 buffer_.Reserve(kImmutableReserveSize / 2);
56 EXPECT_EQ(kImmutableReserveSize, buffer_.reserve_size());
57 EXPECT_EQ(kImmutableReserveSize / 2, buffer_.size());
58 EXPECT_EQ(data, buffer_.data());
59
60 buffer_.Clear();
61
62 EXPECT_EQ(0u, buffer_.size());
63 EXPECT_EQ(kImmutableReserveSize, buffer_.reserve_size());
64 EXPECT_EQ(data, buffer_.data());
65}
66
67TEST_F(AutoFreeBufferTest, ShrinkingLargeReservationDoesRealloc) {
68 buffer_.Reserve(kImmutableReserveSize + 1);
69
70 EXPECT_EQ(0u, buffer_.size());
71 EXPECT_EQ(kImmutableReserveSize + 1, buffer_.reserve_size());
72
73 buffer_.Reserve(kImmutableReserveSize);
74
75 EXPECT_EQ(0u, buffer_.size());
76 EXPECT_EQ(kImmutableReserveSize, buffer_.reserve_size());
77 // Note: realloc may re-use current memory pointer, so testing data pointer
78 // makes no sense.
79}
80
81TEST_F(AutoFreeBufferTest, ResizeClearsMemory) {
82 constexpr char kTruncWords[] = "This string";
83 constexpr char kLastWords[] = "will be truncated to first two words.";
84 constexpr char kFullText[] =
85 "This string will be truncated to first two words.";
86 // Ignore padding \0.
87 constexpr size_t kTruncLength = sizeof(kTruncWords) - 1;
88
89 buffer_.SetToString(kFullText);
90
91 // Note: this call treats buffer as raw data, so no padding happens yet.
92 buffer_.Resize(kTruncLength);
93 EXPECT_THAT(buffer_.data(), StrEq(kFullText));
94
95 buffer_.Resize(kTruncLength + 1);
96 EXPECT_THAT(buffer_.data(), StrEq(kTruncWords));
97
98 // Note: we're accessing buffer out of size() bounds, but still within
99 // reserve_size() bounds.
100 // This confirms that only 1 byte of data has been appended.
101 EXPECT_THAT(&buffer_.data()[sizeof(kTruncWords)], StrEq(kLastWords));
102}
103
104TEST_F(AutoFreeBufferTest, PrintFTest) {
105 constexpr char kFormatString[] = "Printf %s %d %03d %02x Test.";
106 constexpr char kParam1[] = "string";
107 constexpr int kParam2 = 1234;
108 constexpr int kParam3 = 7;
109 constexpr int kParam4 = 0x42;
110
111 char temp_buffer[1024];
112 size_t vsize = snprintf(&temp_buffer[0], sizeof(temp_buffer),
113 kFormatString, kParam1, kParam2, kParam3, kParam4);
114
115 // Test 1: no reservation => allocate buffer.
116 EXPECT_EQ(vsize,
117 buffer_.PrintF(kFormatString, kParam1, kParam2, kParam3, kParam4));
118 // Check for size + null termination.
119 EXPECT_EQ(vsize + 1, buffer_.size());
120 EXPECT_THAT(buffer_.data(), StrEq(temp_buffer));
121
122 size_t reservation = buffer_.reserve_size();
123
124 buffer_.Clear();
125
126 // Test 2: buffer reserved: just print and return.
127 EXPECT_EQ(vsize,
128 buffer_.PrintF(kFormatString, kParam1, kParam2, kParam3, kParam4));
129 // Check for size + null termination.
130 EXPECT_EQ(vsize + 1, buffer_.size());
131 EXPECT_THAT(buffer_.data(), StrEq(temp_buffer));
132 EXPECT_EQ(reservation, buffer_.reserve_size());
133}
134
135} // namespace test