summaryrefslogtreecommitdiff
path: root/qa/src/store.c
diff options
context:
space:
mode:
Diffstat (limited to 'qa/src/store.c')
-rw-r--r--qa/src/store.c232
1 files changed, 232 insertions, 0 deletions
diff --git a/qa/src/store.c b/qa/src/store.c
new file mode 100644
index 0000000..3e4daac
--- /dev/null
+++ b/qa/src/store.c
@@ -0,0 +1,232 @@
+/*
+ * Copyright (c) 1997-2001 Silicon Graphics, Inc. All Rights Reserved.
+ */
+
+#include <ctype.h>
+#include <pcp/pmapi.h>
+#include <pcp/impl.h>
+
+void
+_compare(pmResult *orp, pmResult *nrp)
+{
+ pmValue *ovp;
+ pmValue *nvp;
+ int i;
+ int j;
+ int delta;
+ int err = 0;
+
+ if (orp->numpmid != nrp->numpmid) {
+ printf("ERROR: numpmid mismatch\n");
+ goto bad;
+ }
+
+ for (i = 0; i < orp->numpmid; i++) {
+ if (orp->vset[i]->numval != nrp->vset[i]->numval) {
+ printf("ERROR: [metric %d] numval mismatch\n", i);
+ err = 1;
+ continue;
+ }
+ if (orp->vset[i]->valfmt != nrp->vset[i]->valfmt) {
+ printf("ERROR: [metric %d] valfmt mismatch\n", i);
+ err = 1;
+ continue;
+ }
+ if (orp->vset[i]->valfmt != PM_VAL_INSITU) {
+ printf("ERROR: [metric %d] bogus valfmt\n", i);
+ err = 1;
+ continue;
+ }
+ for (j = 0; j < orp->vset[i]->numval; j++) {
+ ovp = &orp->vset[i]->vlist[j];
+ nvp = &nrp->vset[i]->vlist[j];
+ delta = ovp->value.lval - nvp->value.lval;
+ if (delta != 0) {
+ printf("ERROR: [metric %d][instance %d] value mismatch\n", i, j);
+ err = 1;
+ if (i == 1 && j == 0)
+ printf("NOTE: this is expected for sampledso.drift\n");
+ }
+ }
+ }
+
+ if (err)
+ goto bad;
+
+ return;
+
+bad:
+
+ __pmDumpResult(stdout, orp);
+ __pmDumpResult(stdout, nrp);
+}
+
+int
+main(int argc, char **argv)
+{
+ int type = PM_CONTEXT_HOST;
+ int c;
+ int sts;
+ int errflag = 0;
+ char *host = "localhost";
+ char *namespace = PM_NS_DEFAULT;
+#ifdef PCP_DEBUG
+ static char *debug = "[-D N] ";
+#else
+ static char *debug = "";
+#endif
+ static char *usage = "[-x] [-h hostname] [-n namespace]";
+ int i;
+ int n;
+ char *namelist[20];
+ pmID midlist[20];
+ int numpmid;
+ pmResult *old;
+ pmResult *new;
+ pmResult pr;
+ pmValueSet pvs;
+
+ __pmSetProgname(argv[0]);
+
+ while ((c = getopt(argc, argv, "D:h:Ln:")) != EOF) {
+ switch (c) {
+
+#ifdef PCP_DEBUG
+ case 'D': /* debug flag */
+ sts = __pmParseDebug(optarg);
+ if (sts < 0) {
+ fprintf(stderr, "%s: unrecognized debug flag specification (%s)\n",
+ pmProgname, optarg);
+ errflag++;
+ }
+ else
+ pmDebug |= sts;
+ break;
+#endif
+
+ case 'h': /* hostname for PMCD to contact */
+ host = optarg;
+ break;
+
+ case 'L': /* LOCAL, no PMCD */
+ host = NULL;
+ type = PM_CONTEXT_LOCAL;
+ putenv("PMDA_LOCAL_SAMPLE=");
+ break;
+
+ case 'n': /* alternative name space file */
+ namespace = optarg;
+ break;
+
+ case '?':
+ default:
+ errflag++;
+ break;
+ }
+ }
+
+ if (errflag) {
+ printf("Usage: %s %s%s\n", pmProgname, debug, usage);
+ exit(1);
+ }
+
+ if ((sts = pmLoadNameSpace(namespace)) < 0) {
+ printf("%s: Cannot load namespace from \"%s\": %s\n", pmProgname, namespace, pmErrStr(sts));
+ exit(1);
+ }
+
+ if ((sts = pmNewContext(type, host)) < 0) {
+ if (type == PM_CONTEXT_HOST)
+ printf("%s: Cannot connect to PMCD on host \"%s\": %s\n",
+ pmProgname, host, pmErrStr(sts));
+ else
+ printf("%s: Cannot connect standalone on localhost: %s\n",
+ pmProgname, pmErrStr(sts));
+ exit(1);
+ }
+
+ i = 0;
+ namelist[i++] = "sampledso.write_me";
+ namelist[i++] = "sampledso.control";
+ namelist[i++] = "sampledso.long.one";
+ numpmid = i;
+ n = pmLookupName(numpmid, namelist, midlist);
+ if (n < 0) {
+ printf("pmLookupName: %s\n", pmErrStr(n));
+ for (i = 0; i < numpmid; i++) {
+ if (midlist[i] == PM_ID_NULL)
+ printf(" %s is bad\n", namelist[i]);
+ }
+ exit(1);
+ }
+
+ if ((n = pmFetch(numpmid, midlist, &old)) < 0) {
+ printf("pmFetch old: %s\n", pmErrStr(n));
+ exit(1);
+ }
+ old->numpmid--;
+ if ((n = pmStore(old)) < 0) {
+ printf("pmStore no change: %s\n", pmErrStr(n));
+ }
+ if ((n = pmFetch(numpmid - 1, midlist, &new)) < 0) {
+ printf("pmFetch new: %s\n", pmErrStr(n));
+ exit(1);
+ }
+ else {
+ _compare(old, new);
+ pmFreeResult(new);
+ }
+
+ old->vset[0]->vlist[0].value.lval++;
+ if ((n = pmStore(old)) < 0) {
+ printf("pmStore change: %s\n", pmErrStr(n));
+ }
+ if ((n = pmFetch(numpmid - 1, midlist, &new)) < 0) {
+ printf("pmFetch new again: %s\n", pmErrStr(n));
+ exit(1);
+ }
+ else {
+ _compare(old, new);
+ pmFreeResult(new);
+ }
+
+ old->vset[0]->vlist[0].value.lval--;
+ if ((n = pmStore(old)) < 0) {
+ printf("pmStore restore: %s\n", pmErrStr(n));
+ }
+ if ((n = pmFetch(numpmid - 1, midlist, &new)) < 0) {
+ printf("pmFetch new once more: %s\n", pmErrStr(n));
+ }
+ else {
+ _compare(old, new);
+ pmFreeResult(new);
+ }
+
+ old->numpmid++; /* cannot change sampledso.long.one */
+ n = pmStore(old);
+ if (n != -EACCES && n != PM_ERR_PERMISSION) {
+ printf("ERROR: expected EACCES or PM_ERR_PERMISSION error\n");
+ printf("pmStore all 3: %s\n", pmErrStr(n));
+ }
+ pmFreeResult(old);
+
+ /*
+ * see http://people.redhat.com/mgoodwin/pcp-cov/1/127dostore.c.html#error
+ */
+ pr.numpmid = 1;
+ pr.vset[0] = &pvs;
+ /* assume BROKEN PMDA is not installed */
+ pr.vset[0]->pmid = pmid_build(249,123,456);
+ pr.vset[0]->numval = 1;
+ pr.vset[0]->valfmt = PM_VAL_INSITU;
+ pr.vset[0]->vlist[0].inst = PM_INDOM_NULL;
+ pr.vset[0]->vlist[0].value.lval = 123456;
+ n = pmStore(&pr);
+ if (n != PM_ERR_NOAGENT) {
+ printf("ERROR: expected PM_ERR_NOAGENT error\n");
+ printf("pmStore bad agent domain: %s\n", pmErrStr(n));
+ exit(1);
+ }
+
+ exit(0);
+}