xref: /aosp_15_r20/external/tink/cc/util/buffer_test.cc (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang // Copyright 2019 Google Inc.
2*e7b1675dSTing-Kang Chang //
3*e7b1675dSTing-Kang Chang // Licensed under the Apache License, Version 2.0 (the "License");
4*e7b1675dSTing-Kang Chang // you may not use this file except in compliance with the License.
5*e7b1675dSTing-Kang Chang // You may obtain a copy of the License at
6*e7b1675dSTing-Kang Chang //
7*e7b1675dSTing-Kang Chang //     http://www.apache.org/licenses/LICENSE-2.0
8*e7b1675dSTing-Kang Chang //
9*e7b1675dSTing-Kang Chang // Unless required by applicable law or agreed to in writing, software
10*e7b1675dSTing-Kang Chang // distributed under the License is distributed on an "AS IS" BASIS,
11*e7b1675dSTing-Kang Chang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e7b1675dSTing-Kang Chang // See the License for the specific language governing permissions and
13*e7b1675dSTing-Kang Chang // limitations under the License.
14*e7b1675dSTing-Kang Chang //
15*e7b1675dSTing-Kang Chang ///////////////////////////////////////////////////////////////////////////////
16*e7b1675dSTing-Kang Chang 
17*e7b1675dSTing-Kang Chang #include "tink/util/buffer.h"
18*e7b1675dSTing-Kang Chang 
19*e7b1675dSTing-Kang Chang #include <cstring>
20*e7b1675dSTing-Kang Chang #include <utility>
21*e7b1675dSTing-Kang Chang 
22*e7b1675dSTing-Kang Chang #include "gtest/gtest.h"
23*e7b1675dSTing-Kang Chang #include "absl/memory/memory.h"
24*e7b1675dSTing-Kang Chang #include "absl/status/status.h"
25*e7b1675dSTing-Kang Chang #include "absl/strings/str_cat.h"
26*e7b1675dSTing-Kang Chang #include "tink/subtle/random.h"
27*e7b1675dSTing-Kang Chang #include "tink/util/status.h"
28*e7b1675dSTing-Kang Chang #include "tink/util/test_matchers.h"
29*e7b1675dSTing-Kang Chang 
30*e7b1675dSTing-Kang Chang namespace crypto {
31*e7b1675dSTing-Kang Chang namespace tink {
32*e7b1675dSTing-Kang Chang namespace util {
33*e7b1675dSTing-Kang Chang namespace {
34*e7b1675dSTing-Kang Chang 
35*e7b1675dSTing-Kang Chang using ::crypto::tink::test::IsOk;
36*e7b1675dSTing-Kang Chang using ::crypto::tink::test::StatusIs;
37*e7b1675dSTing-Kang Chang using testing::HasSubstr;
38*e7b1675dSTing-Kang Chang 
TEST(BufferTest,ExternalMemoryBlock)39*e7b1675dSTing-Kang Chang TEST(BufferTest, ExternalMemoryBlock) {
40*e7b1675dSTing-Kang Chang   for (auto buf_size : {1, 10, 100, 1000, 10000, 100000, 1000000}) {
41*e7b1675dSTing-Kang Chang     SCOPED_TRACE(absl::StrCat("buf_size = ", buf_size));
42*e7b1675dSTing-Kang Chang     auto mem_block = absl::make_unique<char[]>(buf_size);
43*e7b1675dSTing-Kang Chang     auto buf_result = Buffer::NewNonOwning(mem_block.get(), buf_size);
44*e7b1675dSTing-Kang Chang     ASSERT_THAT(buf_result, IsOk());
45*e7b1675dSTing-Kang Chang     auto buf = std::move(buf_result.value());
46*e7b1675dSTing-Kang Chang     EXPECT_EQ(buf_size, buf->size());
47*e7b1675dSTing-Kang Chang     EXPECT_EQ(buf_size, buf->allocated_size());
48*e7b1675dSTing-Kang Chang     EXPECT_EQ(mem_block.get(), buf->get_mem_block());
49*e7b1675dSTing-Kang Chang     for (auto new_size : {0, 1, buf_size/2, buf_size}) {
50*e7b1675dSTing-Kang Chang       SCOPED_TRACE(absl::StrCat("new_size = ", buf_size));
51*e7b1675dSTing-Kang Chang       ASSERT_THAT(buf->set_size(new_size), IsOk());
52*e7b1675dSTing-Kang Chang       EXPECT_EQ(new_size, buf->size());
53*e7b1675dSTing-Kang Chang       EXPECT_EQ(buf_size, buf->allocated_size());
54*e7b1675dSTing-Kang Chang       EXPECT_EQ(mem_block.get(), buf->get_mem_block());
55*e7b1675dSTing-Kang Chang       auto data = subtle::Random::GetRandomBytes(new_size);
56*e7b1675dSTing-Kang Chang       std::memcpy(buf->get_mem_block(), data.data(), new_size);
57*e7b1675dSTing-Kang Chang       EXPECT_EQ(0, std::memcmp(data.data(), buf->get_mem_block(), new_size));
58*e7b1675dSTing-Kang Chang     }
59*e7b1675dSTing-Kang Chang   }
60*e7b1675dSTing-Kang Chang }
61*e7b1675dSTing-Kang Chang 
TEST(BufferTest,InternalMemoryBlock)62*e7b1675dSTing-Kang Chang TEST(BufferTest, InternalMemoryBlock) {
63*e7b1675dSTing-Kang Chang   for (auto buf_size : {1, 10, 100, 1000, 10000, 100000, 1000000}) {
64*e7b1675dSTing-Kang Chang     SCOPED_TRACE(absl::StrCat("buf_size = ", buf_size));
65*e7b1675dSTing-Kang Chang     auto buf_result = Buffer::New(buf_size);
66*e7b1675dSTing-Kang Chang     ASSERT_THAT(buf_result, IsOk());
67*e7b1675dSTing-Kang Chang     auto buf = std::move(buf_result.value());
68*e7b1675dSTing-Kang Chang     EXPECT_EQ(buf_size, buf->size());
69*e7b1675dSTing-Kang Chang     EXPECT_EQ(buf_size, buf->allocated_size());
70*e7b1675dSTing-Kang Chang     for (auto new_size : {0, 1, buf_size/2, buf_size}) {
71*e7b1675dSTing-Kang Chang       SCOPED_TRACE(absl::StrCat("new_size = ", buf_size));
72*e7b1675dSTing-Kang Chang       ASSERT_THAT(buf->set_size(new_size), IsOk());
73*e7b1675dSTing-Kang Chang       EXPECT_EQ(new_size, buf->size());
74*e7b1675dSTing-Kang Chang       EXPECT_EQ(buf_size, buf->allocated_size());
75*e7b1675dSTing-Kang Chang       auto data = subtle::Random::GetRandomBytes(new_size);
76*e7b1675dSTing-Kang Chang       std::memcpy(buf->get_mem_block(), data.data(), new_size);
77*e7b1675dSTing-Kang Chang       EXPECT_EQ(0, std::memcmp(data.data(), buf->get_mem_block(), new_size));
78*e7b1675dSTing-Kang Chang     }
79*e7b1675dSTing-Kang Chang   }
80*e7b1675dSTing-Kang Chang }
81*e7b1675dSTing-Kang Chang 
TEST(BufferTest,NullMemoryBlock)82*e7b1675dSTing-Kang Chang TEST(BufferTest, NullMemoryBlock) {
83*e7b1675dSTing-Kang Chang   auto buf_result = Buffer::NewNonOwning(nullptr, 42);
84*e7b1675dSTing-Kang Chang   EXPECT_THAT(buf_result.status(), StatusIs(absl::StatusCode::kInvalidArgument,
85*e7b1675dSTing-Kang Chang                                             HasSubstr("non-null")));
86*e7b1675dSTing-Kang Chang }
87*e7b1675dSTing-Kang Chang 
TEST(BufferTest,BadAllocatedSize_ExternalMemoryBlock)88*e7b1675dSTing-Kang Chang TEST(BufferTest, BadAllocatedSize_ExternalMemoryBlock) {
89*e7b1675dSTing-Kang Chang   for (auto allocated_size : {-10, -1, 0}) {
90*e7b1675dSTing-Kang Chang     SCOPED_TRACE(absl::StrCat("allocated_size = ", allocated_size));
91*e7b1675dSTing-Kang Chang     auto mem_block = absl::make_unique<char[]>(42);
92*e7b1675dSTing-Kang Chang     auto buf_result = Buffer::NewNonOwning(mem_block.get(), allocated_size);
93*e7b1675dSTing-Kang Chang     EXPECT_THAT(buf_result.status(),
94*e7b1675dSTing-Kang Chang                 StatusIs(absl::StatusCode::kInvalidArgument,
95*e7b1675dSTing-Kang Chang                          HasSubstr("allocated_size")));
96*e7b1675dSTing-Kang Chang   }
97*e7b1675dSTing-Kang Chang }
98*e7b1675dSTing-Kang Chang 
TEST(BufferTest,BadAllocatedSize_InternalMemoryBlock)99*e7b1675dSTing-Kang Chang TEST(BufferTest, BadAllocatedSize_InternalMemoryBlock) {
100*e7b1675dSTing-Kang Chang   for (auto allocated_size : {-10, -1, 0}) {
101*e7b1675dSTing-Kang Chang     SCOPED_TRACE(absl::StrCat("allocated_size = ", allocated_size));
102*e7b1675dSTing-Kang Chang     auto buf_result = Buffer::New(allocated_size);
103*e7b1675dSTing-Kang Chang     EXPECT_THAT(buf_result.status(),
104*e7b1675dSTing-Kang Chang                 StatusIs(absl::StatusCode::kInvalidArgument,
105*e7b1675dSTing-Kang Chang                          HasSubstr("allocated_size")));
106*e7b1675dSTing-Kang Chang   }
107*e7b1675dSTing-Kang Chang }
108*e7b1675dSTing-Kang Chang 
TEST(BufferTest,BadNewSize_ExternalMemoryBlock)109*e7b1675dSTing-Kang Chang TEST(BufferTest, BadNewSize_ExternalMemoryBlock) {
110*e7b1675dSTing-Kang Chang   for (auto buf_size : {1, 10, 100, 1000, 10000}) {
111*e7b1675dSTing-Kang Chang     SCOPED_TRACE(absl::StrCat("buf_size = ", buf_size));
112*e7b1675dSTing-Kang Chang     auto buf = std::move(Buffer::New(buf_size).value());
113*e7b1675dSTing-Kang Chang     for (auto new_size : {-10, -1, buf_size + 1, 2 * buf_size}) {
114*e7b1675dSTing-Kang Chang       SCOPED_TRACE(absl::StrCat("new_size = ", buf_size));
115*e7b1675dSTing-Kang Chang       EXPECT_THAT(buf->set_size(new_size),
116*e7b1675dSTing-Kang Chang                   StatusIs(absl::StatusCode::kInvalidArgument,
117*e7b1675dSTing-Kang Chang                            HasSubstr("new_size must satisfy")));
118*e7b1675dSTing-Kang Chang     }
119*e7b1675dSTing-Kang Chang   }
120*e7b1675dSTing-Kang Chang }
121*e7b1675dSTing-Kang Chang 
TEST(BufferTest,BadNewSize_InternalMemoryBlock)122*e7b1675dSTing-Kang Chang TEST(BufferTest, BadNewSize_InternalMemoryBlock) {
123*e7b1675dSTing-Kang Chang   for (auto buf_size : {1, 10, 100, 1000, 10000}) {
124*e7b1675dSTing-Kang Chang     SCOPED_TRACE(absl::StrCat("buf_size = ", buf_size));
125*e7b1675dSTing-Kang Chang     auto mem_block = absl::make_unique<char[]>(buf_size);
126*e7b1675dSTing-Kang Chang     auto buf =
127*e7b1675dSTing-Kang Chang         std::move(Buffer::NewNonOwning(mem_block.get(), buf_size).value());
128*e7b1675dSTing-Kang Chang     for (auto new_size : {-10, -1, buf_size + 1, 2 * buf_size}) {
129*e7b1675dSTing-Kang Chang       SCOPED_TRACE(absl::StrCat("new_size = ", buf_size));
130*e7b1675dSTing-Kang Chang       EXPECT_THAT(buf->set_size(new_size),
131*e7b1675dSTing-Kang Chang                   StatusIs(absl::StatusCode::kInvalidArgument,
132*e7b1675dSTing-Kang Chang                            HasSubstr("new_size must satisfy")));
133*e7b1675dSTing-Kang Chang     }
134*e7b1675dSTing-Kang Chang   }
135*e7b1675dSTing-Kang Chang }
136*e7b1675dSTing-Kang Chang 
137*e7b1675dSTing-Kang Chang }  // namespace
138*e7b1675dSTing-Kang Chang }  // namespace util
139*e7b1675dSTing-Kang Chang }  // namespace tink
140*e7b1675dSTing-Kang Chang }  // namespace crypto
141