Rename newtestsuite to testsuite
[dyninst.git] / testsuite / src / dyninst / test3_2.C
1 /*
2  * Copyright (c) 1996-2004 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 // $Id: test3_2.C,v 1.1 2008/10/30 19:20:35 legendre Exp $
43 /*
44  * #Name: test3_2
45  * #Desc: simultaneous multiple-process management - exit
46  * #Dep: 
47  * #Arch: all
48  * #Notes: useAttach does not apply
49  */
50
51 #include "BPatch.h"
52 #include "BPatch_Vector.h"
53 #include "BPatch_thread.h"
54 #include "BPatch_snippet.h"
55
56 #include "test_lib.h"
57 //#include "test3.h"
58
59 #define MAX_MUTATEES    32
60
61 #include "dyninst_comp.h"
62 class test3_2_Mutator : public DyninstMutator {
63   unsigned int Mutatees;
64   int debugPrint;
65   BPatch *bpatch;
66   char *pathname;
67
68 public:
69   test3_2_Mutator();
70   virtual bool hasCustomExecutionPath() { return true; }
71   virtual test_results_t setup(ParameterDict &param);
72   virtual test_results_t executeTest();
73 };
74 extern "C" DLLEXPORT  TestMutator *test3_2_factory() {
75   return new test3_2_Mutator();
76 }
77
78 test3_2_Mutator::test3_2_Mutator()
79   : Mutatees(3), bpatch(NULL), pathname(NULL) {
80 }
81
82 //
83 // Start Test Case #2 - create processes and process events from each
84 //     Just let them run to finish, no instrumentation added.
85 //
86 // static int mutatorTest(char *pathname, BPatch *bpatch)
87 test_results_t test3_2_Mutator::executeTest() {
88     unsigned int n=0;
89     const char *child_argv[5];
90     child_argv[n++] = pathname;
91     if (debugPrint) child_argv[n++] = const_cast<char*>("-verbose");
92     child_argv[n++] = const_cast<char*>("-run");
93     child_argv[n++] = const_cast<char*>("test3_2"); // run test2 in mutatee
94     child_argv[n++] = NULL;
95
96     BPatch_thread *appThread[MAX_MUTATEES];
97
98     for (n=0; n<MAX_MUTATEES; n++) appThread[n]=NULL;
99
100     // Start the mutatees
101     for (n=0; n<Mutatees; n++) {
102         dprintf("Starting \"%s\" %d/%d\n", pathname, n, Mutatees);
103         appThread[n] = bpatch->createProcess(pathname, child_argv, NULL);
104         if (!appThread[n]) {
105             logerror("*ERROR*: unable to create handle%d for executable\n", n);
106             logerror("**Failed** test #2 (simultaneous multiple-process management - exit)\n");
107                         if(n > 0) {
108                                 MopUpMutatees(n-1,appThread);
109                         }
110             return FAILED;
111         }
112         dprintf("Mutatee %d started, pid=%d\n", n, appThread[n]->getPid());
113         // Register for mutatee cleanup
114         registerPID(appThread[n]->getProcess()->getPid());
115     }
116     dprintf("Letting %d mutatee processes run.\n", Mutatees);
117     for (n=0; n<Mutatees; n++) appThread[n]->continueExecution();
118
119     unsigned int numTerminated=0;
120     bool terminated[MAX_MUTATEES];
121     for (n=0; n<Mutatees; n++) terminated[n]=false;
122
123     // monitor the mutatee termination reports
124     while (numTerminated < Mutatees) {
125         bpatch->waitForStatusChange();
126         dprintf("%s[%d]:  got status change\n", __FILE__, __LINE__);
127         for (n=0; n<Mutatees; n++)
128             if (!terminated[n] && (appThread[n]->isTerminated())) {
129                 if(appThread[n]->terminationStatus() == ExitedNormally) {
130                     int exitCode = appThread[n]->getExitCode();
131                     if (exitCode || debugPrint)
132                         dprintf("Mutatee %d exited with exit code 0x%x\n", n,
133                                 exitCode);
134                 }
135                 else if(appThread[n]->terminationStatus() == ExitedViaSignal) {
136                     int signalNum = appThread[n]->getExitSignal();
137                     if (signalNum || debugPrint)
138                         dprintf("Mutatee %d exited from signal 0x%d\n", n,
139                                 signalNum);
140                 }
141                 terminated[n]=true;
142                 numTerminated++;
143             }
144             else if (!terminated[n] && (appThread[n]->isStopped())) {
145                 appThread[n]->continueExecution();
146             }
147     }
148
149     if (numTerminated == Mutatees) {
150         logerror("Passed Test #2 (simultaneous multiple-process management - exit)\n");
151         return PASSED;
152     }
153         return FAILED;
154 }
155
156 // extern "C" TEST_DLL_EXPORT int test3_2_mutatorMAIN(ParameterDict &param)
157 test_results_t test3_2_Mutator::setup(ParameterDict &param) {
158     pathname = param["pathname"]->getString();
159     bpatch = (BPatch *)(param["bpatch"]->getPtr());
160     debugPrint = param["debugPrint"]->getInt();
161
162 #if defined (sparc_sun_solaris2_4_test)
163     // we use some unsafe type operations in the test cases.
164     bpatch->setTypeChecking(false);
165 #endif
166     
167     return PASSED;
168 }