blob: 2bdb456d1232fb54d61e11b6fcbb51ca65694528 [file] [log] [blame]
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001/*
2 *
Craig Tiller06059952015-02-18 08:34:56 -08003 * Copyright 2015, Google Inc.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
34#include "src/core/channel/channel_stack.h"
35
36#include <string.h>
37
38#include <grpc/support/alloc.h>
39#include <grpc/support/log.h>
Craig Tiller1b22b9d2015-07-20 13:42:22 -070040#include <grpc/support/string_util.h>
41
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080042#include "test/core/util/test_config.h"
43
Craig Tiller45724b32015-09-22 10:42:19 -070044static void
Craig Tiller1be70cc2015-09-22 10:45:28 -070045channel_init_func (grpc_exec_ctx * exec_ctx, grpc_channel_element * elem, grpc_channel * master, const grpc_channel_args * args, grpc_mdctx * metadata_context, int is_first, int is_last)
Craig Tiller45724b32015-09-22 10:42:19 -070046{
47 GPR_ASSERT (args->num_args == 1);
48 GPR_ASSERT (args->args[0].type == GRPC_ARG_INTEGER);
49 GPR_ASSERT (0 == strcmp (args->args[0].key, "test_key"));
50 GPR_ASSERT (args->args[0].value.integer == 42);
51 GPR_ASSERT (is_first);
52 GPR_ASSERT (is_last);
53 *(int *) (elem->channel_data) = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080054}
55
Craig Tiller45724b32015-09-22 10:42:19 -070056static void
Craig Tiller1be70cc2015-09-22 10:45:28 -070057call_init_func (grpc_exec_ctx * exec_ctx, grpc_call_element * elem, const void *server_transport_data, grpc_transport_stream_op * initial_op)
Craig Tiller45724b32015-09-22 10:42:19 -070058{
59 ++*(int *) (elem->channel_data);
60 *(int *) (elem->call_data) = 0;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080061}
62
Craig Tiller45724b32015-09-22 10:42:19 -070063static void
Craig Tiller1be70cc2015-09-22 10:45:28 -070064channel_destroy_func (grpc_exec_ctx * exec_ctx, grpc_channel_element * elem)
Craig Tiller45724b32015-09-22 10:42:19 -070065{
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080066}
67
Craig Tiller45724b32015-09-22 10:42:19 -070068static void
Craig Tiller1be70cc2015-09-22 10:45:28 -070069call_destroy_func (grpc_exec_ctx * exec_ctx, grpc_call_element * elem)
Craig Tiller45724b32015-09-22 10:42:19 -070070{
71 ++*(int *) (elem->channel_data);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080072}
73
Craig Tiller45724b32015-09-22 10:42:19 -070074static void
Craig Tiller1be70cc2015-09-22 10:45:28 -070075call_func (grpc_exec_ctx * exec_ctx, grpc_call_element * elem, grpc_transport_stream_op * op)
Craig Tiller45724b32015-09-22 10:42:19 -070076{
77 ++*(int *) (elem->call_data);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080078}
79
Craig Tiller45724b32015-09-22 10:42:19 -070080static void
Craig Tiller1be70cc2015-09-22 10:45:28 -070081channel_func (grpc_exec_ctx * exec_ctx, grpc_channel_element * elem, grpc_transport_op * op)
Craig Tiller45724b32015-09-22 10:42:19 -070082{
83 ++*(int *) (elem->channel_data);
Craig Tillerdfff1b82015-09-21 14:39:57 -070084}
Craig Tiller1b22b9d2015-07-20 13:42:22 -070085
Craig Tiller45724b32015-09-22 10:42:19 -070086static char *
Craig Tiller1be70cc2015-09-22 10:45:28 -070087get_peer (grpc_exec_ctx * exec_ctx, grpc_call_element * elem)
Craig Tiller45724b32015-09-22 10:42:19 -070088{
89 return gpr_strdup ("peer");
90}
91
92static void
93test_create_channel_stack (void)
94{
95 const grpc_channel_filter filter = { call_func, channel_func,
96 sizeof (int), call_init_func,
97 call_destroy_func, sizeof (int),
98 channel_init_func, channel_destroy_func,
99 get_peer, "some_test_filter"
100 };
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800101 const grpc_channel_filter *filters = &filter;
102 grpc_channel_stack *channel_stack;
103 grpc_call_stack *call_stack;
104 grpc_channel_element *channel_elem;
105 grpc_call_element *call_elem;
106 grpc_arg arg;
107 grpc_channel_args chan_args;
108 grpc_mdctx *metadata_context;
109 int *channel_data;
110 int *call_data;
Craig Tillerf5768a62015-09-22 10:54:34 -0700111 grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800112
Craig Tiller45724b32015-09-22 10:42:19 -0700113 metadata_context = grpc_mdctx_create ();
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800114
115 arg.type = GRPC_ARG_INTEGER;
116 arg.key = "test_key";
117 arg.value.integer = 42;
118
119 chan_args.num_args = 1;
120 chan_args.args = &arg;
121
Craig Tiller45724b32015-09-22 10:42:19 -0700122 channel_stack = gpr_malloc (grpc_channel_stack_size (&filters, 1));
123 grpc_channel_stack_init (&filters, 1, NULL, &chan_args, metadata_context, channel_stack, &closure_list);
124 GPR_ASSERT (channel_stack->count == 1);
125 channel_elem = grpc_channel_stack_element (channel_stack, 0);
126 channel_data = (int *) channel_elem->channel_data;
127 GPR_ASSERT (*channel_data == 0);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800128
Craig Tiller45724b32015-09-22 10:42:19 -0700129 call_stack = gpr_malloc (channel_stack->call_stack_size);
130 grpc_call_stack_init (channel_stack, NULL, NULL, call_stack, &closure_list);
131 GPR_ASSERT (call_stack->count == 1);
132 call_elem = grpc_call_stack_element (call_stack, 0);
133 GPR_ASSERT (call_elem->filter == channel_elem->filter);
134 GPR_ASSERT (call_elem->channel_data == channel_elem->channel_data);
135 call_data = (int *) call_elem->call_data;
136 GPR_ASSERT (*call_data == 0);
137 GPR_ASSERT (*channel_data == 1);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800138
Craig Tiller45724b32015-09-22 10:42:19 -0700139 grpc_call_stack_destroy (call_stack, &closure_list);
140 gpr_free (call_stack);
141 GPR_ASSERT (*channel_data == 2);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800142
Craig Tiller45724b32015-09-22 10:42:19 -0700143 grpc_channel_stack_destroy (channel_stack, &closure_list);
144 gpr_free (channel_stack);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800145
Craig Tiller45724b32015-09-22 10:42:19 -0700146 grpc_mdctx_unref (metadata_context);
Craig Tillerdfff1b82015-09-21 14:39:57 -0700147
Craig Tiller45724b32015-09-22 10:42:19 -0700148 GPR_ASSERT (grpc_closure_list_empty (closure_list));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800149}
150
Craig Tiller45724b32015-09-22 10:42:19 -0700151int
152main (int argc, char **argv)
153{
154 grpc_test_init (argc, argv);
155 test_create_channel_stack ();
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800156 return 0;
Craig Tiller190d3602015-02-18 09:23:38 -0800157}