s4:ldb:python/api: use only one ldb file in test_contains()
[Samba/gebeck_regimport.git] / source3 / torture / test_async_echo.c
blob13d4679bc908d9bb011e8ac7f9f4f96526ccc272
1 /*
2 Unix SMB/CIFS implementation.
3 Run the async echo responder
4 Copyright (C) Volker Lendecke 2010
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "includes.h"
21 #include "torture/proto.h"
22 #include "librpc/gen_ndr/cli_echo.h"
24 static void rpccli_sleep_done(struct tevent_req *req)
26 int *done = (int *)tevent_req_callback_data_void(req);
27 NTSTATUS status;
28 uint32_t result;
30 status = rpccli_echo_TestSleep_recv(req, talloc_tos(), &result);
31 TALLOC_FREE(req);
32 printf("sleep returned %s, %d\n", nt_errstr(status), (int)result);
33 *done -= 1;
36 static void cli_echo_done(struct tevent_req *req)
38 int *done = (int *)tevent_req_callback_data_void(req);
39 NTSTATUS status;
41 status = cli_echo_recv(req);
42 TALLOC_FREE(req);
43 printf("echo returned %s\n", nt_errstr(status));
44 *done -= 1;
47 static void cli_close_done(struct tevent_req *req)
49 int *done = (int *)tevent_req_callback_data_void(req);
50 NTSTATUS status;
51 size_t written;
53 status = cli_write_andx_recv(req, &written);
54 TALLOC_FREE(req);
55 printf("close returned %s\n", nt_errstr(status));
56 *done -= 1;
59 bool run_async_echo(int dummy)
61 struct cli_state *cli = NULL;
62 struct rpc_pipe_client *p;
63 struct tevent_context *ev;
64 struct tevent_req *req;
65 NTSTATUS status;
66 bool ret = false;
67 int i, num_reqs;
68 uint8_t buf[32768];
70 printf("Starting ASYNC_ECHO\n");
72 ev = tevent_context_init(talloc_tos());
73 if (ev == NULL) {
74 printf("tevent_context_init failed\n");
75 goto fail;
78 if (!torture_open_connection(&cli, 0)) {
79 printf("torture_open_connection failed\n");
80 goto fail;
82 status = cli_rpc_pipe_open_noauth(cli, &ndr_table_rpcecho.syntax_id,
83 &p);
84 if (!NT_STATUS_IS_OK(status)) {
85 printf("Could not open echo pipe: %s\n", nt_errstr(status));
86 goto fail;
89 num_reqs = 0;
91 req = rpccli_echo_TestSleep_send(ev, ev, p, 15);
92 if (req == NULL) {
93 printf("rpccli_echo_TestSleep_send failed\n");
94 goto fail;
96 tevent_req_set_callback(req, rpccli_sleep_done, &num_reqs);
97 num_reqs += 1;
99 req = cli_echo_send(ev, ev, cli, 1, data_blob_const("hello", 5));
100 if (req == NULL) {
101 printf("cli_echo_send failed\n");
102 goto fail;
104 tevent_req_set_callback(req, cli_echo_done, &num_reqs);
105 num_reqs += 1;
107 memset(buf, 0, sizeof(buf));
109 for (i=0; i<10; i++) {
110 req = cli_write_andx_send(ev, ev, cli, 4711, 0, buf, 0, sizeof(buf));
111 if (req == NULL) {
112 printf("cli_close_send failed\n");
113 goto fail;
115 tevent_req_set_callback(req, cli_close_done, &num_reqs);
116 num_reqs += 1;
118 req = cli_echo_send(ev, ev, cli, 1, data_blob_const("hello", 5));
119 if (req == NULL) {
120 printf("cli_echo_send failed\n");
121 goto fail;
123 tevent_req_set_callback(req, cli_echo_done, &num_reqs);
124 num_reqs += 1;
127 while (num_reqs > 0) {
128 if (tevent_loop_once(ev) != 0) {
129 printf("tevent_loop_once failed\n");
130 goto fail;
134 TALLOC_FREE(p);
136 ret = true;
137 fail:
138 if (cli != NULL) {
139 torture_close_connection(cli);
141 return ret;