1/* 2 Unix SMB/CIFS implementation. 3 Copyright (C) Andrew Tridgell 2000 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. 17*/ 18 19/* 20 test code for internal messaging 21 */ 22 23#include "includes.h" 24 25static int pong_count; 26 27 28/**************************************************************************** 29a useful function for testing the message system 30****************************************************************************/ 31static void pong_message(struct messaging_context *msg_ctx, 32 void *private_data, 33 uint32_t msg_type, 34 struct server_id pid, 35 DATA_BLOB *data) 36{ 37 pong_count++; 38} 39 40 int main(int argc, char *argv[]) 41{ 42 struct tevent_context *evt_ctx; 43 struct messaging_context *msg_ctx; 44 pid_t pid; 45 int i, n; 46 char buf[12]; 47 int ret; 48 49 load_case_tables(); 50 51 setup_logging(argv[0],True); 52 53 lp_load(get_dyn_CONFIGFILE(),False,False,False,True); 54 55 if (!(evt_ctx = tevent_context_init(NULL)) || 56 !(msg_ctx = messaging_init(NULL, server_id_self(), evt_ctx))) { 57 fprintf(stderr, "could not init messaging context\n"); 58 exit(1); 59 } 60 61 if (argc != 3) { 62 fprintf(stderr, "%s: Usage - %s pid count\n", argv[0], 63 argv[0]); 64 exit(1); 65 } 66 67 pid = atoi(argv[1]); 68 n = atoi(argv[2]); 69 70 messaging_register(msg_ctx, NULL, MSG_PONG, pong_message); 71 72 for (i=0;i<n;i++) { 73 messaging_send(msg_ctx, pid_to_procid(pid), MSG_PING, 74 &data_blob_null); 75 } 76 77 while (pong_count < i) { 78 ret = tevent_loop_once(evt_ctx); 79 if (ret != 0) { 80 break; 81 } 82 } 83 84 /* Now test that the duplicate filtering code works. */ 85 pong_count = 0; 86 87 safe_strcpy(buf, "1234567890", sizeof(buf)-1); 88 89 for (i=0;i<n;i++) { 90 messaging_send(msg_ctx, pid_to_procid(getpid()), MSG_PING, 91 &data_blob_null); 92 messaging_send_buf(msg_ctx, pid_to_procid(getpid()), MSG_PING, 93 (uint8 *)buf, 11); 94 } 95 96 for (i=0;i<n;i++) { 97 ret = tevent_loop_once(evt_ctx); 98 if (ret != 0) { 99 break; 100 } 101 } 102 103 if (pong_count != 2) { 104 fprintf(stderr, "Duplicate filter failed (%d).\n", pong_count); 105 } 106 107 /* Speed testing */ 108 109 pong_count = 0; 110 111 { 112 struct timeval tv = timeval_current(); 113 size_t timelimit = n; 114 size_t ping_count = 0; 115 116 printf("Sending pings for %d seconds\n", (int)timelimit); 117 while (timeval_elapsed(&tv) < timelimit) { 118 if(NT_STATUS_IS_OK(messaging_send_buf( 119 msg_ctx, pid_to_procid(pid), 120 MSG_PING, 121 (uint8 *)buf, 11))) 122 ping_count++; 123 if(NT_STATUS_IS_OK(messaging_send( 124 msg_ctx, pid_to_procid(pid), 125 MSG_PING, &data_blob_null))) 126 ping_count++; 127 128 while (ping_count > pong_count + 20) { 129 ret = tevent_loop_once(evt_ctx); 130 if (ret != 0) { 131 break; 132 } 133 } 134 } 135 136 printf("waiting for %d remaining replies (done %d)\n", 137 (int)(ping_count - pong_count), pong_count); 138 while (timeval_elapsed(&tv) < 30 && pong_count < ping_count) { 139 ret = tevent_loop_once(evt_ctx); 140 if (ret != 0) { 141 break; 142 } 143 } 144 145 if (ping_count != pong_count) { 146 fprintf(stderr, "ping test failed! received %d, sent " 147 "%d\n", pong_count, (int)ping_count); 148 } 149 150 printf("ping rate of %.0f messages/sec\n", 151 (ping_count+pong_count)/timeval_elapsed(&tv)); 152 } 153 154 return (0); 155} 156 157