summaryrefslogtreecommitdiff
path: root/qa/src/tstate.c
diff options
context:
space:
mode:
Diffstat (limited to 'qa/src/tstate.c')
-rw-r--r--qa/src/tstate.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/qa/src/tstate.c b/qa/src/tstate.c
new file mode 100644
index 0000000..2a581b4
--- /dev/null
+++ b/qa/src/tstate.c
@@ -0,0 +1,78 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <pcp/trace.h>
+
+
+int
+tracestate(int flag)
+{
+ int tmp = pmtracestate(0);
+ int var;
+
+ tmp |= flag;
+ var = pmtracestate(tmp);
+ fprintf(stderr, "tstate: state now is 0x%x\n", tmp);
+ return var;
+}
+
+int
+main(int argc, char **argv)
+{
+ int sts;
+
+ if (argc != 2) {
+ fprintf(stderr, "tstate: takes one argument.\n");
+ exit(1);
+ }
+
+ /*
+ * this exercises the state setting routine in libpcp_trace,
+ * particularly the async protocol flag setting, since this
+ * is a little more involved.
+ */
+
+ if (argv[1][0] == '1') {
+ fprintf(stderr, "--- Test 1 ---\n");
+ tracestate(PMTRACE_STATE_API);
+ tracestate(PMTRACE_STATE_PDU | PMTRACE_STATE_PDUBUF);
+ sts = pmtracepoint("tstate1"); /* no longer able to change protocol */
+ if (sts < 0) {
+ fprintf(stderr, "tstate pmtracepoint: %s\n", pmtraceerrstr(sts));
+ exit(1);
+ }
+ fprintf(stderr, "state should be only ASYNC 0x%x ...\n", PMTRACE_STATE_ASYNC);
+ tracestate(PMTRACE_STATE_ASYNC);
+ }
+ else if (argv[1][0] == '2') {
+ fprintf(stderr, "--- Test 2 ---\n");
+ tracestate(PMTRACE_STATE_ASYNC);
+ fprintf(stderr, "state should be same as previous ...\n");
+ tracestate(PMTRACE_STATE_ASYNC);
+ }
+ else if (argv[1][0] == '3') {
+ fprintf(stderr, "--- Test 3 ---\n");
+ pmtracepoint("tstate3");
+ fprintf(stderr, "state change should fail ... ");
+ if ((sts = pmtracestate(PMTRACE_STATE_ASYNC)) < 0)
+ fprintf(stderr, "OK\n");
+ else
+ fprintf(stderr, "urk - non-negative returned (%d)!\n", sts);
+ }
+ else if (argv[1][0] == '4') {
+ fprintf(stderr, "--- Test 4 ---\n");
+ tracestate(PMTRACE_STATE_ASYNC|PMTRACE_STATE_API);
+ sts = pmtracepoint("tstate4");
+ if (sts < 0) {
+ fprintf(stderr, "tstate pmtracepoint: %s\n", pmtraceerrstr(sts));
+ exit(1);
+ }
+ fprintf(stderr, "change to async only (0x%x)...\n", PMTRACE_STATE_ASYNC);
+ tracestate(PMTRACE_STATE_ASYNC);
+ }
+ else {
+ fprintf(stderr, "Don't know what to do with \"%s\"\n", argv[1]);
+ exit(1);
+ }
+
+ exit(0);
+}