1 // Copyright 2011 The Chromium 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 "base/memory/ref_counted_memory.h"
6
7 #include <stdint.h>
8
9 #include <utility>
10
11 #include "base/containers/span.h"
12 #include "base/memory/read_only_shared_memory_region.h"
13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 using testing::Each;
17 using testing::ElementsAre;
18
19 namespace base {
20
21 namespace {
22
ConvertToByteSpanAndCheckSize(span<const uint8_t> data,size_t expected_size)23 void ConvertToByteSpanAndCheckSize(span<const uint8_t> data,
24 size_t expected_size) {
25 EXPECT_EQ(expected_size, data.size());
26 }
27
28 } // namespace
29
TEST(RefCountedMemoryUnitTest,RefCountedStaticMemory)30 TEST(RefCountedMemoryUnitTest, RefCountedStaticMemory) {
31 auto mem = MakeRefCounted<RefCountedStaticMemory>("static mem00", 10);
32
33 EXPECT_EQ(10U, mem->size());
34 EXPECT_EQ("static mem", std::string(mem->front_as<char>(), mem->size()));
35
36 ConvertToByteSpanAndCheckSize(*mem, 10);
37 }
38
TEST(RefCountedMemoryUnitTest,RefCountedBytes)39 TEST(RefCountedMemoryUnitTest, RefCountedBytes) {
40 std::vector<uint8_t> data;
41 data.push_back(45);
42 data.push_back(99);
43 scoped_refptr<RefCountedMemory> mem = RefCountedBytes::TakeVector(&data);
44
45 EXPECT_EQ(0U, data.size());
46
47 ASSERT_EQ(2U, mem->size());
48 EXPECT_EQ(45U, mem->front()[0]);
49 EXPECT_EQ(99U, mem->front()[1]);
50
51 scoped_refptr<RefCountedMemory> mem2;
52 {
53 const unsigned char kData[] = {12, 11, 99};
54 mem2 = MakeRefCounted<RefCountedBytes>(kData, std::size(kData));
55 }
56 ASSERT_EQ(3U, mem2->size());
57 EXPECT_EQ(12U, mem2->front()[0]);
58 EXPECT_EQ(11U, mem2->front()[1]);
59 EXPECT_EQ(99U, mem2->front()[2]);
60
61 ConvertToByteSpanAndCheckSize(*mem2, 3);
62 }
63
TEST(RefCountedMemoryUnitTest,RefCountedBytesMutable)64 TEST(RefCountedMemoryUnitTest, RefCountedBytesMutable) {
65 auto mem = MakeRefCounted<RefCountedBytes>(10);
66
67 ASSERT_EQ(10U, mem->size());
68 EXPECT_THAT(mem->data(), Each(0U));
69
70 // Test non-const versions of data(), front() and front_as<>().
71 mem->data()[0] = 1;
72 mem->front()[1] = 2;
73 mem->front_as<char>()[2] = 3;
74
75 EXPECT_THAT(mem->data(), ElementsAre(1, 2, 3, 0, 0, 0, 0, 0, 0, 0));
76 }
77
TEST(RefCountedMemoryUnitTest,RefCountedString)78 TEST(RefCountedMemoryUnitTest, RefCountedString) {
79 scoped_refptr<RefCountedMemory> mem =
80 base::MakeRefCounted<base::RefCountedString>(std::string("destroy me"));
81
82 ASSERT_EQ(10U, mem->size());
83 EXPECT_EQ('d', mem->front()[0]);
84 EXPECT_EQ('e', mem->front()[1]);
85 EXPECT_EQ('e', mem->front()[9]);
86
87 ConvertToByteSpanAndCheckSize(*mem, 10);
88 }
89
TEST(RefCountedMemoryUnitTest,Equals)90 TEST(RefCountedMemoryUnitTest, Equals) {
91 scoped_refptr<RefCountedMemory> mem1 =
92 base::MakeRefCounted<base::RefCountedString>(std::string("same"));
93
94 std::vector<unsigned char> d2 = {'s', 'a', 'm', 'e'};
95 scoped_refptr<RefCountedMemory> mem2 = RefCountedBytes::TakeVector(&d2);
96
97 EXPECT_TRUE(mem1->Equals(mem2));
98
99 std::string s3("diff");
100 scoped_refptr<RefCountedMemory> mem3 =
101 base::MakeRefCounted<base::RefCountedString>(std::move(s3));
102
103 EXPECT_FALSE(mem1->Equals(mem3));
104 EXPECT_FALSE(mem2->Equals(mem3));
105 }
106
TEST(RefCountedMemoryUnitTest,EqualsNull)107 TEST(RefCountedMemoryUnitTest, EqualsNull) {
108 std::string s("str");
109 scoped_refptr<RefCountedMemory> mem =
110 base::MakeRefCounted<base::RefCountedString>(std::move(s));
111 EXPECT_FALSE(mem->Equals(nullptr));
112 }
113
114 } // namespace base
115