Rename newtestsuite to testsuite
[dyninst.git] / testsuite / src / dyninst / test1_21.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_21.C,v 1.1 2008/10/30 19:18:23 legendre Exp $
43 /*
44  * #Name: test1_21
45  * #Desc: findFunction in module
46  * #Dep: 
47  * #Arch: sparc_sun_solaris2_4_test,alpha_dec_osf4_0_test,i386_unknown_solaris2_5_test,i386_unknown_linux2_0_test,ia64_unknown_linux2_4_test,mips_sgi_irix6_4_test,rs6000_ibm_aix4_1_test,x86_64_unknown_linux2_4_test
48  * #Notes: This test uses some special magic for libNameA and libNameB that should probably be altered
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
58 #ifdef os_windows_test
59 #define snprintf _snprintf
60 #endif
61
62 #include "dyninst_comp.h"
63
64 class test1_21_Mutator : public DyninstMutator {
65         const char *libNameAroot;
66         const char *libNameBroot;
67         char libNameA[128], libNameB[128];
68
69         public:
70         test1_21_Mutator();
71         virtual test_results_t executeTest();
72         test_results_t mutatorTest21();
73 };
74
75 test1_21_Mutator::test1_21_Mutator() : libNameAroot("libtestA"),
76                                                                            libNameBroot("libtestB") 
77 {}
78
79 extern "C" DLLEXPORT  TestMutator *test1_21_factory() 
80 {
81         return new test1_21_Mutator();
82 }
83
84 //
85 // Start Test Case #21 - mutator side (findFunction in module)
86 //
87 // There is no corresponding failure (test2) testing because the only
88 // bad input to replaceFunction is a non-existent BPatch_function.
89 // But this is already checked by the "non-existent function" test in
90 // test2.
91
92 test_results_t test1_21_Mutator::mutatorTest21() 
93 {
94 #if defined(os_aix_test) \
95         || defined(os_osf_test) \
96         || defined(os_solaris_test) \
97         || defined(os_linux_test) \
98         || defined(os_windows_test)
99
100         // Lookup the libtestA.so and libtestB.so modules that we've just loaded
101
102         BPatch_module *modA = NULL;
103         BPatch_module *modB = NULL;
104         BPatch_Vector<BPatch_module *> *mods = appImage->getModules();
105
106         if (!mods || mods->size() == 0) 
107         {
108                 logerror("**Failed test #21 (findFunction in module)\n");
109                 logerror("  Mutator couldn't search modules of mutatee\n");
110                 return FAILED;
111         }
112
113         for (unsigned int i = 0; i < mods->size() && !(modA && modB); i++) 
114         {
115                 char buf[1024];
116                 BPatch_module *m = (*mods)[i];
117                 m->getName(buf, 1024);
118
119                 // module names sometimes have "_module" appended
120                 if (!strcmpcase(libNameA, buf))
121                         modA = m;
122                 else if (!strcmpcase(libNameB, buf))
123                         modB = m;
124         }
125
126         if (! modA || ! modB ) 
127         {
128                 logerror("**Failed test #21 (findFunction in module)\n");
129                 logerror("  Mutator couldn't find shlib in mutatee\n");
130                 flushErrorLog();
131                 return FAILED;
132         }
133
134         // Find the function CALL21_1 in each of the modules
135         BPatch_Vector<BPatch_function *> bpmv;
136
137         if (NULL == modA->findFunction("call21_1", bpmv, false, false, true) || !bpmv.size()) 
138         {
139                 logerror("**Failed test #21 (findFunction in module)\n");
140                 logerror("  %s[%d]: Mutator couldn't find a function in %s\n", 
141                                 __FILE__, __LINE__, libNameA);
142                 return FAILED;
143         }
144
145         BPatch_function *funcA = bpmv[0];
146         bpmv.clear();
147
148         if (NULL == modB->findFunction("call21_1", bpmv, false, false, true) || !bpmv.size()) 
149         {
150                 logerror("**Failed test #21 (findFunction in module)\n");
151                 logerror("  %s[%d]: Mutator couldn't find a function in %s\n", 
152                                 __FILE__, __LINE__, libNameB);
153                 return FAILED;
154         } 
155
156         BPatch_function *funcB = bpmv[0];
157
158         // Kludgily test whether the functions are distinct
159         if (funcA->getBaseAddr() == funcB->getBaseAddr()) 
160         {
161                 logerror("**Failed test #21 (findFunction in module)\n");
162                 logerror("  Mutator cannot distinguish two functions from different shlibs\n");
163                 return FAILED;
164         }
165
166         //  Now test regex search
167         //  Not meant to be an extensive check of all regex usage, just that
168         //  the basic mechanism that deals with regexes is not broken
169
170         bpmv.clear();
171 #if !defined(os_windows_test)
172         //   regex "^cb" should match all functions that begin with "cb"
173         //   We dont use existing "call" functions here since (at least on
174         //   linux, we also find call_gmon_start().  Thus the dummy fns.
175         if (NULL == modB->findFunction("^cb", bpmv, false, false, true) || (bpmv.size() != 2)) 
176         {
177
178                 logerror("**Failed test #21 (findFunction in module, regex)\n");
179                 logerror("  Expected 2 functions matching ^cb, got %d\n",
180                                 bpmv.size());
181                 char buf[128];
182                 for (unsigned int i = 0; i < bpmv.size(); ++i) 
183                         logerror("  matched function: %s\n", 
184                                         bpmv[i]->getName(buf, 128));
185                 return FAILED;
186         }
187
188         bpmv.clear();
189
190         if (NULL == modB->findFunction("^cbll21", bpmv, false, false, true) || (bpmv.size() != 1)) 
191         {
192                 logerror("**Failed test #21 (findFunction in module, regex)\n");
193                 logerror("  Expected 1 function matching ^cbll21, got %d\n",
194                                 bpmv.size());
195                 return FAILED;
196         }
197 #endif
198         return PASSED;    
199 #else // Not running on one of the specified platforms
200         return SKIPPED;
201 #endif
202 }
203
204
205
206 // Wrapper to call readyTest
207 test_results_t test1_21_Mutator::executeTest() 
208 {
209         int pointer_size = 0;
210 #if defined(arch_x86_64_test) || defined (ppc64_linux_test)
211
212         pointer_size = pointerSize(appImage);
213 #endif
214         strncpy(libNameA, libNameAroot, 127);
215         addLibArchExt(libNameA,127, pointer_size);
216         strncpy(libNameB, libNameBroot, 127);
217         addLibArchExt(libNameB,127, pointer_size);
218
219         char libA[128], libB[128];
220         snprintf(libA, 128, "./%s", libNameA);
221         snprintf(libB, 128, "./%s", libNameB);
222
223         if (! appAddrSpace->loadLibrary(libA)) 
224         {
225                 logerror("**Failed test #21 (findFunction in module)\n");
226                 logerror("  Mutator couldn't load %s into mutatee\n", libNameA);
227                 return FAILED;
228         }
229
230         if (! appAddrSpace->loadLibrary(libB)) 
231         {
232                 logerror("**Failed test #21 (findFunction in module)\n");
233                 logerror("  Mutator couldn't load %s into mutatee\n", libNameB);
234                 return FAILED;
235         }
236
237         return mutatorTest21();
238 }