Make WvStreams compile with gcc 4.4.
[wvstreams.git] / utils / t / wvsubprocqueue.t.cc
blob0cd13f3e925935762a859ab071bae45176c1c622
1 /* -*- Mode: C++ -*-
2 * Worldvisions Weaver Software:
3 * Copyright (C) 1997-2002 Net Integration Technologies, Inc.
5 * A class for running a series or set of processes, one at a time.
6 * See wvsubprocqueue.h.
7 */
8 #include "wvsubprocqueue.h"
9 #include "wvtest.h"
10 #include "wvfile.h"
12 #include <unistd.h>
14 struct WvSubProcQueueTester
16 WvString fn;
17 WvString cmd1, cmd2, cmd2s;
18 const char *argv1[4];
19 const char *argv2[4];
20 const char *argv2s[4];
21 const char *argv3[4];
22 int c1, c2; // cookies that we can point to - value doesn't matter
24 WvSubProcQueueTester() :
25 fn("test-%s.tmp", getpid()),
26 cmd1("echo cmd1 >>%s", fn),
27 cmd2("echo cmd2 >>%s", fn),
28 cmd2s("sleep 1; %s", cmd2)
30 argv1[0] = "sh"; argv1[1] = "-c", argv1[2] = cmd1, argv1[3] = NULL;
31 argv2[0] = "sh"; argv2[1] = "-c", argv2[2] = cmd2, argv2[3] = NULL;
32 argv2s[0]= "sh"; argv2s[1]= "-c", argv2s[2]= cmd2s, argv2s[3]= NULL;
33 argv3[0] = "rm"; argv3[1] = "-f", argv3[2] = fn, argv3[3] = NULL;
38 static WvString contents(WvStringParm fn)
40 return WvFile(fn, O_RDONLY).blocking_getline(-1, 0);
44 static bool exists(WvStringParm fn)
46 return !access(fn, F_OK);
50 WVTEST_MAIN("wvsubprocqueue1")
52 WvSubProcQueueTester t;
53 ::unlink(t.fn);
54 WVFAIL(exists(t.fn));
56 WvSubProcQueue q(1);
58 // basic sequencing
59 ::unlink(t.fn);
60 q.add(NULL, t.argv1[0], t.argv1);
61 q.add(NULL, t.argv3[0], t.argv3);
62 q.add(NULL, t.argv2[0], t.argv2);
63 WVPASSEQ(q.remaining(), 3);
64 q.go();
65 WVPASSEQ(q.running(), 1);
66 WVPASSEQ(q.remaining(), 3); // one running, two waiting
67 q.finish();
68 WVPASSEQ(q.remaining(), 0);
69 WVPASS(q.isempty());
70 WVPASS(exists(t.fn));
71 WVPASSEQ(contents(t.fn), "cmd2\n");
73 // cookie sequencing and duplicate detection
74 ::unlink(t.fn);
75 q.add(&t.c1, t.argv1[0], t.argv1);
76 q.add(&t.c1, t.argv1[0], t.argv1);
77 q.add(NULL, t.argv2[0], t.argv2);
78 q.add(&t.c1, t.argv1[0], t.argv1);
79 q.add(NULL, t.argv2[0], t.argv2);
80 q.add(&t.c1, t.argv1[0], t.argv1);
81 q.finish();
82 WVPASSEQ(contents(t.fn), "cmd1\ncmd2\ncmd2\ncmd1\n");
84 // enqueuing a cookie that is already running
85 ::unlink(t.fn);
86 q.add(&t.c1, t.argv1[0], t.argv1);
87 q.go();
88 q.add(NULL, t.argv2[0], t.argv2);
89 q.add(&t.c1, t.argv1[0], t.argv1);
90 q.add(&t.c1, t.argv1[0], t.argv1);
91 q.add(&t.c1, t.argv1[0], t.argv1);
92 q.finish();
93 WVPASSEQ(contents(t.fn), "cmd1\ncmd2\ncmd1\n");
95 ::unlink(t.fn);
99 WVTEST_MAIN("wvsubprocqueue2")
101 WvSubProcQueueTester t;
102 WvSubProcQueue q(2);
104 ::unlink(t.fn);
106 // parallelism with guaranteed ordering
107 ::unlink(t.fn);
108 q.add(NULL, t.argv1[0], t.argv1);
109 q.add(NULL, t.argv1[0], t.argv1);
110 q.add(&t.c1, t.argv2s[0], t.argv2s);
111 q.add(&t.c1, t.argv2s[0], t.argv2s);
112 q.add(NULL, t.argv1[0], t.argv1);
113 q.go();
114 WVPASSEQ(q.running(), 2);
115 q.finish();
116 WVPASSEQ(contents(t.fn), "cmd1\ncmd1\ncmd2\ncmd1\n");
118 // sequencing multiple cookies
119 ::unlink(t.fn);
120 q.add(NULL, t.argv1[0], t.argv1);
121 q.add(NULL, t.argv1[0], t.argv1);
122 q.add(&t.c1, t.argv2[0], t.argv2);
123 q.go();
124 WVPASSEQ(q.running(), 2);
125 q.add(NULL, t.argv1[0], t.argv1);
126 q.add(&t.c1, t.argv2[0], t.argv2);
127 q.add(NULL, t.argv1[0], t.argv1);
128 q.add(&t.c2, t.argv2s[0], t.argv2s);
129 q.add(NULL, t.argv1[0], t.argv1);
130 q.add(&t.c1, t.argv2[0], t.argv2);
131 q.add(NULL, t.argv1[0], t.argv1);
132 q.add(&t.c1, t.argv2[0], t.argv2);
133 q.finish();
134 WVPASSEQ(contents(t.fn),
135 "cmd1\ncmd1\ncmd2\ncmd1\ncmd1\ncmd2\ncmd1\ncmd1\ncmd2\n");
137 // enqueuing cookies while running
138 ::unlink(t.fn);
139 q.add(&t.c1, t.argv2[0], t.argv2);
140 q.go();
141 WVPASSEQ(q.running(), 1);
142 q.add(&t.c1, t.argv2[0], t.argv2);
143 q.add(&t.c1, t.argv2[0], t.argv2);
144 q.finish();
145 WVPASSEQ(contents(t.fn), "cmd2\ncmd2\n");
147 ::unlink(t.fn);