#include <stdio.h>
#include <Application.h>
#include <Handler.h>
#include <Looper.h>
#include <Message.h>
#include <Messenger.h>
#include <OS.h>
#define CHK CPPUNIT_ASSERT
#include <TestShell.h>
#include <TestUtils.h>
#include <cppunit/TestAssert.h>
#include "BMessengerTester.h"
#include "AppRunner.h"
#include "Helpers.h"
static
void
check_messenger(const BMessenger &messenger, bool valid, bool local,
team_id team, BLooper *looper = NULL, BHandler *handler = NULL,
team_id altTeam = -1)
{
CHK(messenger.IsValid() == valid);
CHK(messenger.IsTargetLocal() == local);
BLooper *resultLooper = NULL;
CHK(messenger.Target(&resultLooper) == handler);
CHK(resultLooper == looper);
if (altTeam >= 0)
CHK(messenger.Team() == team || messenger.Team() == altTeam);
else
{
if (messenger.Team() != team)
printf("team is %ld, but should be %ld\n", messenger.Team(), team);
CHK(messenger.Team() == team);
}
}
static const char *kRunTestApp1Signature
= "application/x-vnd.obos-app-run-testapp1";
void TBMessengerTester::BMessenger1()
{
BMessenger messenger;
CHK(messenger.IsValid() == false);
CHK(messenger.IsTargetLocal() == false);
BLooper *looper;
CHK(messenger.Target(&looper) == NULL);
CHK(looper == NULL);
CHK(messenger.Team() == -1);
}
void TBMessengerTester::BMessenger2()
{
BMessenger messenger((const BHandler*)NULL, NULL, NULL);
CHK(messenger.IsValid() == false);
CHK(messenger.IsTargetLocal() == false);
BLooper *looper;
CHK(messenger.Target(&looper) == NULL);
CHK(looper == NULL);
CHK(messenger.Team() == -1);
}
void TBMessengerTester::BMessenger3()
{
status_t result = B_OK;
BMessenger messenger((const BHandler*)NULL, NULL, &result);
CHK(messenger.IsValid() == false);
CHK(messenger.IsTargetLocal() == false);
BLooper *looper;
CHK(messenger.Target(&looper) == NULL);
CHK(looper == NULL);
CHK(messenger.Team() == -1);
CHK(result == B_BAD_VALUE);
}
void TBMessengerTester::BMessenger4()
{
status_t result = B_OK;
BLooper *looper = new BLooper;
looper->Run();
LooperQuitter quitter(looper);
BMessenger messenger(NULL, looper, &result);
CHK(messenger.IsValid() == true);
CHK(messenger.IsTargetLocal() == true);
BLooper *resultLooper;
CHK(messenger.Target(&resultLooper) == NULL);
CHK(resultLooper == looper);
CHK(messenger.Team() == get_this_team());
CHK(result == B_OK);
}
void TBMessengerTester::BMessenger5()
{
status_t result = B_OK;
BHandler *handler = new BHandler;
HandlerDeleter deleter(handler);
BMessenger messenger(handler, NULL, &result);
CHK(messenger.IsValid() == false);
CHK(messenger.IsTargetLocal() == false);
BLooper *resultLooper;
CHK(messenger.Target(&resultLooper) == NULL);
CHK(resultLooper == NULL);
CHK(messenger.Team() == -1);
CHK(result == B_MISMATCHED_VALUES);
}
void TBMessengerTester::BMessenger6()
{
status_t result = B_OK;
BLooper *looper = new BLooper;
looper->Run();
LooperQuitter quitter(looper);
BHandler *handler = new BHandler;
HandlerDeleter deleter(handler);
CHK(looper->Lock());
looper->AddHandler(handler);
looper->Unlock();
BMessenger messenger(handler, NULL, &result);
CHK(messenger.IsValid() == true);
CHK(messenger.IsTargetLocal() == true);
BLooper *resultLooper;
CHK(messenger.Target(&resultLooper) == handler);
CHK(resultLooper == looper);
CHK(messenger.Team() == get_this_team());
CHK(result == B_OK);
}
void TBMessengerTester::BMessenger7()
{
status_t result = B_OK;
BLooper *looper = new BLooper;
looper->Run();
LooperQuitter quitter(looper);
BHandler *handler = new BHandler;
HandlerDeleter deleter(handler);
CHK(looper->Lock());
looper->AddHandler(handler);
looper->Unlock();
BMessenger messenger(handler, looper, &result);
CHK(messenger.IsValid() == true);
CHK(messenger.IsTargetLocal() == true);
BLooper *resultLooper;
CHK(messenger.Target(&resultLooper) == handler);
CHK(resultLooper == looper);
CHK(messenger.Team() == get_this_team());
CHK(result == B_OK);
}
void TBMessengerTester::BMessenger8()
{
status_t result = B_OK;
BLooper *looper = new BLooper;
looper->Run();
LooperQuitter quitter(looper);
BLooper *looper2 = new BLooper;
looper2->Run();
LooperQuitter quitter2(looper2);
BHandler *handler = new BHandler;
HandlerDeleter deleter(handler);
CHK(looper->Lock());
looper->AddHandler(handler);
looper->Unlock();
BMessenger messenger(handler, looper2, &result);
CHK(messenger.IsValid() == false);
CHK(messenger.IsTargetLocal() == false);
BLooper *resultLooper;
CHK(messenger.Target(&resultLooper) == NULL);
CHK(resultLooper == NULL);
CHK(messenger.Team() == -1);
CHK(result == B_MISMATCHED_VALUES);
}
void TBMessengerTester::BMessenger9()
{
BMessenger from;
BMessenger messenger(from);
CHK(messenger.IsValid() == false);
CHK(messenger.IsTargetLocal() == false);
BLooper *looper;
CHK(messenger.Target(&looper) == NULL);
CHK(looper == NULL);
CHK(messenger.Team() == -1);
}
void TBMessengerTester::BMessenger10()
{
status_t result = B_OK;
BLooper *looper = new BLooper;
looper->Run();
LooperQuitter quitter(looper);
BHandler *handler = new BHandler;
HandlerDeleter deleter(handler);
CHK(looper->Lock());
looper->AddHandler(handler);
looper->Unlock();
BMessenger from(handler, looper, &result);
CHK(from.IsValid() == true);
CHK(from.IsTargetLocal() == true);
BLooper *resultLooper;
CHK(from.Target(&resultLooper) == handler);
CHK(resultLooper == looper);
CHK(from.Team() == get_this_team());
CHK(result == B_OK);
BMessenger messenger(from);
CHK(messenger.IsValid() == true);
CHK(messenger.IsTargetLocal() == true);
resultLooper = NULL;
CHK(messenger.Target(&resultLooper) == handler);
CHK(resultLooper == looper);
CHK(messenger.Team() == get_this_team());
}
void TBMessengerTester::BMessengerD1()
{
BApplication app("application/x-vnd.obos-bmessenger-test");
AppRunner runner(true);
CHK(runner.Run("AppRunTestApp1") == B_OK);
BMessenger messenger1(NULL, -1, NULL);
check_messenger(messenger1, false, false, -1);
status_t error;
BMessenger messenger2(NULL, -1, &error);
check_messenger(messenger2, false, false, -1);
CHK(error == B_BAD_TYPE);
runner.WaitFor(true);
}
void TBMessengerTester::BMessengerD2()
{
BMessenger messenger1(kRunTestApp1Signature, -1, NULL);
check_messenger(messenger1, false, false, -1);
status_t error;
BMessenger messenger2(kRunTestApp1Signature, -1, &error);
check_messenger(messenger2, false, false, -1);
CHK(error == B_BAD_VALUE);
}
void TBMessengerTester::BMessengerD3()
{
BApplication app("application/x-vnd.obos-bmessenger-test");
AppRunner runner(true);
CHK(runner.Run("AppRunTestApp1") == B_OK);
team_id team = runner.Team();
runner.WaitFor(true);
snooze(10000);
BMessenger messenger1(NULL, team, NULL);
check_messenger(messenger1, false, false, -1);
status_t error;
BMessenger messenger2(NULL, team, &error);
check_messenger(messenger2, false, false, -1);
CHK(error == B_BAD_TEAM_ID);
}
void TBMessengerTester::BMessengerD4()
{
BApplication app("application/x-vnd.obos-bmessenger-test");
AppRunner runner(true);
CHK(runner.Run("AppRunTestApp1") == B_OK);
BMessenger messenger1(kRunTestApp1Signature, -1, NULL);
check_messenger(messenger1, false, false, runner.Team());
status_t error;
BMessenger messenger2(kRunTestApp1Signature, -1, &error);
check_messenger(messenger2, false, false, runner.Team());
CHK(error == B_BAD_TYPE);
runner.WaitFor(true);
}
void TBMessengerTester::BMessengerD5()
{
BApplication app("application/x-vnd.obos-bmessenger-test");
AppRunner runner(true);
CHK(runner.Run("AppRunTestApp1") == B_OK);
BMessenger messenger1(NULL, runner.Team(), NULL);
check_messenger(messenger1, false, false, runner.Team());
status_t error;
BMessenger messenger2(NULL, runner.Team(), &error);
check_messenger(messenger2, false, false, runner.Team());
CHK(error == B_BAD_TYPE);
runner.WaitFor(true);
}
void TBMessengerTester::BMessengerD6()
{
BApplication app("application/x-vnd.obos-bmessenger-test");
AppRunner runner1(true);
AppRunner runner2(true);
CHK(runner1.Run("AppRunTestApp2") == B_OK);
CHK(runner2.Run("AppRunTestApp2") == B_OK);
BMessenger messenger1(kRunTestApp1Signature, -1, NULL);
check_messenger(messenger1, true, false, runner1.Team(), NULL, NULL,
runner2.Team());
status_t error;
BMessenger messenger2(kRunTestApp1Signature, -1, &error);
check_messenger(messenger2, true, false, runner1.Team(), NULL, NULL,
runner2.Team());
CHK(error == B_OK);
runner1.WaitFor(true);
runner2.WaitFor(true);
}
void TBMessengerTester::BMessengerD7()
{
BApplication app("application/x-vnd.obos-bmessenger-test");
AppRunner runner1(true);
AppRunner runner2(true);
CHK(runner1.Run("AppRunTestApp2") == B_OK);
CHK(runner2.Run("AppRunTestApp2") == B_OK);
BMessenger messenger1(NULL, runner1.Team(), NULL);
check_messenger(messenger1, true, false, runner1.Team());
status_t error;
BMessenger messenger2(NULL, runner1.Team(), &error);
check_messenger(messenger2, true, false, runner1.Team());
CHK(error == B_OK);
runner1.WaitFor(true);
runner2.WaitFor(true);
snooze(10000);
check_messenger(messenger1, false, false, runner1.Team());
check_messenger(messenger2, false, false, runner1.Team());
}
void TBMessengerTester::BMessengerD8()
{
BApplication app("application/x-vnd.obos-bmessenger-test");
AppRunner runner1(true);
AppRunner runner2(true);
CHK(runner1.Run("BMessengerTestApp1") == B_OK);
CHK(runner2.Run("AppRunTestApp2") == B_OK);
BMessenger messenger1(kRunTestApp1Signature, runner1.Team(), NULL);
check_messenger(messenger1, false, false, -1);
status_t error;
BMessenger messenger2(kRunTestApp1Signature, runner1.Team(), &error);
check_messenger(messenger2, false, false, -1);
CHK(error == B_MISMATCHED_VALUES);
runner1.WaitFor(true);
runner2.WaitFor(true);
}
void TBMessengerTester::BMessengerD9()
{
BApplication app("application/x-vnd.obos-bmessenger-test");
AppRunner runner1(true);
AppRunner runner2(true);
CHK(runner1.Run("AppRunTestApp2") == B_OK);
CHK(runner2.Run("AppRunTestApp2") == B_OK);
BMessenger messenger1(kRunTestApp1Signature, runner1.Team(), NULL);
check_messenger(messenger1, true, false, runner1.Team());
status_t error;
BMessenger messenger2(kRunTestApp1Signature, runner1.Team(), &error);
check_messenger(messenger2, true, false, runner1.Team());
CHK(error == B_OK);
BMessenger messenger3(kRunTestApp1Signature, runner2.Team(), NULL);
check_messenger(messenger3, true, false, runner2.Team());
BMessenger messenger4(kRunTestApp1Signature, runner2.Team(), &error);
check_messenger(messenger4, true, false, runner2.Team());
CHK(error == B_OK);
runner1.WaitFor(true);
runner2.WaitFor(true);
}
Test* TBMessengerTester::Suite()
{
TestSuite* SuiteOfTests = new TestSuite;
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessenger1);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessenger2);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessenger3);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessenger4);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessenger5);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessenger6);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessenger7);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessenger8);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessenger9);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessenger10);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessengerD1);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessengerD2);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessengerD3);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessengerD4);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessengerD5);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessengerD6);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessengerD7);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessengerD8);
ADD_TEST4(BMessenger, SuiteOfTests, TBMessengerTester, BMessengerD9);
return SuiteOfTests;
}