Update copyright to LGPL on all files
[dyninst.git] / testsuite / src / test_lib_dllExecution.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_dllExecution.C,v 1.4 2008/10/30 19:16:57 legendre Exp $
33 #include "test_lib.h"
34 #include "ParameterDict.h"
35 #include "TestOutputDriver.h"
36 #include "comptester.h"
37 #include <windows.h>
38 #include <stdlib.h>
39 #include <string.h>
40 #include <stdio.h>
41
42 typedef int (*mutatorM_t)(ParameterDict &);
43 const char* ext = ".dll";
44
45 void printErrorString()
46 {
47         LPTSTR errMessage;
48         DWORD lastError = GetLastError();
49         FormatMessage(
50                 FORMAT_MESSAGE_ALLOCATE_BUFFER | 
51                 FORMAT_MESSAGE_FROM_SYSTEM |
52                 FORMAT_MESSAGE_IGNORE_INSERTS,
53                 NULL,
54                 lastError,
55                 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
56                 (LPTSTR)&errMessage,
57                 0, NULL );
58         fprintf(stderr, "(%d): %s\n", lastError, errMessage);
59         LocalFree(errMessage);
60 }
61
62 TESTLIB_DLL_EXPORT TestOutputDriver *loadOutputDriver(char *odname, void * data) {
63         std::string fname (odname);
64         fname += ext;
65
66 //      void *odhandle = dlopen(fname.str().c_str(), RTLD_NOW);
67         HINSTANCE odhandle = LoadLibrary(fname.c_str());
68         if (NULL == odhandle) {
69                 fprintf(stderr, "[%s:%u] - Error loading output driver: ", __FILE__, __LINE__);
70                 printErrorString();
71                 return NULL;
72         }
73
74         typedef TestOutputDriver * (*odfactory_t)(void *);
75 //TODO ?        dlerror();
76 //      factory = (TestOutputDriver *(*)(void *)) dlsym(odhandle, "outputDriver_factory");
77         odfactory_t factory = (odfactory_t) GetProcAddress(odhandle, "outputDriver_factory");
78 //      char *errmsg = dlerror();
79         if (factory == NULL) {
80                 // TODO Handle error
81                 fprintf(stderr, "[%s:%u] - Error loading output driver: ", __FILE__, __LINE__);
82                 printErrorString();
83                 return NULL;
84         }
85
86         TestOutputDriver *retval = factory(data);
87
88         return retval;
89 }
90
91
92 int setupMutatorsForRunGroup(RunGroup * group)
93 {
94    int tests_found = 0;
95         for (unsigned i = 0; i < group->tests.size(); i++) {
96                 if (group->tests[i]->disabled)
97                         continue;
98
99                 TestInfo *test = group->tests[i];
100                 std::string dllname = std::string(test->name) + std::string(ext);
101                 HINSTANCE handle = LoadLibrary(dllname.c_str());
102                 if (!handle) {
103                         fprintf(stderr, "Error opening lib: %s\n", dllname.c_str());
104                         printErrorString();
105                         continue;
106 //                      return -1;
107                 }
108
109                 typedef TestMutator *(*mutator_factory_t)();
110                 char mutator_name[256];
111                 const char *testname = test->mutator_name;
112                 _snprintf(mutator_name, 256, "%s_factory", testname);
113                 mutator_factory_t factory = (mutator_factory_t)GetProcAddress(handle, mutator_name);
114                 if (NULL == factory) {
115                         fprintf(stderr, "Error funding function: %s, in %s\n", mutator_name,
116                                 dllname.c_str());
117                         printErrorString();
118 //                      FreeLibrary(handle);
119 //                      return -1;
120                         continue;
121                 }
122
123                 TestMutator *mutator = factory();
124                 if (NULL == mutator) {
125                         fprintf(stderr, "Error creating new TestMutator for test %s\n",
126                         test->name);
127                 } else {
128                         test->mutator = mutator;
129          tests_found++;
130                 }
131         }
132         return tests_found;
133 }
134
135 typedef ComponentTester* (*comptester_factory_t)();
136 ComponentTester *Module::loadModuleLibrary()
137 {
138    libhandle = NULL;
139    std::string dllname = "libtest";
140    dllname += name;
141    dllname += ".dll";
142
143    HINSTANCE handle = LoadLibrary(dllname.c_str());
144    if (!handle) {
145            fprintf(stderr, "%s[%d]: Error opening library %s ", __FILE__, __LINE__, dllname.c_str());
146                 printErrorString();
147            return NULL;
148    }
149    libhandle = (void *) handle;
150    comptester_factory_t factory;
151    factory = (comptester_factory_t) GetProcAddress(handle, "componentTesterFactory");
152    if (NULL == factory) {
153            fprintf(stderr, "Error finding componentTesterFactory ", dllname.c_str());
154                 printErrorString();
155            FreeLibrary(handle);
156       return NULL;
157    }
158    
159    return factory();
160 }