1//------------------------------------------------------------------------------ 2// AppQuitTester.cpp 3// 4//------------------------------------------------------------------------------ 5 6// Standard Includes ----------------------------------------------------------- 7#include <stdio.h> 8 9// System Includes ------------------------------------------------------------- 10#include <Message.h> 11#include <OS.h> 12#include <Application.h> 13#include <Handler.h> 14#include <Looper.h> 15#include <String.h> 16 17// Project Includes ------------------------------------------------------------ 18#include <TestShell.h> 19#include <TestUtils.h> 20#include <cppunit/TestAssert.h> 21 22// Local Includes -------------------------------------------------------------- 23#include "AppRunner.h" 24#include "AppQuitTester.h" 25#include "PipedAppRunner.h" 26 27// Local Defines --------------------------------------------------------------- 28 29// Globals --------------------------------------------------------------------- 30 31//------------------------------------------------------------------------------ 32 33// check_output 34template<typename AppRunnerC> 35static 36void 37check_output(AppRunnerC &runner, const char *expectedOutput) 38{ 39 BString buffer; 40 CHK(runner.GetOutput(&buffer) == B_OK); 41if (buffer != expectedOutput) 42printf("result is `%s', but should be `%s'\n", buffer.String(), 43expectedOutput); 44 CHK(buffer == expectedOutput); 45} 46 47/* 48 void Quit() 49 @case 1 not running application 50 @results Should delete the application object. 51*/ 52void AppQuitTester::QuitTest1() 53{ 54 BApplication app("application/x-vnd.obos-app-quit-test"); 55 const char *output = 56 "error: 0\n" 57 "InitCheck(): 0\n" 58 "BApplication::~BApplication()\n"; 59 // run the apps 60 AppRunner runner; 61 CHK(runner.Run("AppQuitTestApp1") == B_OK); 62 runner.WaitFor(false); 63 // get the output and compare the result 64 check_output(runner, output); 65} 66 67/* 68 void Quit() 69 @case 2 running application, call from looper thread 70 @results Run() should return. Should not delete the application 71 object. 72*/ 73void AppQuitTester::QuitTest2() 74{ 75 BApplication app("application/x-vnd.obos-app-quit-test"); 76 const char *output = 77 "error: 0\n" 78 "InitCheck(): 0\n" 79 "BApplication::ReadyToRun()\n" 80 "BApplication::Run() done: 1\n" 81 "BApplication::~BApplication()\n"; 82 // run the apps 83 AppRunner runner; 84 CHK(runner.Run("AppQuitTestApp2") == B_OK); 85 runner.WaitFor(false); 86 // get the output and compare the result 87 check_output(runner, output); 88} 89 90/* 91 void Quit() 92 @case 3 running application, call from other thread 93 @results Run() should return. Should not delete the application 94 object. 95*/ 96void AppQuitTester::QuitTest3() 97{ 98 BApplication app("application/x-vnd.obos-app-quit-test"); 99 const char *output = 100 "error: 0\n" 101 "InitCheck(): 0\n" 102 "BApplication::ReadyToRun()\n" 103 "BApplication::Run() done: 1\n" 104 "BApplication::~BApplication()\n"; 105 // run the apps 106 AppRunner runner; 107 CHK(runner.Run("AppQuitTestApp3") == B_OK); 108 runner.WaitFor(false); 109 // get the output and compare the result 110 check_output(runner, output); 111} 112 113/* 114 void Quit() 115 @case 4 running application, call from other thread, but don't 116 lock before 117 @results Should print error message, but proceed anyway. 118 Run() should return. 119 Should not delete the application object. 120*/ 121void AppQuitTester::QuitTest4() 122{ 123 BApplication app("application/x-vnd.obos-app-quit-test"); 124 const char *output = 125 "error: 0\n" 126 "InitCheck(): 0\n" 127 "BApplication::ReadyToRun()\n" 128 "BApplication::Run() done: 1\n" 129 "BApplication::~BApplication()\n"; 130 // run the apps 131 PipedAppRunner runner; 132 CHK(runner.Run("AppQuitTestApp4") == B_OK); 133 runner.WaitFor(); 134 // get the output and compare the result 135 BString buffer; 136 CHK(runner.GetOutput(&buffer) == B_OK); 137 // Remove the error message, as it contains the team ID, which we don't 138 // know. 139 int32 errorIndex = buffer.FindFirst( 140 "ERROR - you must Lock the application object before calling Quit()"); 141 CHK(errorIndex >= 0); 142 int32 errorEnd = buffer.FindFirst('\n', errorIndex); 143 CHK(errorEnd >= 0); 144 buffer.Remove(errorIndex, errorEnd - errorIndex + 1); 145if (buffer != output) 146printf("result is `%s', but should be `%s'\n", buffer.String(), 147output); 148 CHK(buffer == output); 149} 150 151 152Test* AppQuitTester::Suite() 153{ 154 TestSuite* SuiteOfTests = new TestSuite; 155 156 ADD_TEST4(BApplication, SuiteOfTests, AppQuitTester, QuitTest1); 157 ADD_TEST4(BApplication, SuiteOfTests, AppQuitTester, QuitTest2); 158 ADD_TEST4(BApplication, SuiteOfTests, AppQuitTester, QuitTest3); 159 ADD_TEST4(BApplication, SuiteOfTests, AppQuitTester, QuitTest4); 160 161 return SuiteOfTests; 162} 163 164 165 166