1c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak/*
2c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* Copyright (c) Bull S.A.  2007 All Rights Reserved.
3c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak*
4c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* This program is free software; you can redistribute it and/or modify it
5c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* under the terms of version 2 of the GNU General Public License as
6c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* published by the Free Software Foundation.
7c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak*
8c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* This program is distributed in the hope that it would be useful, but
9c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* WITHOUT ANY WARRANTY; without even the implied warranty of
10c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak*
12c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* Further, this software is distributed without any warranty that it is
13c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* free of the rightful claim of any third person regarding infringement
14c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* or the like.  Any license provided herein, whether implied or
15c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* otherwise, applies only to this software file.  Patent licenses, if
16c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* any, provided herein do not apply to combinations of this program with
17c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* other software, or any other product whatsoever.
18c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak*
19c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* You should have received a copy of the GNU General Public License along
20fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao* with this program; if not, write the Free Software Foundation, Inc.,
21fed9641096e27f79a0f2d9adfe9839dd8d11dc0fWanlong Gao* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak*
23c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* History:
24c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak* Created by: Cyril Lacabanne (Cyril.Lacabanne@bull.net)
25c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak*
262c28215423293e443469a07ae7011135d058b671Garrett Cooper*/
27c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak
28c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak#include <stdio.h>
29c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak#include <stdlib.h>
30c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak#include <sys/time.h>
31c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak#include <rpc/rpc.h>
32c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak
33c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak//Standard define
34c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak#define PROCNUM 1
35c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak#define VERSNUM 1
36c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak
37c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak//Set number of test call
38c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modakint maxIter;
39c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak
40c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modakdouble average(double *tbl)
41c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak{
42c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	//Return average of values in tbl
43c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	int i;
44c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	double rslt = 0;
452c28215423293e443469a07ae7011135d058b671Garrett Cooper
46354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (i = 0; i < maxIter; i++) {
47c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak		rslt += tbl[i];
48c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	}
49c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	rslt = rslt / maxIter;
50c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	return rslt;
51c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak}
52c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak
53c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modakdouble mini(double *tbl)
54c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak{
55c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	//Return minimal of values in tbl
56c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	int i;
57c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	double rslt = tbl[0];
582c28215423293e443469a07ae7011135d058b671Garrett Cooper
59354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (i = 0; i < maxIter; i++) {
60c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak		if (rslt > tbl[i])
61c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak			rslt = tbl[i];
62c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	}
632c28215423293e443469a07ae7011135d058b671Garrett Cooper	return rslt;
64c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak}
65c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak
66c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modakdouble maxi(double *tbl)
67c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak{
68c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	//Return maximal of values in tbl
69c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	int i;
70c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	double rslt = tbl[0];
712c28215423293e443469a07ae7011135d058b671Garrett Cooper
72354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (i = 0; i < maxIter; i++) {
73c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak		if (rslt < tbl[i])
74c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak			rslt = tbl[i];
75c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	}
76c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	return rslt;
77c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak}
78c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak
797c7aeb5d8beb7b0d634d792e09893cc2206514f1subrata_modakint main(int argn, char *argc[])
80c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak{
81c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	//Program parameters : argc[1] : HostName or Host IP
82354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	//                                         argc[2] : Server Program Number
83354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	//                                         argc[3] : Number of test call
84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	//                                         other arguments depend on test case
852c28215423293e443469a07ae7011135d058b671Garrett Cooper
86c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	//run_mode can switch into stand alone program or program launch by shell script
87c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	//1 : stand alone, debug mode, more screen information
88c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	//0 : launch by shell script as test case, only one printf -> result status
89c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	int run_mode = 0;
90354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int test_status = 0;	//Default test result set to FAILED
91c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	int i;
92c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	double *resultTbl;
93354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	struct timeval tv1, tv2;
94354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	struct timezone tz;
95354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	long long diff;
96354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	double rslt;
97c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	int progNum = atoi(argc[2]);
98c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	char proto[8] = "udp";
99c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	CLIENT *clnt = NULL;
100c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	enum clnt_stat cs;
101c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	struct timeval to;
102c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	int varSnd = 10;
103c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	int varRec = -1;
1042c28215423293e443469a07ae7011135d058b671Garrett Cooper
105c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	//Test initialisation
106354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	maxIter = atoi(argc[3]);
107d218f348c12b42a78fa0306d9a033bfa4f67238bCyril Hrubis	resultTbl = malloc(maxIter * sizeof(double));
108c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	to.tv_sec = 1;
109c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	to.tv_usec = 100;
1102c28215423293e443469a07ae7011135d058b671Garrett Cooper
111c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	clnt = clnt_create(argc[1], progNum, VERSNUM, proto);
112354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (clnt == NULL) {
113c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak		clnt_pcreateerror("err");
114c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak		printf("5\n");
115c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak		return 5;
116c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	}
117c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	//Call tested function several times
118354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (i = 0; i < maxIter; i++) {
119c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak		//Tic
120c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak		gettimeofday(&tv1, &tz);
1212c28215423293e443469a07ae7011135d058b671Garrett Cooper
122c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak		//Call function
1232c28215423293e443469a07ae7011135d058b671Garrett Cooper		cs = clnt_call(clnt, PROCNUM,
124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       (xdrproc_t) xdr_int, (char *)&varSnd,
125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			       (xdrproc_t) xdr_int, (char *)&varRec, to);
1262c28215423293e443469a07ae7011135d058b671Garrett Cooper
127354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (cs != RPC_SUCCESS)
128c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak			clnt_perrno(cs);
1292c28215423293e443469a07ae7011135d058b671Garrett Cooper
130c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak		//Toc
131c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak		gettimeofday(&tv2, &tz);
1322c28215423293e443469a07ae7011135d058b671Garrett Cooper
133c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak		//Add function execution time (toc-tic)
134354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		diff =
135354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		    (tv2.tv_sec - tv1.tv_sec) * 1000000L + (tv2.tv_usec -
136354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    tv1.tv_usec);
137c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak		rslt = (double)diff / 1000;
1382c28215423293e443469a07ae7011135d058b671Garrett Cooper
139354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (cs == RPC_SUCCESS) {
140354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			resultTbl[i] = rslt;
141354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		} else {
142354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			test_status = 1;
143354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			break;
144354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
145354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao
146354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (run_mode) {
147354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			fprintf(stderr, "lf time  = %lf usecn\n", resultTbl[i]);
148354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
149c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	}
1502c28215423293e443469a07ae7011135d058b671Garrett Cooper
151c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	//This last printf gives the result status to the tests suite
152c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	//normally should be 0: test has passed or 1: test has failed
153c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	printf("%d\n", test_status);
154c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	printf("%lf %d\n", average(resultTbl), maxIter);
155c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	printf("%lf\n", mini(resultTbl));
156c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	printf("%lf\n", maxi(resultTbl));
1572c28215423293e443469a07ae7011135d058b671Garrett Cooper
158c0caf8f23e4c43743fcac7e5a308d085b2f09107subrata_modak	return test_status;
159ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
160