context_list_test.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2018 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 <new>
22 #include <vector>
23 
24 #include <gtest/gtest.h>
25 
26 #include <grpc/grpc.h>
27 
35 
36 namespace grpc_core {
37 namespace testing {
38 namespace {
39 
40 const uint32_t kByteOffset = 123;
41 
42 void* PhonyArgsCopier(void* arg) { return arg; }
43 
44 void TestExecuteFlushesListVerifier(void* arg, Timestamps* ts,
46  ASSERT_NE(arg, nullptr);
48  if (ts) {
49  EXPECT_EQ(ts->byte_offset, kByteOffset);
50  }
51  gpr_atm* done = reinterpret_cast<gpr_atm*>(arg);
52  gpr_atm_rel_store(done, static_cast<gpr_atm>(1));
53 }
54 
55 void discard_write(grpc_slice /*slice*/) {}
56 
57 class ContextListTest : public ::testing::Test {
58  protected:
59  void SetUp() override {
60  grpc_http2_set_write_timestamps_callback(TestExecuteFlushesListVerifier);
61  grpc_http2_set_fn_get_copied_context(PhonyArgsCopier);
62  }
63 };
64 
69 TEST_F(ContextListTest, ExecuteFlushesList) {
70  ContextList* list = nullptr;
71  const int kNumElems = 5;
72  ExecCtx exec_ctx;
74  GRPC_STREAM_REF_INIT(&ref, 1, nullptr, nullptr, "phony ref");
78  .PreconditionChannelArgs(nullptr)
79  .ToC();
82  std::vector<grpc_chttp2_stream*> s;
83  s.reserve(kNumElems);
84  gpr_atm verifier_called[kNumElems];
85  for (auto i = 0; i < kNumElems; i++) {
86  s.push_back(static_cast<grpc_chttp2_stream*>(
88  grpc_transport_init_stream(reinterpret_cast<grpc_transport*>(t),
89  reinterpret_cast<grpc_stream*>(s[i]), &ref,
90  nullptr, nullptr);
91  s[i]->context = &verifier_called[i];
92  s[i]->byte_counter = kByteOffset;
93  gpr_atm_rel_store(&verifier_called[i], static_cast<gpr_atm>(0));
94  ContextList::Append(&list, s[i]);
95  }
96  Timestamps ts;
98  for (auto i = 0; i < kNumElems; i++) {
99  EXPECT_EQ(gpr_atm_acq_load(&verifier_called[i]), static_cast<gpr_atm>(1));
100  grpc_transport_destroy_stream(reinterpret_cast<grpc_transport*>(t),
101  reinterpret_cast<grpc_stream*>(s[i]),
102  nullptr);
103  exec_ctx.Flush();
104  gpr_free(s[i]);
105  }
107  exec_ctx.Flush();
108 }
109 
110 TEST_F(ContextListTest, EmptyList) {
111  ContextList* list = nullptr;
112  ExecCtx exec_ctx;
113  Timestamps ts;
115  exec_ctx.Flush();
116 }
117 
118 TEST_F(ContextListTest, EmptyListEmptyTimestamp) {
119  ContextList* list = nullptr;
120  ExecCtx exec_ctx;
121  ContextList::Execute(list, nullptr, GRPC_ERROR_NONE);
122  exec_ctx.Flush();
123 }
124 
125 TEST_F(ContextListTest, NonEmptyListEmptyTimestamp) {
126  ContextList* list = nullptr;
127  const int kNumElems = 5;
128  ExecCtx exec_ctx;
130  GRPC_STREAM_REF_INIT(&ref, 1, nullptr, nullptr, "phony ref");
134  .PreconditionChannelArgs(nullptr)
135  .ToC();
138  std::vector<grpc_chttp2_stream*> s;
139  s.reserve(kNumElems);
140  gpr_atm verifier_called[kNumElems];
141  for (auto i = 0; i < kNumElems; i++) {
142  s.push_back(static_cast<grpc_chttp2_stream*>(
144  grpc_transport_init_stream(reinterpret_cast<grpc_transport*>(t),
145  reinterpret_cast<grpc_stream*>(s[i]), &ref,
146  nullptr, nullptr);
147  s[i]->context = &verifier_called[i];
148  s[i]->byte_counter = kByteOffset;
149  gpr_atm_rel_store(&verifier_called[i], static_cast<gpr_atm>(0));
150  ContextList::Append(&list, s[i]);
151  }
152  ContextList::Execute(list, nullptr, GRPC_ERROR_NONE);
153  for (auto i = 0; i < kNumElems; i++) {
154  EXPECT_EQ(gpr_atm_acq_load(&verifier_called[i]), static_cast<gpr_atm>(1));
155  grpc_transport_destroy_stream(reinterpret_cast<grpc_transport*>(t),
156  reinterpret_cast<grpc_stream*>(s[i]),
157  nullptr);
158  exec_ctx.Flush();
159  gpr_free(s[i]);
160  }
162  exec_ctx.Flush();
163 }
164 
165 } // namespace
166 } // namespace testing
167 } // namespace grpc_core
168 
169 int main(int argc, char** argv) {
170  ::testing::InitGoogleTest(&argc, argv);
171  grpc::testing::TestEnvironment env(&argc, argv);
172  grpc_init();
173  int ret = RUN_ALL_TESTS();
174  grpc_shutdown();
175  return ret;
176 }
testing
Definition: aws_request_signer_test.cc:25
ASSERT_NE
#define ASSERT_NE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2060
main
int main(int argc, char **argv)
Definition: context_list_test.cc:169
mock_endpoint
Definition: mock_endpoint.cc:32
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
generate.env
env
Definition: generate.py:37
internal.h
grpc_create_chttp2_transport
grpc_transport * grpc_create_chttp2_transport(const grpc_channel_args *channel_args, grpc_endpoint *ep, bool is_client)
Definition: chttp2_transport.cc:3122
grpc_core
Definition: call_metric_recorder.h:31
discard_write
static void discard_write(grpc_slice)
Definition: end2end/fuzzers/client_fuzzer.cc:35
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
error
grpc_error_handle error
Definition: retry_filter.cc:499
grpc_core::ContextList::Append
static void Append(ContextList **head, grpc_chttp2_stream *s)
Definition: context_list.cc:34
gpr_malloc
GPRAPI void * gpr_malloc(size_t size)
Definition: alloc.cc:29
absl::FormatConversionChar::s
@ s
grpc_core::ContextList::Execute
static void Execute(void *arg, Timestamps *ts, grpc_error_handle error)
Definition: context_list.cc:47
grpc_core::testing::TEST_F
TEST_F(ServiceConfigTest, ErrorCheck1)
Definition: service_config_test.cc:192
grpc_channel_args
Definition: grpc_types.h:132
testing::Test
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:402
grpc_chttp2_stream
Definition: src/core/ext/transport/chttp2/transport/internal.h:456
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
grpc_core::CoreConfiguration::Get
static const CoreConfiguration & Get()
Definition: core_configuration.h:82
grpc_core::ExecCtx::Flush
bool Flush()
Definition: exec_ctx.cc:69
grpc_transport_destroy
void grpc_transport_destroy(grpc_transport *transport)
Definition: transport.cc:96
grpc.h
gpr_atm_acq_load
#define gpr_atm_acq_load(p)
Definition: impl/codegen/atm_gcc_atomic.h:52
done
struct tab * done
Definition: bloaty/third_party/zlib/examples/enough.c:176
grpc_core::ChannelArgs::ToC
const grpc_channel_args * ToC() const
Definition: channel_args.cc:94
grpc_channel_args_destroy
void grpc_channel_args_destroy(grpc_channel_args *a)
Definition: channel_args.cc:360
arg
Definition: cmdline.cc:40
ref
unsigned ref
Definition: cxa_demangle.cpp:4909
gpr_atm_rel_store
#define gpr_atm_rel_store(p, value)
Definition: impl/codegen/atm_gcc_atomic.h:54
grpc_slice
Definition: include/grpc/impl/codegen/slice.h:65
RUN_ALL_TESTS
int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2471
grpc_core::CoreConfiguration::channel_args_preconditioning
const ChannelArgsPreconditioning & channel_args_preconditioning() const
Definition: core_configuration.h:139
test_config.h
gpr_atm
intptr_t gpr_atm
Definition: impl/codegen/atm_gcc_atomic.h:32
testing::InitGoogleTest
GTEST_API_ void InitGoogleTest(int *argc, char **argv)
Definition: bloaty/third_party/googletest/googletest/src/gtest.cc:6106
grpc_core::grpc_http2_set_write_timestamps_callback
void grpc_http2_set_write_timestamps_callback(void(*fn)(void *, Timestamps *, grpc_error_handle error))
Definition: context_list.cc:63
grpc_transport_stream_size
size_t grpc_transport_stream_size(grpc_transport *transport)
Definition: transport.cc:92
port.h
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
absl::str_format_internal::LengthMod::t
@ t
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
mock_endpoint.h
grpc::testing::TestEnvironment
Definition: test/core/util/test_config.h:54
chttp2_transport.h
arg
struct arg arg
GRPC_STREAM_REF_INIT
#define GRPC_STREAM_REF_INIT(rc, ir, cb, cb_arg, objtype)
Definition: transport.h:190
grpc_transport
Definition: transport_impl.h:89
transport.h
grpc_stream
struct grpc_stream grpc_stream
Definition: transport.h:174
grpc_mock_endpoint_create
grpc_endpoint * grpc_mock_endpoint_create(void(*on_write)(grpc_slice slice))
Definition: mock_endpoint.cc:118
context_list.h
grpc_transport_destroy_stream
void grpc_transport_destroy_stream(grpc_transport *transport, grpc_stream *stream, grpc_closure *then_schedule_closure)
Definition: transport.cc:134
grpc_core::grpc_http2_set_fn_get_copied_context
void grpc_http2_set_fn_get_copied_context(void *(*fn)(void *))
Definition: context_list.cc:68
grpc_init
GRPCAPI void grpc_init(void)
Definition: init.cc:146
grpc_error
Definition: error_internal.h:42
grpc_endpoint
Definition: endpoint.h:105
grpc_shutdown
GRPCAPI void grpc_shutdown(void)
Definition: init.cc:209
grpc_transport_init_stream
int grpc_transport_init_stream(grpc_transport *transport, grpc_stream *stream, grpc_stream_refcount *refcount, const void *server_data, grpc_core::Arena *arena)
Definition: transport.cc:100
grpc_core::ChannelArgsPreconditioning::PreconditionChannelArgs
ChannelArgs PreconditionChannelArgs(const grpc_channel_args *args) const
Definition: channel_args_preconditioning.cc:34
grpc_stream_refcount
Definition: transport.h:178
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
api.h


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:58:55