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 34 template<typename AppRunnerC> 35 static 36 void 37 check_output(AppRunnerC &runner, const char *expectedOutput) 38 { 39 BString buffer; 40 CHK(runner.GetOutput(&buffer) == B_OK); 41 if (buffer != expectedOutput) 42 printf("result is `%s', but should be `%s'\n", buffer.String(), 43 expectedOutput); 44 CHK(buffer == expectedOutput); 45 } 46 47 /* 48 void Quit() 49 @case 1 not running application 50 @results Should delete the application object. 51 */ 52 void 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 */ 73 void 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 */ 96 void 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 */ 121 void 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); 145 if (buffer != output) 146 printf("result is `%s', but should be `%s'\n", buffer.String(), 147 output); 148 CHK(buffer == output); 149 } 150 151 152 Test* 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