xref: /haiku/src/tools/cppunit/TestApp.cpp (revision 58481f0f6ef1a61ba07283f012cafbc2ed874ead)
1aad997bdSTyler Dauwalder // TestApp.cpp
2aad997bdSTyler Dauwalder 
37e5f681fSIngo Weinhold #include <stdio.h>
4*58481f0fSOliver Tappe #include <stdlib.h>
57e5f681fSIngo Weinhold #include <string.h>
67e5f681fSIngo Weinhold 
7b229fec8SIngo Weinhold #include <Autolock.h>
8b229fec8SIngo Weinhold 
9aad997bdSTyler Dauwalder #include <TestApp.h>
10aad997bdSTyler Dauwalder 
11aad997bdSTyler Dauwalder // TestHandler
12aad997bdSTyler Dauwalder 
13aad997bdSTyler Dauwalder // MessageReceived
141b89aa98SIngo Weinhold _EXPORT
15aad997bdSTyler Dauwalder void
MessageReceived(BMessage * message)16242a6db2STyler Dauwalder BTestHandler::MessageReceived(BMessage *message)
17aad997bdSTyler Dauwalder {
18aad997bdSTyler Dauwalder 	// clone and push it
19aad997bdSTyler Dauwalder 	BMessage *clone = new BMessage(*message);
20aad997bdSTyler Dauwalder 	fQueue.Lock();
21aad997bdSTyler Dauwalder 	fQueue.AddMessage(clone);
22aad997bdSTyler Dauwalder 	fQueue.Unlock();
23aad997bdSTyler Dauwalder }
24aad997bdSTyler Dauwalder 
25aad997bdSTyler Dauwalder // Queue
261b89aa98SIngo Weinhold _EXPORT
27aad997bdSTyler Dauwalder BMessageQueue &
Queue()28242a6db2STyler Dauwalder BTestHandler::Queue()
29aad997bdSTyler Dauwalder {
30aad997bdSTyler Dauwalder 	return fQueue;
31aad997bdSTyler Dauwalder }
32aad997bdSTyler Dauwalder 
33aad997bdSTyler Dauwalder 
34aad997bdSTyler Dauwalder // TestApp
35aad997bdSTyler Dauwalder 
367e5f681fSIngo Weinhold static status_t sInitError;
377e5f681fSIngo Weinhold 
38aad997bdSTyler Dauwalder // constructor
391b89aa98SIngo Weinhold _EXPORT
BTestApp(const char * signature)40242a6db2STyler Dauwalder BTestApp::BTestApp(const char *signature)
417e5f681fSIngo Weinhold 	   : BApplication(signature, &sInitError),
42aad997bdSTyler Dauwalder 		 fAppThread(B_ERROR),
43b229fec8SIngo Weinhold 		 fHandlers()
44aad997bdSTyler Dauwalder {
457e5f681fSIngo Weinhold 	if (sInitError != B_OK) {
467e5f681fSIngo Weinhold 		fprintf(stderr, "BTestApp::BTestApp(): Failed to create BApplication: "
477e5f681fSIngo Weinhold 			"%s\n", strerror(sInitError));
487e5f681fSIngo Weinhold 		exit(1);
497e5f681fSIngo Weinhold 	}
507e5f681fSIngo Weinhold 
51b229fec8SIngo Weinhold 	CreateTestHandler();
52aad997bdSTyler Dauwalder 	Unlock();
53aad997bdSTyler Dauwalder }
54aad997bdSTyler Dauwalder 
55b229fec8SIngo Weinhold // destructor
561b89aa98SIngo Weinhold _EXPORT
~BTestApp()57b229fec8SIngo Weinhold BTestApp::~BTestApp()
58b229fec8SIngo Weinhold {
59b229fec8SIngo Weinhold 	int32 count = fHandlers.CountItems();
60b229fec8SIngo Weinhold 	for (int32 i = count - 1; i >= 0; i--)
61b229fec8SIngo Weinhold 		DeleteTestHandler(TestHandlerAt(i));
62b229fec8SIngo Weinhold }
63b229fec8SIngo Weinhold 
64aad997bdSTyler Dauwalder // Init
651b89aa98SIngo Weinhold _EXPORT
66aad997bdSTyler Dauwalder status_t
Init()67242a6db2STyler Dauwalder BTestApp::Init()
68aad997bdSTyler Dauwalder {
69aad997bdSTyler Dauwalder 	status_t error = B_OK;
70aad997bdSTyler Dauwalder 	fAppThread = spawn_thread(&_AppThreadStart, "query app",
71aad997bdSTyler Dauwalder 							  B_NORMAL_PRIORITY, this);
72aad997bdSTyler Dauwalder 	if (fAppThread < 0)
73aad997bdSTyler Dauwalder 		error = fAppThread;
74aad997bdSTyler Dauwalder 	else {
75aad997bdSTyler Dauwalder 		error = resume_thread(fAppThread);
76aad997bdSTyler Dauwalder 		if (error != B_OK)
77aad997bdSTyler Dauwalder 			kill_thread(fAppThread);
78aad997bdSTyler Dauwalder 	}
79aad997bdSTyler Dauwalder 	if (error != B_OK)
80aad997bdSTyler Dauwalder 		fAppThread = B_ERROR;
81aad997bdSTyler Dauwalder 	return error;
82aad997bdSTyler Dauwalder }
83aad997bdSTyler Dauwalder 
84aad997bdSTyler Dauwalder // Terminate
851b89aa98SIngo Weinhold _EXPORT
86aad997bdSTyler Dauwalder void
Terminate()87242a6db2STyler Dauwalder BTestApp::Terminate()
88aad997bdSTyler Dauwalder {
89aad997bdSTyler Dauwalder 	PostMessage(B_QUIT_REQUESTED, this);
90aad997bdSTyler Dauwalder 	int32 result;
91aad997bdSTyler Dauwalder 	wait_for_thread(fAppThread, &result);
92aad997bdSTyler Dauwalder }
93aad997bdSTyler Dauwalder 
94aad997bdSTyler Dauwalder // ReadyToRun
951b89aa98SIngo Weinhold _EXPORT
96aad997bdSTyler Dauwalder void
ReadyToRun()97242a6db2STyler Dauwalder BTestApp::ReadyToRun()
98aad997bdSTyler Dauwalder {
99aad997bdSTyler Dauwalder }
100aad997bdSTyler Dauwalder 
101b229fec8SIngo Weinhold // CreateTestHandler
1021b89aa98SIngo Weinhold _EXPORT
103b229fec8SIngo Weinhold BTestHandler *
CreateTestHandler()104b229fec8SIngo Weinhold BTestApp::CreateTestHandler()
105b229fec8SIngo Weinhold {
106b229fec8SIngo Weinhold 	BTestHandler *handler = new BTestHandler;
107b229fec8SIngo Weinhold 	Lock();
108b229fec8SIngo Weinhold 	AddHandler(handler);
109b229fec8SIngo Weinhold 	fHandlers.AddItem(handler);
110b229fec8SIngo Weinhold 	Unlock();
111b229fec8SIngo Weinhold 	return handler;
112b229fec8SIngo Weinhold }
113b229fec8SIngo Weinhold 
114b229fec8SIngo Weinhold // DeleteTestHandler
1151b89aa98SIngo Weinhold _EXPORT
116b229fec8SIngo Weinhold bool
DeleteTestHandler(BTestHandler * handler)117b229fec8SIngo Weinhold BTestApp::DeleteTestHandler(BTestHandler *handler)
118b229fec8SIngo Weinhold {
119b229fec8SIngo Weinhold 	bool result = false;
120b229fec8SIngo Weinhold 	Lock();
121b229fec8SIngo Weinhold 	result = fHandlers.RemoveItem(handler);
122b229fec8SIngo Weinhold 	if (result)
123b229fec8SIngo Weinhold 		RemoveHandler(handler);
124b229fec8SIngo Weinhold 	Unlock();
125b229fec8SIngo Weinhold 	if (result)
126b229fec8SIngo Weinhold 		delete handler;
127b229fec8SIngo Weinhold 	return result;
128b229fec8SIngo Weinhold }
129b229fec8SIngo Weinhold 
130aad997bdSTyler Dauwalder // Handler
1311b89aa98SIngo Weinhold _EXPORT
132242a6db2STyler Dauwalder BTestHandler &
Handler()133242a6db2STyler Dauwalder BTestApp::Handler()
134aad997bdSTyler Dauwalder {
135b229fec8SIngo Weinhold 	// The returned handler must never passed to DeleteTestHandler() by the
136b229fec8SIngo Weinhold 	// caller!
137b229fec8SIngo Weinhold 	return *TestHandlerAt(0);
138b229fec8SIngo Weinhold }
139b229fec8SIngo Weinhold 
140b229fec8SIngo Weinhold // TestHandlerAt
1411b89aa98SIngo Weinhold _EXPORT
142b229fec8SIngo Weinhold BTestHandler *
TestHandlerAt(int32 index)143b229fec8SIngo Weinhold BTestApp::TestHandlerAt(int32 index)
144b229fec8SIngo Weinhold {
145b229fec8SIngo Weinhold 	BAutolock _lock(this);
146b229fec8SIngo Weinhold 	return (BTestHandler*)fHandlers.ItemAt(index);
147aad997bdSTyler Dauwalder }
148aad997bdSTyler Dauwalder 
149aad997bdSTyler Dauwalder // _AppThreadStart
1501b89aa98SIngo Weinhold _EXPORT
151aad997bdSTyler Dauwalder int32
_AppThreadStart(void * data)152242a6db2STyler Dauwalder BTestApp::_AppThreadStart(void *data)
153aad997bdSTyler Dauwalder {
154242a6db2STyler Dauwalder 	if (BTestApp *app = (BTestApp*)data) {
155aad997bdSTyler Dauwalder 		app->Lock();
156aad997bdSTyler Dauwalder 		app->Run();
157aad997bdSTyler Dauwalder 	}
158aad997bdSTyler Dauwalder 	return 0;
159aad997bdSTyler Dauwalder }
160aad997bdSTyler Dauwalder 
161