percent_encoding_test.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2016 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
20 
21 #include <grpc/grpc.h>
22 #include <grpc/support/alloc.h>
23 #include <grpc/support/log.h>
24 
28 
29 #define TEST_VECTOR(raw, encoded, dict) \
30  test_vector(raw, sizeof(raw) - 1, encoded, sizeof(encoded) - 1, dict)
31 
32 #define TEST_NONCONFORMANT_VECTOR(encoded, permissive_unencoded) \
33  test_nonconformant_vector(encoded, sizeof(encoded) - 1, \
34  permissive_unencoded, \
35  sizeof(permissive_unencoded) - 1)
36 
37 static void test_vector(const char* raw, size_t raw_length, const char* encoded,
38  size_t encoded_length,
40  char* raw_msg = gpr_dump(raw, raw_length, GPR_DUMP_HEX | GPR_DUMP_ASCII);
41  char* encoded_msg =
42  gpr_dump(encoded, encoded_length, GPR_DUMP_HEX | GPR_DUMP_ASCII);
43  gpr_log(GPR_DEBUG, "Trial:\nraw = %s\nencoded = %s", raw_msg, encoded_msg);
44  gpr_free(raw_msg);
45  gpr_free(encoded_msg);
46 
47  auto raw_slice = grpc_core::Slice::FromCopiedBuffer(raw, raw_length);
48  auto encoded_slice =
49  grpc_core::Slice::FromCopiedBuffer(encoded, encoded_length);
50  auto raw2encoded_slice = grpc_core::PercentEncodeSlice(raw_slice.Ref(), type);
51  auto encoded2raw_permissive_slice =
52  grpc_core::PermissivePercentDecodeSlice(encoded_slice.Ref());
53 
54  char* raw2encoded_msg = grpc_dump_slice(raw2encoded_slice.c_slice(),
56  char* encoded2raw_permissive_msg = grpc_dump_slice(
57  encoded2raw_permissive_slice.c_slice(), GPR_DUMP_HEX | GPR_DUMP_ASCII);
59  "Result:\nraw2encoded = %s\nencoded2raw_permissive "
60  "= %s",
61  raw2encoded_msg, encoded2raw_permissive_msg);
62  gpr_free(raw2encoded_msg);
63  gpr_free(encoded2raw_permissive_msg);
64 
65  GPR_ASSERT(raw_slice == encoded2raw_permissive_slice);
66  GPR_ASSERT(encoded_slice == raw2encoded_slice);
67 }
68 
69 static void test_nonconformant_vector(const char* encoded,
70  size_t encoded_length,
71  const char* permissive_unencoded,
72  size_t permissive_unencoded_length) {
73  char* permissive_unencoded_msg =
74  gpr_dump(permissive_unencoded, permissive_unencoded_length,
76  char* encoded_msg =
77  gpr_dump(encoded, encoded_length, GPR_DUMP_HEX | GPR_DUMP_ASCII);
78  gpr_log(GPR_DEBUG, "Trial:\nraw = %s\nencoded = %s", permissive_unencoded_msg,
79  encoded_msg);
80  gpr_free(permissive_unencoded_msg);
81  gpr_free(encoded_msg);
82 
83  auto permissive_unencoded_slice = grpc_core::Slice::FromCopiedBuffer(
84  permissive_unencoded, permissive_unencoded_length);
85  auto encoded_slice =
86  grpc_core::Slice::FromCopiedBuffer(encoded, encoded_length);
87  auto encoded2raw_permissive_slice =
89 
90  char* encoded2raw_permissive_msg = grpc_dump_slice(
91  encoded2raw_permissive_slice.c_slice(), GPR_DUMP_HEX | GPR_DUMP_ASCII);
92  gpr_log(GPR_DEBUG, "Result:\nencoded2raw_permissive = %s",
93  encoded2raw_permissive_msg);
94  gpr_free(encoded2raw_permissive_msg);
95 
96  GPR_ASSERT(permissive_unencoded_slice == encoded2raw_permissive_slice);
97 }
98 
99 int main(int argc, char** argv) {
100  grpc::testing::TestEnvironment env(&argc, argv);
101  grpc_init();
102  TEST_VECTOR(
103  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~",
104  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~",
116  TEST_NONCONFORMANT_VECTOR("%", "%");
117  TEST_NONCONFORMANT_VECTOR("%A", "%A");
118  TEST_NONCONFORMANT_VECTOR("%AG", "%AG");
119  TEST_NONCONFORMANT_VECTOR("\0", "\0");
120  grpc_shutdown();
121  return 0;
122 }
grpc_core::PermissivePercentDecodeSlice
Slice PermissivePercentDecodeSlice(Slice slice_in)
Definition: percent_encoding.cc:130
TEST_VECTOR
#define TEST_VECTOR(raw, encoded, dict)
Definition: percent_encoding_test.cc:29
log.h
generate.env
env
Definition: generate.py:37
grpc_dump_slice
char * grpc_dump_slice(const grpc_slice &s, uint32_t flags)
Definition: slice_string_helpers.cc:25
grpc_core::PercentEncodingType::URL
@ URL
main
int main(int argc, char **argv)
Definition: percent_encoding_test.cc:99
string.h
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
grpc_core::PercentEncodingType::Compatible
@ Compatible
GPR_DUMP_HEX
#define GPR_DUMP_HEX
Definition: string.h:34
test_nonconformant_vector
static void test_nonconformant_vector(const char *encoded, size_t encoded_length, const char *permissive_unencoded, size_t permissive_unencoded_length)
Definition: percent_encoding_test.cc:69
GPR_DUMP_ASCII
#define GPR_DUMP_ASCII
Definition: string.h:35
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
grpc_core::slice_detail::CopyConstructors< Slice >::FromCopiedBuffer
static Slice FromCopiedBuffer(const char *p, size_t len)
Definition: src/core/lib/slice/slice.h:182
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
test_vector
static void test_vector(const char *raw, size_t raw_length, const char *encoded, size_t encoded_length, grpc_core::PercentEncodingType type)
Definition: percent_encoding_test.cc:37
grpc.h
grpc_core::PercentEncodingType
PercentEncodingType
Definition: percent_encoding.h:35
test_config.h
percent_encoding.h
alloc.h
grpc::testing::TestEnvironment
Definition: test/core/util/test_config.h:54
GPR_DEBUG
#define GPR_DEBUG
Definition: include/grpc/impl/codegen/log.h:55
gpr_dump
char * gpr_dump(const char *buf, size_t len, uint32_t flags)
Definition: string.cc:144
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
grpc_init
GRPCAPI void grpc_init(void)
Definition: init.cc:146
TEST_NONCONFORMANT_VECTOR
#define TEST_NONCONFORMANT_VECTOR(encoded, permissive_unencoded)
Definition: percent_encoding_test.cc:32
grpc_shutdown
GRPCAPI void grpc_shutdown(void)
Definition: init.cc:209
grpc_core::PercentEncodeSlice
Slice PercentEncodeSlice(Slice slice, PercentEncodingType type)
Definition: percent_encoding.cc:84
slice_string_helpers.h


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:00:51