2 Unix SMB/CIFS implementation.
4 local test for messaging code
6 Copyright (C) Andrew Tridgell 2004
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "lib/events/events.h"
24 #include "lib/messaging/irpc.h"
25 #include "torture/torture.h"
26 #include "cluster/cluster.h"
27 #include "param/param.h"
30 static uint32_t msg_pong
;
32 static void ping_message(struct imessaging_context
*msg
, void *private_data
,
33 uint32_t msg_type
, struct server_id src
, DATA_BLOB
*data
)
36 status
= imessaging_send(msg
, src
, msg_pong
, data
);
37 if (!NT_STATUS_IS_OK(status
)) {
38 printf("pong failed - %s\n", nt_errstr(status
));
42 static void pong_message(struct imessaging_context
*msg
, void *private_data
,
43 uint32_t msg_type
, struct server_id src
, DATA_BLOB
*data
)
45 int *count
= (int *)private_data
;
49 static void exit_message(struct imessaging_context
*msg
, void *private_data
,
50 uint32_t msg_type
, struct server_id src
, DATA_BLOB
*data
)
52 talloc_free(private_data
);
59 static bool test_ping_speed(struct torture_context
*tctx
)
61 struct tevent_context
*ev
;
62 struct imessaging_context
*msg_client_ctx
;
63 struct imessaging_context
*msg_server_ctx
;
67 int timelimit
= torture_setting_int(tctx
, "timelimit", 10);
68 uint32_t msg_ping
, msg_exit
;
70 lpcfg_set_cmdline(tctx
->lp_ctx
, "pid directory", "piddir.tmp");
74 msg_server_ctx
= imessaging_init(tctx
,
75 tctx
->lp_ctx
, cluster_id(0, 1),
78 torture_assert(tctx
, msg_server_ctx
!= NULL
, "Failed to init ping messaging context");
80 imessaging_register_tmp(msg_server_ctx
, NULL
, ping_message
, &msg_ping
);
81 imessaging_register_tmp(msg_server_ctx
, tctx
, exit_message
, &msg_exit
);
83 msg_client_ctx
= imessaging_init(tctx
,
88 torture_assert(tctx
, msg_client_ctx
!= NULL
,
89 "msg_client_ctx imessaging_init() failed");
91 imessaging_register_tmp(msg_client_ctx
, &pong_count
, pong_message
, &msg_pong
);
93 tv
= timeval_current();
95 torture_comment(tctx
, "Sending pings for %d seconds\n", timelimit
);
96 while (timeval_elapsed(&tv
) < timelimit
) {
98 NTSTATUS status1
, status2
;
100 data
.data
= discard_const_p(uint8_t, "testing");
101 data
.length
= strlen((const char *)data
.data
);
103 status1
= imessaging_send(msg_client_ctx
, cluster_id(0, 1), msg_ping
, &data
);
104 status2
= imessaging_send(msg_client_ctx
, cluster_id(0, 1), msg_ping
, NULL
);
106 torture_assert_ntstatus_ok(tctx
, status1
, "msg1 failed");
109 torture_assert_ntstatus_ok(tctx
, status2
, "msg2 failed");
112 while (ping_count
> pong_count
+ 20) {
113 tevent_loop_once(ev
);
117 torture_comment(tctx
, "waiting for %d remaining replies (done %d)\n",
118 ping_count
- pong_count
, pong_count
);
119 while (timeval_elapsed(&tv
) < 30 && pong_count
< ping_count
) {
120 tevent_loop_once(ev
);
123 torture_comment(tctx
, "sending exit\n");
124 imessaging_send(msg_client_ctx
, cluster_id(0, 1), msg_exit
, NULL
);
126 torture_assert_int_equal(tctx
, ping_count
, pong_count
, "ping test failed");
128 torture_comment(tctx
, "ping rate of %.0f messages/sec\n",
129 (ping_count
+pong_count
)/timeval_elapsed(&tv
));
131 talloc_free(msg_client_ctx
);
132 talloc_free(msg_server_ctx
);
137 struct torture_suite
*torture_local_messaging(TALLOC_CTX
*mem_ctx
)
139 struct torture_suite
*s
= torture_suite_create(mem_ctx
, "messaging");
140 torture_suite_add_simple_test(s
, "ping_speed", test_ping_speed
);