Added a program testing the registrar's MessageDeliverer. Particularly
with respect to whether the delivery still works when the port is full. It seems to do (now). git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11139 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -23,3 +23,6 @@ CommonUnitTest RosterShell
|
|||||||
: be stdc++.r4
|
: be stdc++.r4
|
||||||
: app
|
: app
|
||||||
;
|
;
|
||||||
|
|
||||||
|
SimpleTest message_deliverer_test : message_deliverer_test.cpp
|
||||||
|
: <boot!home!config!lib>libopenbeos.so ;
|
||||||
|
|||||||
@@ -0,0 +1,190 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2005, Ingo Weinhold, [email protected]. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Small app for testing the registrar's MessageDeliverer.
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <Application.h>
|
||||||
|
#include <Clipboard.h>
|
||||||
|
#include <Locker.h>
|
||||||
|
#include <Message.h>
|
||||||
|
#include <MessageRunner.h>
|
||||||
|
#include <OS.h>
|
||||||
|
#include <Path.h>
|
||||||
|
#include <Roster.h>
|
||||||
|
#include <String.h>
|
||||||
|
|
||||||
|
// message what codes
|
||||||
|
enum {
|
||||||
|
MSG_FILL_PORT = 'fill',
|
||||||
|
MSG_RUNNER = 'runn',
|
||||||
|
MSG_BROADCAST = 'brod',
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint32 sExpectedMessages[3] = {
|
||||||
|
B_CLIPBOARD_CHANGED,
|
||||||
|
MSG_RUNNER,
|
||||||
|
MSG_BROADCAST,
|
||||||
|
};
|
||||||
|
static const int32 sExpectedMessageCount = 3;
|
||||||
|
static int32 sExpectedMessageIndex = 0;
|
||||||
|
|
||||||
|
// check_expected_message
|
||||||
|
static
|
||||||
|
bool
|
||||||
|
check_expected_message(uint32 what)
|
||||||
|
{
|
||||||
|
if (sExpectedMessageIndex >= sExpectedMessageCount) {
|
||||||
|
printf("Unexpected message '%.4s'\n", (char*)&what);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 expected = sExpectedMessages[sExpectedMessageIndex++];
|
||||||
|
if (what != expected) {
|
||||||
|
printf("Unexpected message '%.4s', expected was: '%.4s'\n",
|
||||||
|
(char*)&what, (char*)&expected);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (sExpectedMessageIndex == sExpectedMessageCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TestApp
|
||||||
|
class TestApp : public BApplication {
|
||||||
|
public:
|
||||||
|
TestApp()
|
||||||
|
: BApplication("application/x-vnd.haiku.message-deliverer-test")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void MessageReceived(BMessage *message)
|
||||||
|
{
|
||||||
|
switch (message->what) {
|
||||||
|
case MSG_FILL_PORT:
|
||||||
|
return;
|
||||||
|
case MSG_RUNNER:
|
||||||
|
printf("MSG_RUNNER\n");
|
||||||
|
break;
|
||||||
|
case B_CLIPBOARD_CHANGED:
|
||||||
|
printf("B_CLIPBOARD_CHANGED\n");
|
||||||
|
break;
|
||||||
|
case MSG_BROADCAST:
|
||||||
|
printf("MSG_BROADCAST\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
BApplication::MessageReceived(message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (check_expected_message(message->what))
|
||||||
|
PostMessage(B_QUIT_REQUESTED);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// main
|
||||||
|
int
|
||||||
|
main(int argc, const char *const *argv)
|
||||||
|
{
|
||||||
|
// if started with parameter "broadcast", we broadcast a message and exit
|
||||||
|
if (argc > 1 && strcmp(argv[1], "broadcast") == 0) {
|
||||||
|
BMessage message(MSG_BROADCAST);
|
||||||
|
status_t error = be_roster->Broadcast(&message);
|
||||||
|
if (error != B_OK) {
|
||||||
|
printf("Broadcast failed: %s\n", strerror(error));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestApp app;
|
||||||
|
|
||||||
|
// fill the looper port
|
||||||
|
status_t error;
|
||||||
|
do {
|
||||||
|
BMessage message(MSG_FILL_PORT);
|
||||||
|
error = be_app_messenger.SendMessage(&message, (BHandler*)NULL, 0LL);
|
||||||
|
} while (error == B_OK);
|
||||||
|
|
||||||
|
if (error != B_WOULD_BLOCK) {
|
||||||
|
printf("sending fill message didn't fail with B_WOULD_BLOCK: %s\n",
|
||||||
|
strerror(error));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// register looper for clipboard events
|
||||||
|
BClipboard clipboard("message deliverer test");
|
||||||
|
error = clipboard.StartWatching(be_app_messenger);
|
||||||
|
if (error != B_OK) {
|
||||||
|
printf("Failed to start clipboard watching: %s\n", strerror(error));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate a clipboard changed modification
|
||||||
|
if (!clipboard.Lock()) {
|
||||||
|
printf("Failed to lock clipboard.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
clipboard.Clear();
|
||||||
|
clipboard.Data()->AddString("test", "test data");
|
||||||
|
error = clipboard.Commit();
|
||||||
|
if (error != B_OK) {
|
||||||
|
printf("Failed to commit clipboard data: %s\n", strerror(error));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
clipboard.Unlock();
|
||||||
|
|
||||||
|
// create a message runner
|
||||||
|
BMessage message(MSG_RUNNER);
|
||||||
|
bigtime_t interval = 100000LL;
|
||||||
|
BMessageRunner runner(be_app_messenger, &message, interval, 3);
|
||||||
|
error = runner.InitCheck();
|
||||||
|
if (error != B_OK) {
|
||||||
|
printf("Message runner initialization failed: %s\n", strerror(error));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
snooze(5 * interval);
|
||||||
|
|
||||||
|
// broadcast a message: We do that be starting another instance of this
|
||||||
|
// app with parameter "broadcast". We can't do the broadcast ourselves,
|
||||||
|
// since the message is sent only to the other applications.
|
||||||
|
|
||||||
|
// get our app info
|
||||||
|
app_info appInfo;
|
||||||
|
error = app.GetAppInfo(&appInfo);
|
||||||
|
if (error != B_OK) {
|
||||||
|
printf("GetAppInfo() failed: %s\n", strerror(error));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the app path
|
||||||
|
BPath path;
|
||||||
|
error = path.SetTo(&appInfo.ref);
|
||||||
|
if (error != B_OK) {
|
||||||
|
printf("Failed to get app path: %s\n", strerror(error));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// launch...
|
||||||
|
BString commandLine(path.Path());
|
||||||
|
commandLine << " broadcast";
|
||||||
|
if (system(commandLine.String()) < 0) {
|
||||||
|
printf("Failed re-launch app for broadcasting: %s\n", strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// wait a bit...
|
||||||
|
snooze(100000);
|
||||||
|
|
||||||
|
// now start the message processing loop
|
||||||
|
app.Run();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user