qa: update 660 to generate index.html, fixing pcp-testsuite runs
[pcp.git] / qa / src / interp4.c
blob1391eea4f5d6c54bf3e1c4bc7490c517a54f8a40
1 /*
2 * Copyright (c) 1997-2001 Silicon Graphics, Inc. All Rights Reserved.
3 */
5 /*
6 * EOL and clock advancing in interpolate mode
7 */
9 #include <pcp/pmapi.h>
10 #include <pcp/impl.h>
12 static int vflag;
13 static int tflag;
14 static int numpmid;
15 static pmID pmidlist[20];
16 static char *namelist[20];
17 static double delta = 500;
19 static void
20 cmpres(int n, pmResult *e, pmResult *g)
22 int i;
23 int j;
24 int err = 0;
26 if (e->timestamp.tv_sec != g->timestamp.tv_sec ||
27 e->timestamp.tv_usec != g->timestamp.tv_usec) {
28 printf("[sample %d] pmResult.timestamp: expected %ld.%06ld, got %ld.%06ld\n",
29 n, (long)e->timestamp.tv_sec, (long)e->timestamp.tv_usec,
30 (long)g->timestamp.tv_sec, (long)g->timestamp.tv_usec);
31 goto FAILED;
33 if (e->numpmid != g->numpmid) {
34 printf("[sample %d] pmResult.numpmid: expected %d, got %d\n",
35 n, e->numpmid, g->numpmid);
36 goto FAILED;
39 for (i = 0; i < e->numpmid; i++) {
40 if (e->vset[i]->pmid != g->vset[i]->pmid) {
41 printf("[sample %d] pmResult.vset[%d].pmid: expected %s",
42 n, i, pmIDStr(e->vset[i]->pmid));
43 printf(" got %s\n", pmIDStr(g->vset[i]->pmid));
44 err++;
46 if (e->vset[i]->numval != g->vset[i]->numval) {
47 printf("[sample %d] pmResult.vset[%d].numval: expected %d, got %d\n",
48 n, i, e->vset[i]->numval, g->vset[i]->numval);
49 err++;
50 continue;
52 if (e->vset[i]->valfmt != g->vset[i]->valfmt) {
53 printf("[sample %d] pmResult.vset[%d].valfmt: expected %d, got %d\n",
54 n, i, e->vset[i]->valfmt, g->vset[i]->valfmt);
55 err++;
56 continue;
58 if (e->vset[i]->valfmt != PM_VAL_INSITU)
59 continue;
60 for (j = 0; j < e->vset[i]->numval; j++) {
61 if (e->vset[i]->vlist[j].inst != g->vset[i]->vlist[j].inst) {
62 printf("[sample %d] pmResult.vset[%d].vlist[%d].inst: expected %d, got %d\n",
63 n, i, j, e->vset[i]->vlist[j].inst, g->vset[i]->vlist[j].inst);
64 err++;
66 if (e->vset[i]->vlist[j].value.lval != g->vset[i]->vlist[j].value.lval) {
67 printf("[sample %d] pmResult.vset[%d].vlist[%d].lval: expected %d, got %d\n",
68 n, i, j, e->vset[i]->vlist[j].value.lval, g->vset[i]->vlist[j].value.lval);
69 err++;
74 if (err == 0)
75 return;
77 FAILED:
78 printf("Expected ...\n");
79 __pmDumpResult(stdout, e);
80 printf("Got ...\n");
81 __pmDumpResult(stdout, g);
84 int
85 main(int argc, char **argv)
87 int c;
88 int sts;
89 int ctx;
90 int errflag = 0;
91 char *archive = "foo";
92 char *namespace = PM_NS_DEFAULT;
93 static char *usage = "[-a archive] [-n namespace] [-T] [-t delta] [-v]";
94 int i;
95 int n;
96 pmLogLabel loglabel;
97 pmResult *resp;
98 pmResult **resvec = malloc(0);
99 int resnum = 0;
100 struct timeval when;
102 __pmSetProgname(argv[0]);
104 while ((c = getopt(argc, argv, "a:D:n:Tt:v")) != EOF) {
105 switch (c) {
107 case 'a': /* archive */
108 archive = optarg;
109 break;
111 case 'D': /* debug flag */
112 sts = __pmParseDebug(optarg);
113 if (sts < 0) {
114 fprintf(stderr, "%s: unrecognized debug flag specification (%s)\n",
115 pmProgname, optarg);
116 errflag++;
118 else
119 pmDebug |= sts;
120 break;
122 case 'n': /* alternative name space file */
123 namespace = optarg;
124 break;
126 case 'v': /* verbose output */
127 vflag++;
128 break;
130 case 'T': /* trim namespace */
131 tflag++;
132 break;
134 case 't': /* sample interval */
135 delta = 1000 * atof(optarg);
136 break;
138 case '?':
139 default:
140 errflag++;
141 break;
145 if (errflag) {
146 printf("Usage: %s %s\n", pmProgname, usage);
147 exit(1);
150 if ((sts = pmLoadASCIINameSpace(namespace, 1)) < 0) {
151 printf("%s: Cannot load namespace from \"%s\": %s\n", pmProgname, namespace, pmErrStr(sts));
152 exit(1);
155 if ((ctx = pmNewContext(PM_CONTEXT_ARCHIVE, archive)) < 0) {
156 printf("%s: Cannot connect to archive \"%s\": %s\n", pmProgname, archive, pmErrStr(ctx));
157 exit(1);
159 if ((sts = pmGetArchiveLabel(&loglabel)) < 0) {
160 printf("%s: pmGetArchiveLabel(%d): %s\n", pmProgname, ctx, pmErrStr(sts));
161 exit(1);
164 when = loglabel.ll_start;
165 if ((sts = pmSetMode(PM_MODE_INTERP, &when, delta)) < 0) {
166 printf("%s: pmSetMode: %s\n", pmProgname, pmErrStr(sts));
167 exit(1);
170 if (tflag)
171 pmTrimNameSpace();
174 * metrics biased towards log "foo"
176 i = 0;
177 namelist[i++] = "sample.seconds";
178 numpmid = i;
180 sts = pmLookupName(numpmid, namelist, pmidlist);
181 if (sts < 0) {
182 printf("pmLookupName: %s\n", pmErrStr(sts));
183 for (i = 0; i < numpmid; i++) {
184 if (pmidlist[i] == PM_ID_NULL)
185 printf(" %s - not known\n", namelist[i]);
189 printf("\nPass 1: forward scan\n");
190 fflush(stdout);
191 for (;;) {
192 if ((sts = pmFetch(numpmid, pmidlist, &resp)) < 0) {
193 if (sts != PM_ERR_EOL)
194 printf("%s: pmFetch: %s\n", pmProgname, pmErrStr(sts));
195 break;
197 resnum++;
198 resvec = (pmResult **)realloc(resvec, resnum * sizeof(resvec[0]));
199 resvec[resnum - 1] = resp;
200 if (vflag)
201 __pmDumpResult(stdout, resp);
202 when = resp->timestamp;
204 fflush(stderr);
205 printf("Found %d samples\n", resnum);
207 printf("\nPass 1.1: forwards past EOL\n");
208 fflush(stdout);
209 for (i = 0; i < 10; i++) {
210 if ((sts = pmFetch(numpmid, pmidlist, &resp)) < 0) {
211 if (sts != PM_ERR_EOL)
212 printf("%s: pmFetch: %s\n", pmProgname, pmErrStr(sts));
214 when.tv_usec += delta * 1000;
215 if (when.tv_usec > 1000000) {
216 when.tv_sec++;
217 when.tv_usec -= 1000000;
220 fflush(stderr);
222 printf("\nPass 1.2: backwards past EOL\n");
223 fflush(stdout);
224 if ((sts = pmSetMode(PM_MODE_INTERP, &when, -delta)) < 0) {
225 printf("%s: pmSetMode: %s\n", pmProgname, pmErrStr(sts));
226 exit(1);
228 for (i = 0; i < 10; i++) {
229 if ((sts = pmFetch(numpmid, pmidlist, &resp)) < 0) {
230 if (sts != PM_ERR_EOL)
231 printf("%s: pmFetch: %s\n", pmProgname, pmErrStr(sts));
234 fflush(stderr);
236 printf("\nPass 2: backwards scan\n");
237 fflush(stdout);
238 n = 0;
239 for (;;) {
240 if ((sts = pmFetch(numpmid, pmidlist, &resp)) < 0) {
241 if (sts != PM_ERR_EOL)
242 printf("%s: pmFetch: %s\n", pmProgname, pmErrStr(sts));
243 break;
245 n++;
246 cmpres(n, resvec[resnum - n], resp);
247 when = resp->timestamp;
248 pmFreeResult(resp);
250 fflush(stderr);
251 printf("Found %d samples\n", n);
253 printf("\nPass 2.1: backwards prior to SOL\n");
254 fflush(stdout);
255 for (i = 0; i < 10; i++) {
256 if ((sts = pmFetch(numpmid, pmidlist, &resp)) < 0) {
257 if (sts != PM_ERR_EOL)
258 printf("%s: pmFetch: %s\n", pmProgname, pmErrStr(sts));
259 } else {
260 pmFreeResult(resp);
262 when.tv_usec -= delta * 1000;
263 if (when.tv_usec < 0) {
264 when.tv_sec--;
265 when.tv_usec += 1000000;
268 fflush(stderr);
270 printf("\nPass 2.2: forwards prior to SOL\n");
271 fflush(stdout);
272 if ((sts = pmSetMode(PM_MODE_INTERP, &when, delta)) < 0) {
273 printf("%s: pmSetMode: %s\n", pmProgname, pmErrStr(sts));
274 exit(1);
276 for (i = 0; i < 10; i++) {
277 if ((sts = pmFetch(numpmid, pmidlist, &resp)) < 0) {
278 if (sts != PM_ERR_EOL)
279 printf("%s: pmFetch: %s\n", pmProgname, pmErrStr(sts));
282 fflush(stderr);
284 printf("\nPass 3: forwards scan\n");
285 fflush(stdout);
286 for (n = 0;; n++) {
287 if ((sts = pmFetch(numpmid, pmidlist, &resp)) < 0) {
288 if (sts != PM_ERR_EOL)
289 printf("%s: pmFetch: %s\n", pmProgname, pmErrStr(sts));
290 break;
292 cmpres(n, resvec[n], resp);
293 pmFreeResult(resvec[n]);
294 resvec[n] = NULL;
295 pmFreeResult(resp);
297 fflush(stderr);
298 printf("Found %d samples\n", n);
299 fflush(stdout);
300 if (resvec != NULL) {
301 for (i = 0; i < resnum; i++) {
302 if (resvec[i] != NULL)
303 pmFreeResult(resvec[i]);
305 free(resvec);
308 exit(0);