Update copyright to LGPL on all files
[dyninst.git] / testsuite / src / test_lib_soExecution.C
1 /*
2  * Copyright (c) 1996-2009 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  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 // $Id: test_lib_soExecution.C,v 1.5 2008/10/30 19:16:58 legendre Exp $
33
34 #include <sstream>
35
36 #include <dlfcn.h>
37 #include <stdio.h>
38 #include <stdlib.h>
39
40 #include "test_lib.h"
41 #include "ParameterDict.h"
42
43 #include "TestOutputDriver.h"
44 #include "TestMutator.h"
45 #include "test_info_new.h"
46 #include "comptester.h"
47
48 TESTLIB_DLL_EXPORT TestOutputDriver *loadOutputDriver(char *odname, void * data) {
49   std::stringstream fname;
50   fname << odname << ".so";
51
52   void *odhandle = dlopen(fname.str().c_str(), RTLD_NOW);
53   if (NULL == odhandle) {
54     fprintf(stderr, "[%s:%u] - Error loading output driver: '%s'\n", __FILE__, __LINE__, dlerror());
55     return NULL;
56   }
57
58   TestOutputDriver *(*factory)(void *);
59   dlerror();
60   factory = (TestOutputDriver *(*)(void *)) dlsym(odhandle, "outputDriver_factory");
61   char *errmsg = dlerror();
62   if (errmsg != NULL) {
63     // TODO Handle error
64     fprintf(stderr, "[%s:%u] - Error loading output driver: '%s'\n", __FILE__, __LINE__, errmsg);
65     return NULL;
66   }
67
68   TestOutputDriver *retval = factory(data);
69
70   return retval;
71 }
72
73 static void* openSO(const char *soname)
74 {
75    char *fullSoPath;
76 #if defined(os_aix_test)
77    fullSoPath = searchPath(getenv("LIBPATH"), soname);
78 #else
79    fullSoPath = searchPath(getenv("LD_LIBRARY_PATH"), soname);
80 #endif
81    
82    if (!fullSoPath) {
83       return NULL; // Error
84    }
85    void *handle = dlopen(fullSoPath, RTLD_NOW);
86    ::free(fullSoPath);
87    if (!handle) {
88        fprintf(stderr, "Error opening lib: %s\n", soname);
89       fprintf(stderr, "%s\n", dlerror());
90       return NULL; //Error
91    }
92    return handle;
93 }
94
95 int setupMutatorsForRunGroup(RunGroup *group)
96 {
97   int tests_found = 0;
98   for (int i = 0; i < group->tests.size(); i++) {
99     if (group->tests[i]->disabled)
100        continue;
101     TestInfo *test = group->tests[i];
102     const char *soname = test->soname;
103
104     void *handle = openSO(soname);
105     if (!handle) {
106        getOutput()->log(STDERR, "Couldn't open %s\n", soname);
107        return -1;
108     }
109
110     typedef TestMutator *(*mutator_factory_t)();
111     char mutator_name[256];
112     const char *testname = test->mutator_name;
113     snprintf(mutator_name, 256, "%s_factory", testname);
114     mutator_factory_t factory = (mutator_factory_t) dlsym(handle,
115                                                           mutator_name);
116     if (NULL == factory) {
117       fprintf(stderr, "Error finding function: %s, in %s\n", mutator_name,
118               soname);
119       fprintf(stderr, "%s\n", dlerror());
120       dlclose(handle);
121       return -1; //Error
122     }
123
124     TestMutator *mutator = factory();
125     if (NULL == mutator) {
126       fprintf(stderr, "Error creating new TestMutator for test %s\n",
127               test->name);
128     } else {
129       test->mutator = mutator;
130       tests_found++;
131     }
132   }
133   return tests_found; // No error
134 } // setupMutatorsForRunGroup
135
136 typedef ComponentTester* (*comptester_factory_t)();
137 ComponentTester *Module::loadModuleLibrary()
138 {
139    libhandle = NULL;
140    char libname[256];
141 #if defined(os_aix_test)
142    snprintf(libname, 256, "libtest%s.a", name.c_str());
143 #else   
144    snprintf(libname, 256, "libtest%s.so", name.c_str());
145 #endif
146    //TODO: Open the so that goes with this group.
147    libhandle = openSO(libname);
148    if (!libhandle)
149       return NULL;
150
151    comptester_factory_t factory;
152    factory = (comptester_factory_t) dlsym(libhandle, "componentTesterFactory");
153    if (!factory)
154    {
155       fprintf(stderr, "Error finding componentTesterFactory\n");
156       return NULL;
157    }
158
159    return factory();
160 }