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.
8 #include "wvsubprocqueue.h"
14 struct WvSubProcQueueTester
17 WvString cmd1
, cmd2
, cmd2s
;
20 const char *argv2s
[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
;
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);
65 WVPASSEQ(q
.running(), 1);
66 WVPASSEQ(q
.remaining(), 3); // one running, two waiting
68 WVPASSEQ(q
.remaining(), 0);
71 WVPASSEQ(contents(t
.fn
), "cmd2\n");
73 // cookie sequencing and duplicate detection
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
);
82 WVPASSEQ(contents(t
.fn
), "cmd1\ncmd2\ncmd2\ncmd1\n");
84 // enqueuing a cookie that is already running
86 q
.add(&t
.c1
, t
.argv1
[0], t
.argv1
);
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
);
93 WVPASSEQ(contents(t
.fn
), "cmd1\ncmd2\ncmd1\n");
99 WVTEST_MAIN("wvsubprocqueue2")
101 WvSubProcQueueTester t
;
106 // parallelism with guaranteed ordering
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
);
114 WVPASSEQ(q
.running(), 2);
116 WVPASSEQ(contents(t
.fn
), "cmd1\ncmd1\ncmd2\ncmd1\n");
118 // sequencing multiple cookies
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
);
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
);
134 WVPASSEQ(contents(t
.fn
),
135 "cmd1\ncmd1\ncmd2\ncmd1\ncmd1\ncmd2\ncmd1\ncmd1\ncmd2\n");
137 // enqueuing cookies while running
139 q
.add(&t
.c1
, t
.argv2
[0], t
.argv2
);
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
);
145 WVPASSEQ(contents(t
.fn
), "cmd2\ncmd2\n");