1
#include <test-pluginclasshandler.h>
5
typedef PluginClassHandler<IndexesPlugin, Base> IPBHandler;
11
IndexesPlugin (Base *);
16
typedef PluginClassHandler<IndexesPlugin2, Base> IPB2Handler;
17
class IndexesPlugin2 :
22
IndexesPlugin2 (Base *);
26
typedef PluginClassHandler<IndexesPlugin3, Base> IPB3Handler;
27
class IndexesPlugin3 :
32
IndexesPlugin3 (Base *);
36
public PluginClassStorage
41
virtual ~FailingBase ();
43
static unsigned int allocPluginClassIndex ();
44
static void freePluginClassIndex (unsigned int index);
47
class FailingIndexesPlugin;
48
typedef PluginClassHandler<FailingIndexesPlugin, FailingBase> FIPBHandler;
49
class FailingIndexesPlugin :
53
FailingIndexesPlugin (FailingBase *);
57
FailingBase::allocPluginClassIndex ()
60
return (unsigned int) ~0;
64
FailingBase::freePluginClassIndex (unsigned int index)
66
/* Does nothing, since this base is made of fail */
69
FailingBase::FailingBase () :
70
PluginClassStorage (globalPluginClassIndices)
74
FailingBase::~FailingBase ()
78
IndexesPlugin::IndexesPlugin (Base *base):
84
IndexesPlugin::~IndexesPlugin ()
88
IndexesPlugin2::IndexesPlugin2 (Base *base):
94
IndexesPlugin3::IndexesPlugin3 (Base *base):
101
FailingIndexesPlugin::FailingIndexesPlugin (FailingBase *base):
106
CompizPCHTestIndexes::CompizPCHTestIndexes (Global *g) :
111
template <typename I>
113
CompizPCHTestIndexes::printFailure (I *i)
115
std::cout << "FAIL: index value does not match!" << std::endl;
116
std::cout << "INFO: Values of " << std::hex << (void *) i << " are " << std::endl;
117
std::cout << "INFO: pluginClassHandlerIndex is " << pluginClassHandlerIndex << std::endl;
118
std::cout << "INFO: mIndex.index " << i->mIndex.index << std::endl;
119
std::cout << "INFO: mIndex.refCount " << i->mIndex.refCount << std::endl;
120
std::cout << "INFO: mIndex.initiated " << i->mIndex.initiated << std::endl;
121
std::cout << "INFO: mIndex.failed " << i->mIndex.failed << std::endl;
122
std::cout << "INFO: mIndex.pcFailed " << i->mIndex.pcFailed << std::endl;
123
std::cout << "INFO: mIndex.pcIndex " << i->mIndex.pcIndex << std::endl;
124
std::cout << "INFO: loadFailed " << (i->loadFailed () ? 1 : 0) << std::endl;
125
std::cout << "INFO: Values of " << std::hex << (void *) i << " should be " << std::endl;
126
std::cout << "INFO: pluginClassHandlerIndex is " << ePluginClassHandlerIndex << std::endl;
127
std::cout << "INFO: mIndex.index " << eIndex << std::endl;
128
std::cout << "INFO: mIndex.refCount " << eRefCount << std::endl;
129
std::cout << "INFO: mIndex.initiated " << eInitiated << std::endl;
130
std::cout << "INFO: mIndex.failed " << eFailed << std::endl;
131
std::cout << "INFO: mIndex.pcFailed " << ePcFailed << std::endl;
132
std::cout << "INFO: mIndex.pcIndex " << ePcIndex << std::endl;
133
std::cout << "INFO: loadFailed " << (eLoadFailed ? 1 : 0) << std::endl;
136
#define INDEX_INCORRECT(i) \
137
pluginClassHandlerIndex != ePluginClassHandlerIndex || \
138
i->mIndex.index != eIndex || \
139
i->mIndex.refCount != eRefCount || \
140
i->mIndex.initiated != eInitiated || \
141
i->mIndex.failed != eFailed || \
142
i->mIndex.pcFailed != ePcFailed || \
143
i->mIndex.pcIndex != ePcIndex
146
CompizPCHTestIndexes::run ()
151
FailingIndexesPlugin *fp;
152
IPBHandler *ipbhandler_p;
153
IPB2Handler *ipbhandler_p2;
154
IPB3Handler *ipbhandler_p3;
155
FIPBHandler *fipbhandler_p;
157
std::cout << "-= TEST: Index Sanity" << std::endl;
159
bases.push_back (new Base ());
160
plugins.push_back (new IndexesPlugin (bases.back ()));
163
ipbhandler_p = (IPBHandler *) p;
165
std::cout << "STEP: to base #1 plugin #1(1) " << plugins.size () << std::endl;
167
ePluginClassHandlerIndex = 1;
176
if (INDEX_INCORRECT (ipbhandler_p))
178
printFailure<IPBHandler> (ipbhandler_p);
182
bases.push_back (new Base ());
183
plugins.push_back (new IndexesPlugin (bases.back ()));
186
ipbhandler_p = (IPBHandler *) p;
188
std::cout << "STEP: to base #3 plugin #1(2) " << plugins.size () << std::endl;
189
ePluginClassHandlerIndex = 1;
198
if (INDEX_INCORRECT (ipbhandler_p))
200
printFailure<IPBHandler> (ipbhandler_p);
204
bases.push_back (new Base ());
205
plugins.push_back (new IndexesPlugin2 (bases.back ()));
208
ipbhandler_p2 = (IPB2Handler *) p;
210
std::cout << "STEP: to base #3 plugin #2(1) " << plugins.size () << std::endl;
211
ePluginClassHandlerIndex = 2;
220
if (INDEX_INCORRECT (ipbhandler_p2))
222
printFailure<IPB2Handler> (ipbhandler_p2);
234
ipbhandler_p = (IPBHandler *) p;
236
std::cout << "STEP: back to base #2 plugin #1(2) " << plugins.size () << std::endl;
237
ePluginClassHandlerIndex = 3;
246
if (INDEX_INCORRECT (ipbhandler_p))
248
printFailure<IPBHandler> (ipbhandler_p);
260
ipbhandler_p = (IPBHandler *) p;
262
std::cout << "STEP: back to base #1 plugin #1(1) " << plugins.size () << std::endl;
263
ePluginClassHandlerIndex = 3;
272
if (INDEX_INCORRECT (ipbhandler_p))
274
printFailure<IPBHandler> (ipbhandler_p);
278
p = IndexesPlugin::get (bases.back ());
279
ipbhandler_p = (IPBHandler *) p;
281
std::cout << "STEP: back to base #1 plugin #1(1) ::get " << plugins.size () << std::endl;
282
ePluginClassHandlerIndex = 3;
291
if (INDEX_INCORRECT (ipbhandler_p))
293
printFailure<IPBHandler> (ipbhandler_p);
297
bases.push_back (new Base ());
298
plugins.push_back (new IndexesPlugin3 (bases.back ()));
301
ipbhandler_p3 = (IPB3Handler *) p;
303
std::cout << "STEP: to base #2 plugin #3(1) (load failing plugin) " << plugins.size () << std::endl;
304
ePluginClassHandlerIndex = 4;
314
* This seems to be broken on some compilers
315
* disable this test for now
317
* if (INDEX_INCORRECT (ipbhandler_p3))
319
* printFailure<IPB3Handler> (ipbhandler_p3);
323
bases.push_back (new Base ());
324
plugins.push_back (new IndexesPlugin (bases.back ()));
327
ipbhandler_p = (IPBHandler *) p;
329
std::cout << "STEP: to base #2 plugin #1(2) (failing key) " << plugins.size () << std::endl;
330
ePluginClassHandlerIndex = 4;
339
if (INDEX_INCORRECT (ipbhandler_p))
341
printFailure<IPBHandler> (ipbhandler_p);
345
plugins.push_back (new IndexesPlugin2 (bases.back ()));
348
ipbhandler_p2 = (IPB2Handler *) p;
350
std::cout << "STEP: to base #1 plugin #2(1) (failing key) " << plugins.size () << std::endl;
351
ePluginClassHandlerIndex = 5;
360
if (INDEX_INCORRECT (ipbhandler_p2))
362
printFailure<IPB2Handler> (ipbhandler_p2);
366
/* Now call ::get on the first one to reset the pluginClassHandlerIndex */
367
p = IndexesPlugin::get (bases.back ());
368
ipbhandler_p = (IPBHandler *) p;
370
std::cout << "STEP: to base #1 plugin #1(2) (failing key - after get) " << plugins.size () << std::endl;
371
ePluginClassHandlerIndex = 5;
380
if (INDEX_INCORRECT (ipbhandler_p))
382
printFailure<IPBHandler> (ipbhandler_p);
386
/* Now erase the key that was used by the second plugin so subsequent attempts to ::get
390
ipbhandler_p2 = (IPB2Handler *) p;
391
ValueHolder::Default ()->eraseValue (ipbhandler_p2->keyName ());
392
p = IndexesPlugin2::get (bases.back ());
394
std::cout << "STEP: to base #1 plugin #2(1) (failing key - after erasure) " << plugins.size () << std::endl;
395
ePluginClassHandlerIndex = 5;
404
if (INDEX_INCORRECT (ipbhandler_p2))
406
printFailure<IPB2Handler> (ipbhandler_p2);
410
fb = new FailingBase ();
411
fp = new FailingIndexesPlugin (fb);
412
fipbhandler_p = (FIPBHandler *) fp;
414
std::cout << "STEP: to base #3 (failing base) plugin #1(2) " << plugins.size () << std::endl;
415
ePluginClassHandlerIndex = 5;
424
if (INDEX_INCORRECT (fipbhandler_p))
426
printFailure<FIPBHandler> (fipbhandler_p);
433
std::cout << "PASS: Index Sanity" << std::endl;