Added tests for BApplication::Quit()/QuitRequested().

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@574 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2002-08-05 00:37:55 +00:00
parent 91363a4278
commit ff952bade4
16 changed files with 637 additions and 59 deletions
+2
View File
@@ -12,6 +12,8 @@ CommonTestLib libapptest.so
# BApplication # BApplication
ApplicationTest.cpp ApplicationTest.cpp
AppQuitRequestedTester.cpp
AppQuitTester.cpp
AppRunner.cpp AppRunner.cpp
AppRunTester.cpp AppRunTester.cpp
BApplicationTester.cpp BApplicationTester.cpp
@@ -0,0 +1,84 @@
//------------------------------------------------------------------------------
// AppQuitRequestedTester.cpp
//
//------------------------------------------------------------------------------
// Standard Includes -----------------------------------------------------------
#include <stdio.h>
// System Includes -------------------------------------------------------------
#include <be/app/Message.h>
#include <be/kernel/OS.h>
#include <Application.h>
#include <Handler.h>
#include <Looper.h>
#include <String.h>
// Project Includes ------------------------------------------------------------
#include <TestShell.h>
#include <TestUtils.h>
#include <cppunit/TestAssert.h>
// Local Includes --------------------------------------------------------------
#include "AppRunner.h"
#include "AppQuitRequestedTester.h"
// Local Defines ---------------------------------------------------------------
// Globals ---------------------------------------------------------------------
//------------------------------------------------------------------------------
// check_output
static
void
check_output(AppRunner &runner, const char *expectedOutput)
{
BString buffer;
CHK(runner.GetOutput(&buffer) == B_OK);
if (buffer != expectedOutput)
printf("result is `%s', but should be `%s'\n", buffer.String(),
expectedOutput);
CHK(buffer == expectedOutput);
}
/*
bool QuitRequested()
@case 1 return false the first time, true the second time it is
invoked
@results Should not quit after the first time, but after the
second one.
*/
void AppQuitRequestedTester::QuitRequestedTest1()
{
BApplication app("application/x-vnd.obos-app-quit-requested-test");
const char *output =
"error: 0\n"
"InitCheck(): 0\n"
"BApplication::ReadyToRun()\n"
"BApplication::QuitRequested()\n"
"BApplication::QuitRequested()\n"
"BApplication::Run() done: 1\n"
"BApplication::~BApplication()\n";
// run the app
AppRunner runner;
CHK(runner.Run("AppQuitRequestedTestApp1") == B_OK);
runner.WaitFor(false);
// get the output and compare the result
check_output(runner, output);
}
Test* AppQuitRequestedTester::Suite()
{
TestSuite* SuiteOfTests = new TestSuite;
ADD_TEST4(BApplication, SuiteOfTests, AppQuitRequestedTester,
QuitRequestedTest1);
return SuiteOfTests;
}
@@ -0,0 +1,34 @@
//------------------------------------------------------------------------------
// AppQuitRequestedTester.h
//
//------------------------------------------------------------------------------
#ifndef APP_QUIT_REQUESTED_TESTER_H
#define APP_QUIT_REQUESTED_TESTER_H
// Standard Includes -----------------------------------------------------------
// System Includes -------------------------------------------------------------
// Project Includes ------------------------------------------------------------
// Local Includes --------------------------------------------------------------
#include "../common.h"
// Local Defines ---------------------------------------------------------------
// Globals ---------------------------------------------------------------------
class AppQuitRequestedTester : public TestCase
{
public:
AppQuitRequestedTester() {;}
AppQuitRequestedTester(std::string name) : TestCase(name) {;}
void QuitRequestedTest1();
static Test* Suite();
};
#endif // APP_QUIT_REQUESTED_TESTER_H
@@ -0,0 +1,166 @@
//------------------------------------------------------------------------------
// AppQuitTester.cpp
//
//------------------------------------------------------------------------------
// Standard Includes -----------------------------------------------------------
#include <stdio.h>
// System Includes -------------------------------------------------------------
#include <be/app/Message.h>
#include <be/kernel/OS.h>
#include <Application.h>
#include <Handler.h>
#include <Looper.h>
#include <String.h>
// Project Includes ------------------------------------------------------------
#include <TestShell.h>
#include <TestUtils.h>
#include <cppunit/TestAssert.h>
// Local Includes --------------------------------------------------------------
#include "AppRunner.h"
#include "AppQuitTester.h"
#include "PipedAppRunner.h"
// Local Defines ---------------------------------------------------------------
// Globals ---------------------------------------------------------------------
//------------------------------------------------------------------------------
// check_output
template<typename AppRunnerC>
static
void
check_output(AppRunnerC &runner, const char *expectedOutput)
{
BString buffer;
CHK(runner.GetOutput(&buffer) == B_OK);
if (buffer != expectedOutput)
printf("result is `%s', but should be `%s'\n", buffer.String(),
expectedOutput);
CHK(buffer == expectedOutput);
}
/*
void Quit()
@case 1 not running application
@results Should delete the application object.
*/
void AppQuitTester::QuitTest1()
{
BApplication app("application/x-vnd.obos-app-quit-test");
const char *output =
"error: 0\n"
"InitCheck(): 0\n"
"BApplication::~BApplication()\n";
// run the apps
AppRunner runner;
CHK(runner.Run("AppQuitTestApp1") == B_OK);
runner.WaitFor(false);
// get the output and compare the result
check_output(runner, output);
}
/*
void Quit()
@case 2 running application, call from looper thread
@results Run() should return. Should not delete the application
object.
*/
void AppQuitTester::QuitTest2()
{
BApplication app("application/x-vnd.obos-app-quit-test");
const char *output =
"error: 0\n"
"InitCheck(): 0\n"
"BApplication::ReadyToRun()\n"
"BApplication::Run() done: 1\n"
"BApplication::~BApplication()\n";
// run the apps
AppRunner runner;
CHK(runner.Run("AppQuitTestApp2") == B_OK);
runner.WaitFor(false);
// get the output and compare the result
check_output(runner, output);
}
/*
void Quit()
@case 3 running application, call from other thread
@results Run() should return. Should not delete the application
object.
*/
void AppQuitTester::QuitTest3()
{
BApplication app("application/x-vnd.obos-app-quit-test");
const char *output =
"error: 0\n"
"InitCheck(): 0\n"
"BApplication::ReadyToRun()\n"
"BApplication::Run() done: 1\n"
"BApplication::~BApplication()\n";
// run the apps
AppRunner runner;
CHK(runner.Run("AppQuitTestApp3") == B_OK);
runner.WaitFor(false);
// get the output and compare the result
check_output(runner, output);
}
/*
void Quit()
@case 4 running application, call from other thread, but don't
lock before
@results Should print error message, but proceed anyway.
Run() should return.
Should not delete the application object.
*/
void AppQuitTester::QuitTest4()
{
BApplication app("application/x-vnd.obos-app-quit-test");
const char *output =
"error: 0\n"
"InitCheck(): 0\n"
"BApplication::ReadyToRun()\n"
"BApplication::Run() done: 1\n"
"BApplication::~BApplication()\n";
// run the apps
PipedAppRunner runner;
CHK(runner.Run("AppQuitTestApp4") == B_OK);
runner.WaitFor();
// get the output and compare the result
BString buffer;
CHK(runner.GetOutput(&buffer) == B_OK);
// Remove the error message, as it contains the team ID, which we don't
// know.
int32 errorIndex = buffer.FindFirst(
"ERROR - you must Lock the application object before calling Quit()");
CHK(errorIndex >= 0);
int32 errorEnd = buffer.FindFirst('\n', errorIndex);
CHK(errorEnd >= 0);
buffer.Remove(errorIndex, errorEnd - errorIndex + 1);
if (buffer != output)
printf("result is `%s', but should be `%s'\n", buffer.String(),
output);
CHK(buffer == output);
}
Test* AppQuitTester::Suite()
{
TestSuite* SuiteOfTests = new TestSuite;
ADD_TEST4(BApplication, SuiteOfTests, AppQuitTester, QuitTest1);
ADD_TEST4(BApplication, SuiteOfTests, AppQuitTester, QuitTest2);
ADD_TEST4(BApplication, SuiteOfTests, AppQuitTester, QuitTest3);
ADD_TEST4(BApplication, SuiteOfTests, AppQuitTester, QuitTest4);
return SuiteOfTests;
}
@@ -0,0 +1,37 @@
//------------------------------------------------------------------------------
// AppQuitTester.h
//
//------------------------------------------------------------------------------
#ifndef APP_QUIT_TESTER_H
#define APP_QUIT_TESTER_H
// Standard Includes -----------------------------------------------------------
// System Includes -------------------------------------------------------------
// Project Includes ------------------------------------------------------------
// Local Includes --------------------------------------------------------------
#include "../common.h"
// Local Defines ---------------------------------------------------------------
// Globals ---------------------------------------------------------------------
class AppQuitTester : public TestCase
{
public:
AppQuitTester() {;}
AppQuitTester(std::string name) : TestCase(name) {;}
void QuitTest1();
void QuitTest2();
void QuitTest3();
void QuitTest4();
static Test* Suite();
};
#endif // APP_QUIT_TESTER_H
@@ -64,7 +64,6 @@ void AppRunTester::RunTest1()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp1") == B_OK); CHK(runner1.Run("AppRunTestApp1") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp1") == B_OK); CHK(runner2.Run("AppRunTestApp1") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -103,7 +102,6 @@ void AppRunTester::RunTest2()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp1", "a b") == B_OK); CHK(runner1.Run("AppRunTestApp1", "a b") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp1", "c d e") == B_OK); CHK(runner2.Run("AppRunTestApp1", "c d e") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -132,7 +130,6 @@ void AppRunTester::RunTest3()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp2") == B_OK); CHK(runner1.Run("AppRunTestApp2") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp2") == B_OK); CHK(runner2.Run("AppRunTestApp2") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -170,7 +167,6 @@ void AppRunTester::RunTest4()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp2", "a b") == B_OK); CHK(runner1.Run("AppRunTestApp2", "a b") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp2", "c d e") == B_OK); CHK(runner2.Run("AppRunTestApp2", "c d e") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -201,7 +197,6 @@ void AppRunTester::RunTest5()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp3") == B_OK); CHK(runner1.Run("AppRunTestApp3") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp3") == B_OK); CHK(runner2.Run("AppRunTestApp3") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -234,7 +229,6 @@ void AppRunTester::RunTest6()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp3", "a b") == B_OK); CHK(runner1.Run("AppRunTestApp3", "a b") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp3", "c d e") == B_OK); CHK(runner2.Run("AppRunTestApp3", "c d e") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -265,7 +259,6 @@ void AppRunTester::RunTest7()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp4") == B_OK); CHK(runner1.Run("AppRunTestApp4") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp4") == B_OK); CHK(runner2.Run("AppRunTestApp4") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -301,7 +294,6 @@ void AppRunTester::RunTest8()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp4", "a b") == B_OK); CHK(runner1.Run("AppRunTestApp4", "a b") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp4", "c d e") == B_OK); CHK(runner2.Run("AppRunTestApp4", "c d e") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -331,7 +323,6 @@ void AppRunTester::RunTest9()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp3") == B_OK); CHK(runner1.Run("AppRunTestApp3") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp3a") == B_OK); CHK(runner2.Run("AppRunTestApp3a") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -370,7 +361,6 @@ void AppRunTester::RunTest10()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp3", "a b") == B_OK); CHK(runner1.Run("AppRunTestApp3", "a b") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp3a", "c d e") == B_OK); CHK(runner2.Run("AppRunTestApp3a", "c d e") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -400,7 +390,6 @@ void AppRunTester::RunTest11()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp4") == B_OK); CHK(runner1.Run("AppRunTestApp4") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp4a") == B_OK); CHK(runner2.Run("AppRunTestApp4a") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -439,7 +428,6 @@ void AppRunTester::RunTest12()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp4", "a b") == B_OK); CHK(runner1.Run("AppRunTestApp4", "a b") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp4a", "c d e") == B_OK); CHK(runner2.Run("AppRunTestApp4a", "c d e") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -470,7 +458,6 @@ void AppRunTester::RunTest13()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp5") == B_OK); CHK(runner1.Run("AppRunTestApp5") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp5") == B_OK); CHK(runner2.Run("AppRunTestApp5") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -503,7 +490,6 @@ void AppRunTester::RunTest14()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp5", "a b") == B_OK); CHK(runner1.Run("AppRunTestApp5", "a b") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp5", "c d e") == B_OK); CHK(runner2.Run("AppRunTestApp5", "c d e") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -534,7 +520,6 @@ void AppRunTester::RunTest15()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp6") == B_OK); CHK(runner1.Run("AppRunTestApp6") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp6") == B_OK); CHK(runner2.Run("AppRunTestApp6") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -570,7 +555,6 @@ void AppRunTester::RunTest16()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp6", "a b") == B_OK); CHK(runner1.Run("AppRunTestApp6", "a b") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp6", "c d e") == B_OK); CHK(runner2.Run("AppRunTestApp6", "c d e") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -602,7 +586,6 @@ void AppRunTester::RunTest17()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp5") == B_OK); CHK(runner1.Run("AppRunTestApp5") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp5a") == B_OK); CHK(runner2.Run("AppRunTestApp5a") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -636,7 +619,6 @@ void AppRunTester::RunTest18()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp5", "a b") == B_OK); CHK(runner1.Run("AppRunTestApp5", "a b") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp5a", "c d e") == B_OK); CHK(runner2.Run("AppRunTestApp5a", "c d e") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -667,7 +649,6 @@ void AppRunTester::RunTest19()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp6") == B_OK); CHK(runner1.Run("AppRunTestApp6") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp6a") == B_OK); CHK(runner2.Run("AppRunTestApp6a") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -703,7 +684,6 @@ void AppRunTester::RunTest20()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp6", "a b") == B_OK); CHK(runner1.Run("AppRunTestApp6", "a b") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp6a", "c d e") == B_OK); CHK(runner2.Run("AppRunTestApp6a", "c d e") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -740,7 +720,6 @@ void AppRunTester::RunTest21()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp6", "a b") == B_OK); CHK(runner1.Run("AppRunTestApp6", "a b") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp5", "c d e") == B_OK); CHK(runner2.Run("AppRunTestApp5", "c d e") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -775,7 +754,6 @@ void AppRunTester::RunTest22()
// run the apps // run the apps
AppRunner runner1, runner2; AppRunner runner1, runner2;
CHK(runner1.Run("AppRunTestApp5", "a b") == B_OK); CHK(runner1.Run("AppRunTestApp5", "a b") == B_OK);
runner1.Team();
CHK(runner2.Run("AppRunTestApp6", "c d e") == B_OK); CHK(runner2.Run("AppRunTestApp6", "c d e") == B_OK);
runner1.WaitFor(true); runner1.WaitFor(true);
runner2.WaitFor(true); runner2.WaitFor(true);
@@ -1,4 +1,6 @@
#include "../common.h" #include "../common.h"
#include "AppQuitRequestedTester.h"
#include "AppQuitTester.h"
#include "AppRunTester.h" #include "AppRunTester.h"
#include "BApplicationTester.h" #include "BApplicationTester.h"
@@ -6,6 +8,8 @@ CppUnit::Test* ApplicationTestSuite()
{ {
CppUnit::TestSuite *testSuite = new CppUnit::TestSuite(); CppUnit::TestSuite *testSuite = new CppUnit::TestSuite();
testSuite->addTest(AppQuitRequestedTester::Suite());
testSuite->addTest(AppQuitTester::Suite());
testSuite->addTest(AppRunTester::Suite()); testSuite->addTest(AppRunTester::Suite());
testSuite->addTest(TBApplicationTester::Suite()); testSuite->addTest(TBApplicationTester::Suite());
@@ -121,10 +121,18 @@ case 22:launch the app two times: first: B_EXCLUSIVE_LAUNCH | B_ARGV_ONLY,
first app: ArgvReceived(), ReadyToRun(), QuitRequested() first app: ArgvReceived(), ReadyToRun(), QuitRequested()
second app: quits second app: quits
void Quit() void Quit()
TODO case 1: not running application =>
Should delete the application object.
case 2: running application, call from looper thread =>
Run() should return. Should not delete the application object.
case 3: running application, call from other thread =>
Run() should return. Should not delete the application object.
case 4: running application, call from other thread, but don't lock before =>
Should print error message, but proceed anyway. Run() should return.
Should not delete the application object.
bool QuitRequested() bool QuitRequested()
TODO case 1: return false the first time, true the second time it is invoked =>
Should not quit after the first time, but after the second one.
@@ -0,0 +1,33 @@
// AppQuitRequestedTestApp1.cpp
#include <stdio.h>
#include <OS.h>
#include "CommonTestApp.h"
int
main()
{
// R5: doesn't set the error variable in case of success
#ifdef TEST_R5
status_t error = B_OK;
#else
status_t error = B_ERROR;
#endif
CommonTestApp *app = new CommonTestApp(
"application/x-vnd.obos-app-quit-testapp1", &error);
init_connection();
report("error: %lx\n", error);
report("InitCheck(): %lx\n", app->InitCheck());
app->SetReportDestruction(true);
if (error == B_OK) {
app->SetQuittingPolicy(true);
app->PostMessage(B_QUIT_REQUESTED, app);
app->PostMessage(B_QUIT_REQUESTED, app);
app->Run();
}
delete app;
return 0;
}
@@ -0,0 +1,27 @@
// AppQuitTestApp1.cpp
#include <stdio.h>
#include <OS.h>
#include "CommonTestApp.h"
int
main()
{
// R5: doesn't set the error variable in case of success
#ifdef TEST_R5
status_t error = B_OK;
#else
status_t error = B_ERROR;
#endif
CommonTestApp *app = new CommonTestApp(
"application/x-vnd.obos-app-quit-testapp1", &error);
init_connection();
report("error: %lx\n", error);
report("InitCheck(): %lx\n", app->InitCheck());
app->SetReportDestruction(true);
app->Quit();
return 0;
}
@@ -0,0 +1,45 @@
// AppQuitTestApp2.cpp
#include <stdio.h>
#include <OS.h>
#include "CommonTestApp.h"
enum {
MSG_QUIT = 'quit',
};
class Quitter : public BHandler {
public:
virtual void MessageReceived(BMessage *message)
{
if (message->what == MSG_QUIT)
be_app->Quit();
}
};
int
main()
{
// R5: doesn't set the error variable in case of success
#ifdef TEST_R5
status_t error = B_OK;
#else
status_t error = B_ERROR;
#endif
CommonTestApp *app = new CommonTestApp(
"application/x-vnd.obos-app-quit-testapp1", &error);
init_connection();
report("error: %lx\n", error);
report("InitCheck(): %lx\n", app->InitCheck());
app->SetReportDestruction(true);
if (error == B_OK) {
app->SetMessageHandler(new Quitter);
app->PostMessage(MSG_QUIT, app);
app->Run();
}
delete app;
return 0;
}
@@ -0,0 +1,41 @@
// AppQuitTestApp3.cpp
#include <stdio.h>
#include <OS.h>
#include "CommonTestApp.h"
class Quitter : public EventHandler {
public:
virtual void HandleEvent(CommonTestApp *app)
{
app->Lock();
app->Quit();
app->Unlock();
}
};
int
main()
{
// R5: doesn't set the error variable in case of success
#ifdef TEST_R5
status_t error = B_OK;
#else
status_t error = B_ERROR;
#endif
CommonTestApp *app = new CommonTestApp(
"application/x-vnd.obos-app-quit-testapp1", &error);
init_connection();
report("error: %lx\n", error);
report("InitCheck(): %lx\n", app->InitCheck());
app->SetReportDestruction(true);
if (error == B_OK) {
app->RunEventThread(10000, 1, new Quitter);
app->Run();
}
delete app;
return 0;
}
@@ -0,0 +1,41 @@
// AppQuitTestApp4.cpp
#include <stdio.h>
#include <OS.h>
#include "CommonTestApp.h"
class Quitter : public EventHandler {
public:
virtual void HandleEvent(CommonTestApp *app)
{
app->Quit();
if (app->IsLocked())
report("ERROR: BApplication is locked!\n");
}
};
int
main()
{
// R5: doesn't set the error variable in case of success
#ifdef TEST_R5
status_t error = B_OK;
#else
status_t error = B_ERROR;
#endif
CommonTestApp *app = new CommonTestApp(
"application/x-vnd.obos-app-quit-testapp1", &error);
// init_connection();
report("error: %lx\n", error);
report("InitCheck(): %lx\n", app->InitCheck());
app->SetReportDestruction(true);
if (error == B_OK) {
app->RunEventThread(10000, 1, new Quitter);
app->Run();
}
delete app;
return 0;
}
@@ -10,9 +10,12 @@
CommonTestApp::CommonTestApp(const char *signature) CommonTestApp::CommonTestApp(const char *signature)
: BApplication(signature), : BApplication(signature),
fQuitOnSecondTry(false), fQuitOnSecondTry(false),
fQuitter(-1), fEventThread(-1),
fQuittingDelay(0), fEventDelay(0),
fQuittingTries(1) fEventCount(0),
fEventHandler(NULL),
fMessageHandler(NULL),
fReportDestruction(false)
{ {
} }
@@ -25,10 +28,14 @@ CommonTestApp::CommonTestApp(const char *signature, status_t *result)
// destructor // destructor
CommonTestApp::~CommonTestApp() CommonTestApp::~CommonTestApp()
{ {
if (fQuitter >= 0) { if (fEventThread >= 0) {
int32 result; int32 result;
wait_for_thread(fQuitter, &result); wait_for_thread(fEventThread, &result);
} }
if (fReportDestruction)
report("BApplication::~BApplication()\n");
delete fEventHandler;
delete fMessageHandler;
} }
// ArgvReceived // ArgvReceived
@@ -44,6 +51,15 @@ CommonTestApp::ArgvReceived(int32 argc, char **argv)
} }
} }
// MessageReceived
void
CommonTestApp::MessageReceived(BMessage *message)
{
if (fMessageHandler)
fMessageHandler->MessageReceived(message);
BApplication::MessageReceived(message);
}
// QuitRequested // QuitRequested
bool bool
CommonTestApp::QuitRequested() CommonTestApp::QuitRequested()
@@ -80,51 +96,69 @@ CommonTestApp::SetQuittingPolicy(bool onSecondTry)
fQuitOnSecondTry = onSecondTry; fQuitOnSecondTry = onSecondTry;
} }
// RunQuitterThread // SetReportDestruction
void
CommonTestApp::SetReportDestruction(bool reportDestruction)
{
fReportDestruction = reportDestruction;
}
// RunEventThread
status_t status_t
CommonTestApp::RunQuitterThread(bigtime_t delay, int32 tries) CommonTestApp::RunEventThread(bigtime_t delay, int32 count,
EventHandler *handler)
{ {
status_t error = B_OK; status_t error = B_OK;
fQuittingDelay = delay; fEventDelay = delay;
fQuittingTries = tries; fEventCount = count;
fEventHandler = handler;
// spawn the thread // spawn the thread
fQuitter = spawn_thread(&_QuitterEntry, "quitter thread", fEventThread = spawn_thread(&_EventThreadEntry, "event thread",
B_NORMAL_PRIORITY, this); B_NORMAL_PRIORITY, this);
if (fQuitter < 0) if (fEventThread < 0)
error = fQuitter; error = fEventThread;
if (error == B_OK) if (error == B_OK)
error = resume_thread(fQuitter); error = resume_thread(fEventThread);
// cleanup on error // cleanup on error
if (error != B_OK && fQuitter >= 0) { if (error != B_OK && fEventThread >= 0) {
kill_thread(fQuitter); kill_thread(fEventThread);
fQuitter = -1; fEventThread = -1;
} }
return error; return error;
} }
// _QuitterEntry // SetMessageHandler
void
CommonTestApp::SetMessageHandler(BHandler *handler)
{
delete fMessageHandler;
fMessageHandler = handler;
}
// _EventThreadEntry
int32 int32
CommonTestApp::_QuitterEntry(void *data) CommonTestApp::_EventThreadEntry(void *data)
{ {
int32 result = 0; int32 result = 0;
if (CommonTestApp *app = (CommonTestApp*)data) if (CommonTestApp *app = (CommonTestApp*)data)
result = app->_QuitterLoop(); result = app->_EventLoop();
return result; return result;
} }
// _QuitterLoop // _EventLoop
int32 int32
CommonTestApp::_QuitterLoop() CommonTestApp::_EventLoop()
{ {
for (; fQuittingTries > 0; fQuittingTries--) { for (; fEventCount > 0; fEventCount--) {
snooze(fQuittingDelay); snooze(fEventDelay);
PostMessage(B_QUIT_REQUESTED, this); if (fEventHandler)
fEventHandler->HandleEvent(this);
} }
return 0; return 0;
} }
static const char *kAppRunnerTeamPort = "app runner team port"; static const char *kAppRunnerTeamPort = "app runner team port";
static bool connectionEstablished = false;
static port_id outputPort = -1; static port_id outputPort = -1;
// init_connection // init_connection
@@ -150,6 +184,7 @@ init_connection()
if (written < 0) if (written < 0)
error = written; error = written;
} }
connectionEstablished = (error == B_OK);
return error; return error;
} }
@@ -159,7 +194,10 @@ report(const char *format,...)
{ {
va_list args; va_list args;
va_start(args, format); va_start(args, format);
if (connectionEstablished)
vreport(format, args); vreport(format, args);
else
vprintf(format, args);
va_end(args); va_end(args);
} }
@@ -7,6 +7,16 @@
#include <Application.h> #include <Application.h>
class CommonTestApp;
class EventHandler {
public:
EventHandler() {}
virtual ~EventHandler() {}
virtual void HandleEvent(CommonTestApp *app) = 0;
};
class CommonTestApp : public BApplication { class CommonTestApp : public BApplication {
public: public:
CommonTestApp(const char *signature); CommonTestApp(const char *signature);
@@ -14,23 +24,31 @@ public:
virtual ~CommonTestApp(); virtual ~CommonTestApp();
virtual void ArgvReceived(int32 argc, char **argv); virtual void ArgvReceived(int32 argc, char **argv);
virtual void MessageReceived(BMessage *message);
virtual bool QuitRequested(); virtual bool QuitRequested();
virtual void ReadyToRun(); virtual void ReadyToRun();
thread_id Run(); thread_id Run();
void SetQuittingPolicy(bool onSecondTry); void SetQuittingPolicy(bool onSecondTry);
void SetReportDestruction(bool reportDestruction);
status_t RunQuitterThread(bigtime_t delay, int32 tries); status_t RunEventThread(bigtime_t delay, int32 count,
EventHandler *handler);
void SetMessageHandler(BHandler *handler);
private: private:
static int32 _QuitterEntry(void *data); static int32 _EventThreadEntry(void *data);
int32 _QuitterLoop(); int32 _EventLoop();
private: private:
bool fQuitOnSecondTry; bool fQuitOnSecondTry;
thread_id fQuitter; thread_id fEventThread;
bigtime_t fQuittingDelay; bigtime_t fEventDelay;
int32 fQuittingTries; int32 fEventCount;
EventHandler *fEventHandler;
BHandler *fMessageHandler;
bool fReportDestruction;
}; };
status_t init_connection(); status_t init_connection();
@@ -49,6 +49,9 @@ rule CopyBAppTestApp
} }
} }
# BApplication::BApplication() test apps
#
SimpleBAppTestApp BApplicationTestApp1.cpp ; SimpleBAppTestApp BApplicationTestApp1.cpp ;
SimpleBAppTestApp BApplicationTestApp1a.cpp ; SimpleBAppTestApp BApplicationTestApp1a.cpp ;
SimpleBAppTestApp BApplicationTestApp1b.cpp ; SimpleBAppTestApp BApplicationTestApp1b.cpp ;
@@ -65,6 +68,10 @@ SimpleBAppTestApp BApplicationTestApp5.cpp : BApplicationTestApp5.rsrc ;
SimpleBAppTestApp BApplicationTestApp5a.cpp : BApplicationTestApp5.rsrc ; SimpleBAppTestApp BApplicationTestApp5a.cpp : BApplicationTestApp5.rsrc ;
SimpleBAppTestApp BApplicationTestApp5b.cpp : BApplicationTestApp5.rsrc ; SimpleBAppTestApp BApplicationTestApp5b.cpp : BApplicationTestApp5.rsrc ;
# BApplication::Run() test apps
#
SimpleBAppTestApp AppRunTestApp1.cpp CommonTestApp.cpp : AppRunTestApp1.rsrc ; SimpleBAppTestApp AppRunTestApp1.cpp CommonTestApp.cpp : AppRunTestApp1.rsrc ;
SimpleBAppTestApp2 AppRunTestApp2 : AppRunTestApp1.o CommonTestApp.o SimpleBAppTestApp2 AppRunTestApp2 : AppRunTestApp1.o CommonTestApp.o
: AppRunTestApp2.rsrc ; : AppRunTestApp2.rsrc ;
@@ -81,3 +88,18 @@ CopyBAppTestApp AppRunTestApp3a : AppRunTestApp3 ;
CopyBAppTestApp AppRunTestApp4a : AppRunTestApp4 ; CopyBAppTestApp AppRunTestApp4a : AppRunTestApp4 ;
CopyBAppTestApp AppRunTestApp5a : AppRunTestApp5 ; CopyBAppTestApp AppRunTestApp5a : AppRunTestApp5 ;
CopyBAppTestApp AppRunTestApp6a : AppRunTestApp6 ; CopyBAppTestApp AppRunTestApp6a : AppRunTestApp6 ;
# BApplication::Quit() test apps
#
SimpleBAppTestApp AppQuitTestApp1.cpp CommonTestApp.o ;
SimpleBAppTestApp AppQuitTestApp2.cpp CommonTestApp.o ;
SimpleBAppTestApp AppQuitTestApp3.cpp CommonTestApp.o ;
SimpleBAppTestApp AppQuitTestApp4.cpp CommonTestApp.o ;
# BApplication::QuitRequested() test apps
#
SimpleBAppTestApp AppQuitRequestedTestApp1.cpp CommonTestApp.o ;