1 // Copyright 2024 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include <limits>
16
17 #include "fuzztest/fuzztest.h"
18 #include "gtest/gtest.h"
19 #include "src/core/util/useful.h"
20
21 namespace grpc_core {
22
23 template <typename T>
ClampWorks(T value,T min,T max)24 void ClampWorks(T value, T min, T max) {
25 if (max < min) return; // invalid args
26 T result = Clamp(value, min, max);
27 EXPECT_LE(result, max);
28 EXPECT_GE(result, min);
29 }
30
ClampWorksInt(int value,int min,int max)31 void ClampWorksInt(int value, int min, int max) { ClampWorks(value, min, max); }
32 FUZZ_TEST(MyTestSuite, ClampWorksInt);
ClampWorksUint64(uint64_t value,uint64_t min,uint64_t max)33 void ClampWorksUint64(uint64_t value, uint64_t min, uint64_t max) {
34 ClampWorks(value, min, max);
35 }
36 FUZZ_TEST(MyTestSuite, ClampWorksUint64);
ClampWorksUint8(uint8_t value,uint8_t min,uint8_t max)37 void ClampWorksUint8(uint8_t value, uint8_t min, uint8_t max) {
38 ClampWorks(value, min, max);
39 }
40 FUZZ_TEST(MyTestSuite, ClampWorksUint8);
ClampWorksInt8(int8_t value,int8_t min,int8_t max)41 void ClampWorksInt8(int8_t value, int8_t min, int8_t max) {
42 ClampWorks(value, min, max);
43 }
44 FUZZ_TEST(MyTestSuite, ClampWorksInt8);
45
46 template <typename T, typename Bigger>
SaturatingAddWorks(T a,T b)47 void SaturatingAddWorks(T a, T b) {
48 T result = SaturatingAdd(a, b);
49 Bigger expect = Clamp<Bigger>(static_cast<Bigger>(a) + static_cast<Bigger>(b),
50 std::numeric_limits<T>::min(),
51 std::numeric_limits<T>::max());
52 EXPECT_EQ(result, expect);
53 }
54
SaturatingAddWorksInt32(int32_t a,int32_t b)55 void SaturatingAddWorksInt32(int32_t a, int32_t b) {
56 SaturatingAddWorks<int32_t, int64_t>(a, b);
57 }
58 FUZZ_TEST(MyTestSuite, SaturatingAddWorksInt32);
SaturatingAddWorksUint32(uint32_t a,uint32_t b)59 void SaturatingAddWorksUint32(uint32_t a, uint32_t b) {
60 SaturatingAddWorks<uint32_t, uint64_t>(a, b);
61 }
62 FUZZ_TEST(MyTestSuite, SaturatingAddWorksUint32);
SaturatingAddWorksInt8(int8_t a,int8_t b)63 void SaturatingAddWorksInt8(int8_t a, int8_t b) {
64 SaturatingAddWorks<int8_t, int16_t>(a, b);
65 }
66 FUZZ_TEST(MyTestSuite, SaturatingAddWorksInt8);
SaturatingAddWorksUint8(uint8_t a,uint8_t b)67 void SaturatingAddWorksUint8(uint8_t a, uint8_t b) {
68 SaturatingAddWorks<uint8_t, uint16_t>(a, b);
69 }
70 FUZZ_TEST(MyTestSuite, SaturatingAddWorksUint8);
71
72 } // namespace grpc_core
73