1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 #include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
8 #include "mojo/public/cpp/bindings/lib/bounds_checker.h"
9 #include "mojo/public/cpp/system/core.h"
10 #include "testing/gtest/include/gtest/gtest.h"
16 const void* ToPtr(uintptr_t ptr) {
17 return reinterpret_cast<const void*>(ptr);
21 TEST(BoundsCheckerTest, ConstructorRangeOverflow) {
23 // Test memory range overflow.
24 internal::BoundsChecker checker(
25 ToPtr(std::numeric_limits<uintptr_t>::max() - 3000), 5000, 0);
27 EXPECT_FALSE(checker.IsValidRange(
28 ToPtr(std::numeric_limits<uintptr_t>::max() - 3000), 1));
29 EXPECT_FALSE(checker.ClaimMemory(
30 ToPtr(std::numeric_limits<uintptr_t>::max() - 3000), 1));
33 if (sizeof(size_t) > sizeof(uint32_t)) {
34 // Test handle index range overflow.
36 static_cast<size_t>(std::numeric_limits<uint32_t>::max()) + 5;
37 internal::BoundsChecker checker(ToPtr(0), 0, num_handles);
39 EXPECT_FALSE(checker.ClaimHandle(Handle(0)));
41 checker.ClaimHandle(Handle(std::numeric_limits<uint32_t>::max() - 1)));
44 checker.ClaimHandle(Handle(internal::kEncodedInvalidHandleValue)));
49 TEST(BoundsCheckerTest, IsValidRange) {
51 internal::BoundsChecker checker(ToPtr(1234), 100, 0);
54 EXPECT_FALSE(checker.IsValidRange(ToPtr(100), 5));
55 EXPECT_FALSE(checker.IsValidRange(ToPtr(1230), 50));
56 EXPECT_TRUE(checker.IsValidRange(ToPtr(1234), 5));
57 EXPECT_TRUE(checker.IsValidRange(ToPtr(1240), 50));
58 EXPECT_TRUE(checker.IsValidRange(ToPtr(1234), 100));
59 EXPECT_FALSE(checker.IsValidRange(ToPtr(1234), 101));
60 EXPECT_FALSE(checker.IsValidRange(ToPtr(1240), 100));
61 EXPECT_FALSE(checker.IsValidRange(ToPtr(1333), 5));
62 EXPECT_FALSE(checker.IsValidRange(ToPtr(2234), 5));
64 // ClaimMemory() updates the valid range.
65 EXPECT_TRUE(checker.ClaimMemory(ToPtr(1254), 10));
67 EXPECT_FALSE(checker.IsValidRange(ToPtr(1234), 1));
68 EXPECT_FALSE(checker.IsValidRange(ToPtr(1254), 10));
69 EXPECT_FALSE(checker.IsValidRange(ToPtr(1263), 1));
70 EXPECT_FALSE(checker.IsValidRange(ToPtr(1263), 10));
71 EXPECT_TRUE(checker.IsValidRange(ToPtr(1264), 10));
72 EXPECT_TRUE(checker.IsValidRange(ToPtr(1264), 70));
73 EXPECT_FALSE(checker.IsValidRange(ToPtr(1264), 71));
77 internal::BoundsChecker checker(ToPtr(1234), 100, 0);
78 // Should return false for empty ranges.
79 EXPECT_FALSE(checker.IsValidRange(ToPtr(0), 0));
80 EXPECT_FALSE(checker.IsValidRange(ToPtr(1200), 0));
81 EXPECT_FALSE(checker.IsValidRange(ToPtr(1234), 0));
82 EXPECT_FALSE(checker.IsValidRange(ToPtr(1240), 0));
83 EXPECT_FALSE(checker.IsValidRange(ToPtr(2234), 0));
87 // The valid memory range is empty.
88 internal::BoundsChecker checker(ToPtr(1234), 0, 0);
90 EXPECT_FALSE(checker.IsValidRange(ToPtr(1234), 1));
91 EXPECT_FALSE(checker.IsValidRange(ToPtr(1234), 0));
95 internal::BoundsChecker checker(
96 ToPtr(std::numeric_limits<uintptr_t>::max() - 2000), 1000, 0);
99 EXPECT_FALSE(checker.IsValidRange(
100 ToPtr(std::numeric_limits<uintptr_t>::max() - 1500), 4000));
101 EXPECT_FALSE(checker.IsValidRange(
102 ToPtr(std::numeric_limits<uintptr_t>::max() - 1500),
103 std::numeric_limits<uint32_t>::max()));
105 // This should be fine.
106 EXPECT_TRUE(checker.IsValidRange(
107 ToPtr(std::numeric_limits<uintptr_t>::max() - 1500), 200));
111 TEST(BoundsCheckerTest, ClaimHandle) {
113 internal::BoundsChecker checker(ToPtr(0), 0, 10);
116 EXPECT_TRUE(checker.ClaimHandle(Handle(0)));
117 EXPECT_FALSE(checker.ClaimHandle(Handle(0)));
119 EXPECT_TRUE(checker.ClaimHandle(Handle(9)));
120 EXPECT_FALSE(checker.ClaimHandle(Handle(10)));
122 // Should fail because it is smaller than the max index that has been
124 EXPECT_FALSE(checker.ClaimHandle(Handle(8)));
126 // Should return true for invalid handle.
128 checker.ClaimHandle(Handle(internal::kEncodedInvalidHandleValue)));
130 checker.ClaimHandle(Handle(internal::kEncodedInvalidHandleValue)));
134 // No handle to claim.
135 internal::BoundsChecker checker(ToPtr(0), 0, 0);
137 EXPECT_FALSE(checker.ClaimHandle(Handle(0)));
139 // Should still return true for invalid handle.
141 checker.ClaimHandle(Handle(internal::kEncodedInvalidHandleValue)));
145 // Test the case that |num_handles| is the same value as
146 // |internal::kEncodedInvalidHandleValue|.
147 EXPECT_EQ(internal::kEncodedInvalidHandleValue,
148 std::numeric_limits<uint32_t>::max());
149 internal::BoundsChecker checker(
150 ToPtr(0), 0, std::numeric_limits<uint32_t>::max());
153 checker.ClaimHandle(Handle(std::numeric_limits<uint32_t>::max() - 1)));
155 checker.ClaimHandle(Handle(std::numeric_limits<uint32_t>::max() - 1)));
156 EXPECT_FALSE(checker.ClaimHandle(Handle(0)));
158 // Should still return true for invalid handle.
160 checker.ClaimHandle(Handle(internal::kEncodedInvalidHandleValue)));
164 TEST(BoundsCheckerTest, ClaimMemory) {
166 internal::BoundsChecker checker(ToPtr(1000), 2000, 0);
169 EXPECT_FALSE(checker.ClaimMemory(ToPtr(500), 100));
170 EXPECT_FALSE(checker.ClaimMemory(ToPtr(800), 300));
171 EXPECT_TRUE(checker.ClaimMemory(ToPtr(1000), 100));
172 EXPECT_FALSE(checker.ClaimMemory(ToPtr(1099), 100));
173 EXPECT_TRUE(checker.ClaimMemory(ToPtr(1100), 200));
174 EXPECT_FALSE(checker.ClaimMemory(ToPtr(2000), 1001));
175 EXPECT_TRUE(checker.ClaimMemory(ToPtr(2000), 500));
176 EXPECT_FALSE(checker.ClaimMemory(ToPtr(2000), 500));
177 EXPECT_FALSE(checker.ClaimMemory(ToPtr(1400), 100));
178 EXPECT_FALSE(checker.ClaimMemory(ToPtr(3000), 1));
179 EXPECT_TRUE(checker.ClaimMemory(ToPtr(2500), 500));
183 // No memory to claim.
184 internal::BoundsChecker checker(ToPtr(10000), 0, 0);
186 EXPECT_FALSE(checker.ClaimMemory(ToPtr(10000), 1));
187 EXPECT_FALSE(checker.ClaimMemory(ToPtr(10000), 0));
191 internal::BoundsChecker checker(
192 ToPtr(std::numeric_limits<uintptr_t>::max() - 1000), 500, 0);
195 EXPECT_FALSE(checker.ClaimMemory(
196 ToPtr(std::numeric_limits<uintptr_t>::max() - 750), 4000));
198 checker.ClaimMemory(ToPtr(std::numeric_limits<uintptr_t>::max() - 750),
199 std::numeric_limits<uint32_t>::max()));
201 // This should be fine.
202 EXPECT_TRUE(checker.ClaimMemory(
203 ToPtr(std::numeric_limits<uintptr_t>::max() - 750), 200));