Windows test suite & build fixes. VC2003 and VC2008 should both now build. Known...
[dyninst.git] / newtestsuite / src / dyninst / test1_41.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: test1_41.C,v 1.1 2008/10/30 19:19:37 legendre Exp $
43 /*
44  * #Name: test1_41
45  * #Desc: Tests whether we lose line information running a mutatee twice
46  * #Dep: 
47  * #Arch:
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 #include "BPatch_statement.h"
56
57 #include "test_lib.h"
58
59 #include "dyninst_comp.h"
60 class test1_41_Mutator : public DyninstMutator {
61   BPatch_exitType expectedSignal;
62   int debugPrint;
63   const int iterations;
64   char *pathname;
65   BPatch *bpatch;
66   
67   virtual bool hasCustomExecutionPath() { return true; }
68   virtual test_results_t setup(ParameterDict &param);
69   virtual test_results_t executeTest();
70
71 public:
72   test1_41_Mutator();
73 };
74 extern "C" DLLEXPORT  TestMutator *test1_41_factory() {
75   return new test1_41_Mutator();
76 }
77
78 test1_41_Mutator::test1_41_Mutator()
79   : expectedSignal(ExitedNormally), iterations(2) {
80   TestMutator();
81 }
82
83 // static int mutatorTest(char *pathname, BPatch *bpatch)
84 test_results_t test1_41_Mutator::executeTest() {
85    unsigned int n=0;
86    const char *child_argv[5];
87    child_argv[n++] = pathname;
88    if (debugPrint) child_argv[n++] = const_cast<char*>("-verbose");
89    child_argv[n++] = const_cast<char*>("-run");
90    child_argv[n++] = const_cast<char*>("test1_41"); // run test41 in mutatee
91    child_argv[n++] = NULL;
92
93    int counts[iterations];
94
95    // Run the mutatee twice, querying line info each time & store the info
96    for (n = 0; n < iterations; n++) {
97       dprintf("Starting \"%s\"\n", pathname);
98       BPatch_thread *thread = bpatch->createProcess(pathname, child_argv,
99                                                     NULL);
100       if (!thread) {
101          logerror("*ERROR*: unable to create handle for executable\n", n);
102          logerror("**Failed** test #41 (repeated line information)\n");
103          return FAILED;
104       }
105       dprintf("Mutatee started, pid=%d\n", n, thread->getPid());
106       registerPID(thread->getProcess()->getPid()); // register for cleanup
107
108       BPatch_image *image = thread->getImage();
109       if (!image) {
110          logerror("*ERROR*: unable to get image from thread\n");
111          logerror("**Failed** test #41 (repeated line information)\n");
112          return FAILED;
113       }
114       if (isMutateeFortran(image)) {
115          // This shouldn't happen..
116          thread->getProcess()->terminateExecution();
117          logerror("Skipped test #41 (repeated line information)\n");
118          return SKIPPED;
119       }
120
121       BPatch_module *module = image->findModule("test1_41_mutatee.c", true);
122       if (!module) {
123          module = image->findModule("solo_mutatee_boilerplate.c", true);
124       }
125
126       if (!module) {
127          // First try again for 'test1_41_solo_me.c'
128          module = image->findModule("test1_41_solo_me.c", true);
129          if (!module) {
130             logerror("*ERROR*: unable to get module from image\n");
131             logerror("Looking for \"test1_41_solo_me.c\" or \"solo_mutatee_boilerplate.c\". Available modules:\n");
132             BPatch_Vector<BPatch_module *> *mods = image->getModules();
133             char buffer[512];
134             for (unsigned i = 0; i < mods->size(); i++) {
135                BPatch_module *mod = (*mods)[i];
136                char name[512];
137                mod->getName(name, 512);
138                sprintf(buffer, "\t%s\n",
139                        name);
140                logerror(buffer);
141             }
142
143             logerror("**Failed** test #41 (repeated line information)\n");
144
145             return FAILED;
146          }
147       }
148
149       char buffer[16384]; // FIXME ugly magic number; No module name should be that long..
150       module->getName(buffer, sizeof(buffer));
151
152       BPatch_Vector<BPatch_statement> statements;
153       bool res = module->getStatements(statements);
154       if (!res) {
155          fprintf(stderr, "%s[%d]:  getStatements()\n", __FILE__, __LINE__);
156          return FAILED;
157       }
158
159       counts[n] = statements.size();
160       dprintf("Trial %d: found %d statements\n", n, statements.size());
161
162       thread->getProcess()->terminateExecution();
163    }
164
165    // Make sure we got the same info each time we ran the mutatee
166    int last_count = -1;
167    for (int i = 0; i < iterations; i++) {
168       if ((last_count >= 0) && (last_count != counts[i])) {
169          logerror("*ERROR*: statement counts didn't match: %d vs. %d\n", last_count, counts[i]);
170          logerror("**Failed** test #41 (repeated line information)\n");
171          return FAILED;
172       }
173       last_count = counts[i];
174    }
175
176    logerror("Passed test #41 (repeated line information)\n");
177    return PASSED;
178 }
179
180 // extern "C" TEST_DLL_EXPORT int test1_41_mutatorMAIN(ParameterDict &param)
181 test_results_t test1_41_Mutator::setup(ParameterDict &param) {
182    pathname = param["pathname"]->getString();
183    bpatch = (BPatch *)(param["bpatch"]->getPtr());
184    debugPrint = param["debugPrint"]->getInt();
185
186 #if defined (sparc_sun_solaris2_4_test)
187    // we use some unsafe type operations in the test cases.
188    bpatch->setTypeChecking(false);
189 #endif
190
191    return PASSED;
192 }