9 TestSupportCode::TestSupportCode ( const Project
& project
)
14 TestSupportCode::~TestSupportCode ()
19 TestSupportCode::IsTestModule ( const Module
& module
)
21 return module
.type
== Test
;
25 TestSupportCode::GenerateTestSupportCode ( bool verbose
)
27 for ( size_t i
= 0; i
< project
.modules
.size (); i
++ )
29 if ( IsTestModule ( *project
.modules
[i
] ) )
31 GenerateTestSupportCodeForModule ( *project
.modules
[i
],
38 TestSupportCode::GenerateTestSupportCodeForModule ( Module
& module
,
43 printf ( "\nGenerating test support code for %s",
44 module
.name
.c_str () );
47 WriteHooksFile ( module
);
48 WriteStubsFile ( module
);
52 TestSupportCode::GetHooksFilename ( Module
& module
)
54 return NormalizeFilename ( Environment::GetIntermediatePath () + SSEP
+ module
.GetBasePath () + SSEP
+ "_hooks.c" );
58 TestSupportCode::WriteStubbedSymbolToHooksFile ( char* buffer
,
59 const StubbedComponent
& component
,
60 const StubbedSymbol
& symbol
)
62 buffer
= buffer
+ sprintf ( buffer
,
63 " {\"%s\", \"%s\", NULL, NULL, NULL},\n",
64 component
.name
.c_str (),
65 symbol
.strippedName
.c_str () );
70 TestSupportCode::WriteStubbedComponentToHooksFile ( char* buffer
,
71 const StubbedComponent
& component
)
73 for ( size_t i
= 0; i
< component
.symbols
.size () ; i
++ )
74 buffer
= WriteStubbedSymbolToHooksFile ( buffer
,
76 *component
.symbols
[i
] );
81 TestSupportCode::WriteHooksFile ( Module
& module
)
86 buf
= (char*) malloc ( 50*1024 );
88 throw OutOfMemoryException ();
91 s
= s
+ sprintf ( s
, "/* This file is automatically generated. */\n" );
92 s
= s
+ sprintf ( s
, "#include <windows.h>\n" );
93 s
= s
+ sprintf ( s
, "#include \"regtests.h\"\n" );
94 s
= s
+ sprintf ( s
, "\n" );
95 s
= s
+ sprintf ( s
, "API_DESCRIPTION ExternalDependencies[] =\n" );
96 s
= s
+ sprintf ( s
, "{\n" );
99 for ( size_t i
= 0; i
< module
.stubbedComponents
.size () ; i
++ )
101 s
= WriteStubbedComponentToHooksFile ( s
,
102 *module
.stubbedComponents
[i
] );
103 symbolCount
+= module
.stubbedComponents
[i
]->symbols
.size ();
106 s
= s
+ sprintf ( s
, "};\n" );
107 s
= s
+ sprintf ( s
, "\n" );
108 s
= s
+ sprintf ( s
, "#define ExternalDependencyCount %d\n", symbolCount
);
109 s
= s
+ sprintf ( s
, "ULONG MaxExternalDependency = ExternalDependencyCount - 1;\n" );
110 s
= s
+ sprintf ( s
, "\n" );
112 FileSupportCode::WriteIfChanged ( buf
, GetHooksFilename ( module
) );
118 TestSupportCode::GetStubsFilename ( Module
& module
)
120 return NormalizeFilename ( Environment::GetIntermediatePath () + SSEP
+ module
.GetBasePath () + SSEP
+ "_stubs.S" );
124 TestSupportCode::WriteStubbedSymbolToStubsFile ( char* buffer
,
125 const StubbedComponent
& component
,
126 const StubbedSymbol
& symbol
,
129 buffer
= buffer
+ sprintf ( buffer
,
131 symbol
.symbol
.c_str () );
132 buffer
= buffer
+ sprintf ( buffer
,
134 symbol
.symbol
.c_str () );
135 buffer
= buffer
+ sprintf ( buffer
,
138 buffer
= buffer
+ sprintf ( buffer
,
139 " jmp passthrough\n" );
140 buffer
= buffer
+ sprintf ( buffer
, "\n" );
145 TestSupportCode::WriteStubbedComponentToStubsFile ( char* buffer
,
146 const StubbedComponent
& component
,
149 for ( size_t i
= 0; i
< component
.symbols
.size () ; i
++ )
150 buffer
= WriteStubbedSymbolToStubsFile ( buffer
,
152 *component
.symbols
[i
],
158 TestSupportCode::WriteStubsFile ( Module
& module
)
163 buf
= (char*) malloc ( 50*1024 );
165 throw OutOfMemoryException ();
168 s
= s
+ sprintf ( s
, "/* This file is automatically generated. */\n" );
169 s
= s
+ sprintf ( s
, "passthrough:\n" );
170 s
= s
+ sprintf ( s
, " call _FrameworkGetHook@4\n" );
171 s
= s
+ sprintf ( s
, " test %%eax, %%eax\n" );
172 s
= s
+ sprintf ( s
, " je .return\n" );
173 s
= s
+ sprintf ( s
, " jmp *%%eax\n" );
174 s
= s
+ sprintf ( s
, ".return:\n" );
175 s
= s
+ sprintf ( s
, " /* This will most likely corrupt the stack */\n" );
176 s
= s
+ sprintf ( s
, " ret\n" );
177 s
= s
+ sprintf ( s
, "\n" );
180 for ( size_t i
= 0; i
< module
.stubbedComponents
.size () ; i
++ )
182 s
= WriteStubbedComponentToStubsFile ( s
,
183 *module
.stubbedComponents
[i
],
187 FileSupportCode::WriteIfChanged ( buf
, GetStubsFilename ( module
) );