648db22b |
1 | /* |
2 | * Copyright (c) Meta Platforms, Inc. and affiliates. |
3 | * All rights reserved. |
4 | * |
5 | * This source code is licensed under both the BSD-style license (found in the |
6 | * LICENSE file in the root directory of this source tree) and the GPLv2 (found |
7 | * in the COPYING file in the root directory of this source tree). |
8 | */ |
9 | #include "utils/Buffer.h" |
10 | #include "utils/Range.h" |
11 | |
12 | #include <gtest/gtest.h> |
13 | #include <memory> |
14 | |
15 | using namespace pzstd; |
16 | |
17 | namespace { |
18 | void deleter(const unsigned char* buf) { |
19 | delete[] buf; |
20 | } |
21 | } |
22 | |
23 | TEST(Buffer, Constructors) { |
24 | Buffer empty; |
25 | EXPECT_TRUE(empty.empty()); |
26 | EXPECT_EQ(0, empty.size()); |
27 | |
28 | Buffer sized(5); |
29 | EXPECT_FALSE(sized.empty()); |
30 | EXPECT_EQ(5, sized.size()); |
31 | |
32 | Buffer moved(std::move(sized)); |
33 | EXPECT_FALSE(sized.empty()); |
34 | EXPECT_EQ(5, sized.size()); |
35 | |
36 | Buffer assigned; |
37 | assigned = std::move(moved); |
38 | EXPECT_FALSE(sized.empty()); |
39 | EXPECT_EQ(5, sized.size()); |
40 | } |
41 | |
42 | TEST(Buffer, BufferManagement) { |
43 | std::shared_ptr<unsigned char> buf(new unsigned char[10], deleter); |
44 | { |
45 | Buffer acquired(buf, MutableByteRange(buf.get(), buf.get() + 10)); |
46 | EXPECT_EQ(2, buf.use_count()); |
47 | Buffer moved(std::move(acquired)); |
48 | EXPECT_EQ(2, buf.use_count()); |
49 | Buffer assigned; |
50 | assigned = std::move(moved); |
51 | EXPECT_EQ(2, buf.use_count()); |
52 | |
53 | Buffer split = assigned.splitAt(5); |
54 | EXPECT_EQ(3, buf.use_count()); |
55 | |
56 | split.advance(1); |
57 | assigned.subtract(1); |
58 | EXPECT_EQ(3, buf.use_count()); |
59 | } |
60 | EXPECT_EQ(1, buf.use_count()); |
61 | } |
62 | |
63 | TEST(Buffer, Modifiers) { |
64 | Buffer buf(10); |
65 | { |
66 | unsigned char i = 0; |
67 | for (auto& byte : buf.range()) { |
68 | byte = i++; |
69 | } |
70 | } |
71 | |
72 | auto prefix = buf.splitAt(2); |
73 | |
74 | ASSERT_EQ(2, prefix.size()); |
75 | EXPECT_EQ(0, *prefix.data()); |
76 | |
77 | ASSERT_EQ(8, buf.size()); |
78 | EXPECT_EQ(2, *buf.data()); |
79 | |
80 | buf.advance(2); |
81 | EXPECT_EQ(4, *buf.data()); |
82 | |
83 | EXPECT_EQ(9, *(buf.range().end() - 1)); |
84 | |
85 | buf.subtract(2); |
86 | EXPECT_EQ(7, *(buf.range().end() - 1)); |
87 | |
88 | EXPECT_EQ(4, buf.size()); |
89 | } |