Files
haiku-beta6/src/tests/kits/app/broster/GetRecentTester.cpp
T
Ingo Weinhold c2257230d6 Our <RosterPrivate.h> must not be included when compiling for R5.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2728 a95241bf-73f2-0310-859d-f6bbb57e9c96
2003-02-16 23:00:37 +00:00

1481 lines
44 KiB
C++

//------------------------------------------------------------------------------
// GetRecentTester.cpp
//
//------------------------------------------------------------------------------
// Standard Includes -----------------------------------------------------------
#include <stdio.h>
// System Includes -------------------------------------------------------------
#include <Directory.h>
#include <Entry.h>
#include <File.h>
#include <fs_attr.h>
#include <Message.h>
#include <Node.h>
#include <Roster.h>
#ifdef TEST_OBOS
#include <RosterPrivate.h>
#endif
// Project Includes ------------------------------------------------------------
#include <TestShell.h>
#include <TestUtils.h>
#include <cppunit/TestAssert.h>
// Local Includes --------------------------------------------------------------
#include "GetRecentTester.h"
#include "testapps/RecentAppsTestApp.h"
// Local Defines ---------------------------------------------------------------
//------------------------------------------------------------------------------
// Attribute names and types
//------------------------------------------------------------------------------
const int32 kFlagsType = 'APPF';
const char *kTypeAttr = "BEOS:TYPE";
const char *kSigAttr = "BEOS:APP_SIG";
const char *kFlagsAttr = "BEOS:APP_FLAGS";
#ifndef B_MIME_STRING_TYPE
#define B_MIME_STRING_TYPE 'MIMS'
#endif
//------------------------------------------------------------------------------
// BEOS:APP_FLAGS attributes
//------------------------------------------------------------------------------
const int32 kSingleLaunchFlags = B_SINGLE_LAUNCH;
const int32 kMultipleLaunchFlags = B_MULTIPLE_LAUNCH;
const int32 kExclusiveLaunchFlags = B_EXCLUSIVE_LAUNCH;
const int32 kSingleLaunchArgvOnlyFlags = B_SINGLE_LAUNCH | B_ARGV_ONLY;
const int32 kMultipleLaunchArgvOnlyFlags = B_MULTIPLE_LAUNCH | B_ARGV_ONLY;
const int32 kExclusiveLaunchArgvOnlyFlags = B_EXCLUSIVE_LAUNCH | B_ARGV_ONLY;
const int32 kSingleLaunchBackgroundFlags = B_SINGLE_LAUNCH | B_BACKGROUND_APP;
const int32 kMultipleLaunchBackgroundFlags = B_MULTIPLE_LAUNCH | B_BACKGROUND_APP;
const int32 kExclusiveLaunchBackgroundFlags = B_EXCLUSIVE_LAUNCH | B_BACKGROUND_APP;
const int32 kSingleLaunchArgvOnlyBackgroundFlags = B_SINGLE_LAUNCH | B_ARGV_ONLY | B_BACKGROUND_APP;
const int32 kMultipleLaunchArgvOnlyBackgroundFlags = B_MULTIPLE_LAUNCH | B_ARGV_ONLY | B_BACKGROUND_APP;
const int32 kExclusiveLaunchArgvOnlyBackgroundFlags = B_EXCLUSIVE_LAUNCH | B_ARGV_ONLY | B_BACKGROUND_APP;
const int32 kQualifyingFlags[] = {
kSingleLaunchFlags,
kMultipleLaunchFlags,
kExclusiveLaunchFlags,
};
const int32 kNonQualifyingFlags[] = {
kSingleLaunchArgvOnlyFlags,
kMultipleLaunchArgvOnlyFlags,
kExclusiveLaunchArgvOnlyFlags,
kSingleLaunchBackgroundFlags,
kMultipleLaunchBackgroundFlags,
kExclusiveLaunchBackgroundFlags,
kSingleLaunchArgvOnlyBackgroundFlags,
kMultipleLaunchArgvOnlyBackgroundFlags,
kExclusiveLaunchArgvOnlyBackgroundFlags,
};
//------------------------------------------------------------------------------
// Temporary files
//------------------------------------------------------------------------------
const char *kTempDirRoot = "/tmp";
const char *kTempDir = "/tmp/obos-recent-tests";
const char *kTempSaveFile = "/tmp/obos-recent-tests/RosterSettingsTest";
const char *kTestType1 = "text/x-vnd.obos-recent-docs-test-type-1";
const char *kTestType2 = "text/x-vnd.obos-recent-docs-test-type-2";
const char *test_types[] = {
kTestType1,
kTestType2,
};
struct test_doc {
const char *name;
const char *type;
} test_docs[] = {
{ "first-file-of-type-1", kTestType1 },
{ "second-file-of-type-1", kTestType1 },
{ "first-file-of-type-2", kTestType2 },
{ "second-file-of-type-2", kTestType2 },
{ "untyped", NULL },
};
enum test_doc_index {
kTestDocUntyped,
kTestDoc1Type1,
kTestDoc2Type1,
kTestDoc1Type2,
kTestDoc2Type2,
};
const char *test_folders[] = {
"test-folder-1",
"test-folder-2",
"test-folder-3",
"test-folder-4",
};
const char *test_sigs[] = {
"application/x-vnd.obos-recent-tests-1",
"imposter/this-is-not-an-app-sig-now-is-it?",
"application/x-vnd.obos-recent-tests-3",
"application/x-vnd.obos-recent-tests-app-sig-4",
"application/x-vnd.obos-recent-tests-5",
"application/x-vnd.obos-recent-tests-6",
"application/x-vnd.obos-recent-tests-7",
"application/x-vnd.obos-recent-tests-8",
};
//------------------------------------------------------------------------------
// Functions
//------------------------------------------------------------------------------
status_t check_ref_count(BMessage *refMsg, int32 count);
status_t set_test_app_attributes(const entry_ref *app, const char *sig, const int32 *flags);
status_t launch_test_app(RecentAppsTestAppId id, const int32 *flags);
status_t get_test_app_ref(RecentAppsTestAppId id, entry_ref *ref);
status_t get_test_ref(test_doc_index index, entry_ref *ref);
// Globals ---------------------------------------------------------------------
//------------------------------------------------------------------------------
/*! \brief Verifies that the given BMessage has a \c "refs" field
containing \a count B_REF_TYPE entries.
\return
- \c B_OK: The predicate is true
- \c B_ERROR: The predicate is false
- other error code: An error occured
*/
status_t
check_ref_count(BMessage *refMsg, int32 count)
{
type_code type;
int32 realCount;
status_t err = refMsg ? B_OK : B_BAD_VALUE;
if (!err)
err = refMsg->GetInfo("refs", &type, &realCount);
if (!err) {
err = realCount == count ? B_OK : B_ERROR;
if (!err)
err = type == B_REF_TYPE ? B_OK : B_ERROR;
} else if (err == B_NAME_NOT_FOUND && count == 0) {
err = B_OK;
}
return err;
}
/*! \brief Sets or unsets \c BEOS:APP_SIG and \c BEOS:APP_FLAGS attributes for
the given entry (which is assumed to be an application).
\param app The entry to modify
\param sig If \c non-NULL, the given signature should be written to the entry's
\c BEOS:APP_SIG attribute. If \c NULL, said attribute should be
removed if it exists.
\param sig If \c non-NULL, the given flags should be written to the entry's
\c BEOS:APP_FLAG attribute. If \c NULL, said attribute should be
removed if it exists.
*/
status_t
set_test_app_attributes(const entry_ref *app, const char *sig, const int32 *flags)
{
BNode node;
attr_info info;
status_t err = app ? B_OK : B_BAD_VALUE;
// Open a node on the given app
if (!err)
err = node.SetTo(app);
// Write/remove the appropriate attributes
if (!err) {
if (sig) {
// Set the attribute
ssize_t bytes = node.WriteAttr(kSigAttr, B_MIME_STRING_TYPE, 0, sig, strlen(sig)+1);
if (bytes >= 0)
err = bytes == (ssize_t)strlen(sig)+1 ? B_OK : B_FILE_ERROR;
else
err = bytes;
} else {
// See if the attribute exists and thus needs to be removed
if (node.GetAttrInfo(kSigAttr, &info) == B_OK)
err = node.RemoveAttr(kSigAttr);
}
}
if (!err) {
if (flags) {
// Set the attribute
ssize_t bytes = node.WriteAttr(kFlagsAttr, kFlagsType, 0, flags, sizeof(int32));
if (bytes >= 0)
err = bytes == sizeof(int32) ? B_OK : B_FILE_ERROR;
else
err = bytes;
} else {
// See if the attribute exists and thus needs to be removed
if (node.GetAttrInfo(kFlagsAttr, &info) == B_OK)
err = node.RemoveAttr(kFlagsAttr);
}
}
return err;
}
/*! \brief Launches the given test app after first setting the application entry's
\c BEOS:APP_FLAGS attribute as specified.
See RecentAppsTestApp.h for more info on RecentAppsTestAppId, and see
set_test_app_attributes() for more info on the nature of the \a flags argument.
*/
status_t
launch_test_app(RecentAppsTestAppId id, const int32 *flags)
{
entry_ref ref;
status_t err = get_test_app_ref(id, &ref);
std::string sig;
// Set the attributes
if (!err) {
err = set_test_app_attributes(&ref, kRecentAppsTestAppSigs[id], flags);
}
// Launch the app
if (!err) {
BRoster roster;
err = roster.Launch(&ref);
// err = roster.Launch(kRecentAppsTestAppSigs[id]);
}
// Give it time to do its thing
if (!err)
snooze(250000);
return err;
}
/*! \brief Returns an entry_ref for the given test app in \a ref.
\param id The id of the app of interest
\param ref Pointer to a pre-allocated \c entry_ref structure
into which the result is set.
*/
status_t
get_test_app_ref(RecentAppsTestAppId id, entry_ref *ref)
{
const char *testDir = BTestShell::GlobalTestDir();
BEntry entry;
status_t err = ref ? B_OK : B_BAD_VALUE;
if (!err)
err = testDir ? B_OK : B_NAME_NOT_FOUND;
if (!err) {
char path[B_PATH_NAME_LENGTH];
sprintf(path, "%s/../kits/app/%s%s", testDir, kRecentAppsTestAppFilenames[id],
#if TEST_R5
"_r5"
#else
""
#endif
);
err = entry.SetTo(path);
}
if (!err)
err = entry.GetRef(ref);
return err;
}
/* \brief Fetches an entry_ref for the given test document
The file is assumed to reside in the directory specified
by \c kTempDir.
\param leafname the name of the file with no path information
\param ref pointer to a pre-allocated entry_ref into which the
result is stored
*/
status_t get_test_ref(const char *leafname, entry_ref *ref)
{
BEntry entry;
status_t err = leafname && ref ? B_OK : B_BAD_VALUE;
if (!err) {
char path[B_PATH_NAME_LENGTH];
sprintf(path, "%s/%s", kTempDir, leafname);
err = entry.SetTo(path);
}
if (!err)
err = entry.GetRef(ref);
return err;
}
//------------------------------------------------------------------------------
// GetRecentApps()
//------------------------------------------------------------------------------
/*
void GetRecentApps(BMessage *refList, int32 maxCount)
@case A1 refList is NULL; maxCount < 0
@results R5: crashes
OBOS: should quietly do nothing.
*/
void
GetRecentTester::GetRecentAppsTestA1()
{
#if !TEST_R5
BRoster roster;
roster.GetRecentApps(NULL, -10);
#endif
}
/*
void GetRecentApps(BMessage *refList, int32 maxCount)
@case A1 refList is NULL; maxCount == 0
@results R5: crashes
OBOS: should quietly do nothing.
*/
void
GetRecentTester::GetRecentAppsTestA2()
{
#if !TEST_R5
BRoster roster;
roster.GetRecentApps(NULL, 0);
#endif
}
/*
void GetRecentApps(BMessage *refList, int32 maxCount)
@case A1 refList is NULL; maxCount > 0
@results R5: crashes
OBOS: should quietly do nothing.
*/
void
GetRecentTester::GetRecentAppsTestA3()
{
#if !TEST_R5
BRoster roster;
roster.GetRecentApps(NULL, 10);
#endif
}
/*
void GetRecentApps(BMessage *refList, int32 maxCount)
@case A1 refList is valid; maxCount < 0
@results Should return zero recent apps
*/
void
GetRecentTester::GetRecentAppsTestB1()
{
BRoster roster;
BMessage msg;
CHK(launch_test_app(kControlApp, &kMultipleLaunchFlags) == B_OK);
roster.GetRecentApps(&msg, -1);
CHK(check_ref_count(&msg, 0) == B_OK);
}
/*
void GetRecentApps(BMessage *refList, int32 maxCount)
@case A1 refList is valid; maxCount == 0
@results Should return zero recent apps
*/
void
GetRecentTester::GetRecentAppsTestB2()
{
BRoster roster;
BMessage msg;
CHK(launch_test_app(kControlApp, &kMultipleLaunchFlags) == B_OK);
roster.GetRecentApps(&msg, 0);
CHK(check_ref_count(&msg, 0) == B_OK);
}
/*
void GetRecentApps(BMessage *refList, int32 maxCount)
@case A1 refList is valid; maxCount > 0
@results Should return maxCount apps
*/
void
GetRecentTester::GetRecentAppsTestB3()
{
BRoster roster;
BMessage msg;
CHK(launch_test_app(kControlApp, &kMultipleLaunchFlags) == B_OK);
roster.GetRecentApps(&msg, 1);
CHK(check_ref_count(&msg, 1) == B_OK);
}
/*
void GetRecentApps(BMessage *refList, int32 maxCount)
@case C1 Our control app is launched, followed by an application
with no BEOS:APP_FLAGS attribute.
@results The latter application should *not* appear at the top
of the recent apps list.
*/
void
GetRecentTester::GetRecentAppsTestC1()
{
BRoster roster;
BMessage msg;
entry_ref ref;
entry_ref appRef1;
entry_ref appRef2;
// Launch an app that *will* show up in the list
NextSubTest();
CHK(launch_test_app(kControlApp, &kMultipleLaunchFlags) == B_OK);
roster.GetRecentApps(&msg, 1);
CHK(msg.FindRef("refs", 0, &ref) == B_OK);
CHK(get_test_app_ref(kControlApp, &appRef1) == B_OK);
CHK(appRef1 == ref);
// Now launch an app with no app flags attribute that
// therefore shouldn't show up in the list
NextSubTest();
CHK(launch_test_app(kEmptyApp, NULL) == B_OK);
msg.MakeEmpty();
roster.GetRecentApps(&msg, 5);
CHK(msg.FindRef("refs", 0, &ref) == B_OK);
CHK(get_test_app_ref(kEmptyApp, &appRef2) == B_OK);
CHK(appRef2 != ref);
CHK(appRef1 == ref);
}
/*
void GetRecentApps(BMessage *refList, int32 maxCount)
@case C1 Our control app is launched, followed by an application
with a non-qualifying BEOS:APP_FLAGS attribute.
@results The latter application should *not* appear at the top
of the recent apps list.
*/
void
GetRecentTester::GetRecentAppsTestC2()
{
uint count = sizeof(kNonQualifyingFlags) / sizeof(int32);
for (uint i = 0; i < count; i++) {
BRoster roster;
BMessage msg;
entry_ref ref1;
entry_ref ref2;
entry_ref appRef1;
entry_ref appRef2;
// Launch an app that *will* show up in the list
NextSubTest();
CHK(launch_test_app(kControlApp, &kMultipleLaunchFlags) == B_OK);
roster.GetRecentApps(&msg, 1);
CHK(msg.FindRef("refs", 0, &ref1) == B_OK);
CHK(get_test_app_ref(kControlApp, &appRef1) == B_OK);
CHK(appRef1 == ref1);
// Now launch an app with a non-qualifying app flags attribute that
// therefore shouldn't show up in the list
NextSubTest();
CHK(launch_test_app(kNonQualifyingApp, &kNonQualifyingFlags[i]) == B_OK);
msg.MakeEmpty();
roster.GetRecentApps(&msg, 10); // Ask for 10, as R5 doesn't always return as many as requested
CHK(msg.FindRef("refs", 0, &ref1) == B_OK);
CHK(msg.FindRef("refs", 1, &ref2) == B_OK);
CHK(get_test_app_ref(kNonQualifyingApp, &appRef2) == B_OK);
CHK(appRef2 != ref1);
CHK(appRef2 != ref2);
CHK(appRef1 == ref1);
CHK(appRef1 != ref2);
}
}
/*
void GetRecentApps(BMessage *refList, int32 maxCount)
@case C3 Application with a non-qualifying BEOS:APP_FLAGS
attribute is launched.
@results Said application should *not* appear at the top
of the recent apps list.
*/
void
GetRecentTester::GetRecentAppsTestC3()
{
uint count = sizeof(kQualifyingFlags) / sizeof(int32);
for (uint i = 0; i < count; i++) {
BRoster roster;
BMessage msg;
entry_ref ref1;
entry_ref ref2;
entry_ref appRef1;
entry_ref appRef2;
// Launch an app that *will* show up in the list
NextSubTest();
CHK(launch_test_app(kControlApp, &kMultipleLaunchFlags) == B_OK);
roster.GetRecentApps(&msg, 1);
CHK(msg.FindRef("refs", 0, &ref1) == B_OK);
CHK(get_test_app_ref(kControlApp, &appRef1) == B_OK);
CHK(appRef1 == ref1);
// Now launch an app with a qualifying app flags attribute that
// therefore *should* show up in the list
NextSubTest();
CHK(launch_test_app(kQualifyingApp, &kQualifyingFlags[i]) == B_OK);
msg.MakeEmpty();
roster.GetRecentApps(&msg, 5);
CHK(msg.FindRef("refs", 0, &ref1) == B_OK);
CHK(msg.FindRef("refs", 1, &ref2) == B_OK);
CHK(get_test_app_ref(kQualifyingApp, &appRef2) == B_OK);
CHK(appRef2 == ref1);
CHK(appRef2 != ref2);
CHK(appRef1 != ref1);
CHK(appRef1 == ref2);
}
}
//------------------------------------------------------------------------------
// GetRecentDocuments()
//------------------------------------------------------------------------------
/*
void GetRecentDocuments(BMessage *refList, int32 maxCount,
const char *fileType, const char *appSig)
@case 1 refList is NULL; all other params are valid
@results Should quietly do nothing.
*/
void
GetRecentTester::GetRecentDocumentsTest1()
{
// R5 crashes if refList is NULL
#if !TEST_R5
BRoster roster;
roster.GetRecentDocuments(NULL, 1);
roster.GetRecentDocuments(NULL, 1, &test_types[0], 1, NULL);
#endif
}
/*
void GetRecentDocuments(BMessage *refList, int32 maxCount,
const char *fileType, const char *appSig)
@case 2 refList is non-NULL, maxCount is zero, fileType and
appSig are NULL.
@results R5: Returns one recent document.
OBOS: Returns an empty message
*/
void
GetRecentTester::GetRecentDocumentsTest2()
{
BRoster roster;
BMessage msg;
roster.GetRecentDocuments(&msg, 0);
#if TEST_R5
CHK(check_ref_count(&msg, 1) == B_OK);
#else
CHK(check_ref_count(&msg, 0) == B_OK);
#endif
}
/*
void GetRecentDocuments(BMessage *refList, int32 maxCount,
const char *fileType, const char *appSig)
@case 3 refList is non-NULL, maxCount is negative, fileType and
appSig are NULL.
@results R5: Returns one recent document.
OBOS: Returns an empty message
*/
void
GetRecentTester::GetRecentDocumentsTest3()
{
BRoster roster;
BMessage msg;
roster.GetRecentDocuments(&msg, -1);
#if TEST_R5
CHK(check_ref_count(&msg, 1) == B_OK);
#else
CHK(check_ref_count(&msg, 0) == B_OK);
#endif
}
/*
void GetRecentDocuments(BMessage *refList, int32 maxCount,
const char *fileType, const char *appSig)
@case 4 Four recent docs are added, with each pair having matching
app sigs and each pair of docs with-non matching app sigs
having matching file types. Get it?
@results When no app sig and a count of 4 is specified, the four folders
in reverse order are returned.
When the first app sig and a count of 4 is specified, the two
folders that match that sig are returned.
When the second app sig and a count of 4 is specified, the two
folders that match that sig are returned.
*/
void
GetRecentTester::GetRecentDocumentsTest4()
{
entry_ref doc1; // type1, sig1
entry_ref doc2; // type1, sig2
entry_ref doc3; // type2, sig1
entry_ref doc4; // type2, sig2
entry_ref doc5; // untyped, sig3
entry_ref recent1;
entry_ref recent2;
entry_ref recent3;
entry_ref recent4;
entry_ref recent5;
BRoster roster;
BMessage msg;
// ExecCommand("ls -l ", kTempDir);
// Add four entries with two different app sigs (note that
// docs 0 & 1 and 2 & 3 have matching file types). Then
// add an untyped entry with a totally different app sig.
CHK(get_test_ref(test_docs[0].name, &doc1) == B_OK);
CHK(get_test_ref(test_docs[1].name, &doc2) == B_OK);
CHK(get_test_ref(test_docs[2].name, &doc3) == B_OK);
CHK(get_test_ref(test_docs[3].name, &doc4) == B_OK);
CHK(get_test_ref(test_docs[4].name, &doc5) == B_OK);
roster.AddToRecentDocuments(&doc1, test_sigs[0]);
roster.AddToRecentDocuments(&doc2, test_sigs[1]);
roster.AddToRecentDocuments(&doc3, test_sigs[0]);
roster.AddToRecentDocuments(&doc4, test_sigs[1]);
roster.AddToRecentDocuments(&doc5, test_sigs[2]);
// NULL type, NULL sig
NextSubTest();
roster.GetRecentDocuments(&msg, 5);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 5) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(msg.FindRef("refs", 4, &recent5) == B_OK);
CHK(recent1 == doc5);
CHK(recent2 == doc4);
CHK(recent3 == doc3);
CHK(recent4 == doc2);
CHK(recent5 == doc1);
// type1, NULL sig
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[0]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc2);
CHK(recent2 == doc1);
// type2, NULL sig
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[1]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
// [type1], NULL sig
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[0], 1, NULL);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc2);
CHK(recent2 == doc1);
// [type2], NULL sig
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[1], 1, NULL);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
// [type1, type2], NULL sig
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types, 2, NULL);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 4) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc2);
CHK(recent4 == doc1);
//----------------------------------------------------------
// NULL type, sig1
NextSubTest();
roster.GetRecentDocuments(&msg, 5, NULL, test_sigs[0]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc3);
CHK(recent2 == doc1);
// NULL type, sig2
NextSubTest();
roster.GetRecentDocuments(&msg, 5, NULL, test_sigs[1]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc2);
// NULL type, sig3
NextSubTest();
roster.GetRecentDocuments(&msg, 5, NULL, test_sigs[2]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == doc5);
// type1, sig1
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[0], test_sigs[0]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc3);
CHK(recent2 == doc2);
CHK(recent3 == doc1);
// type1, sig2
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[0], test_sigs[1]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc2);
CHK(recent3 == doc1);
// type1, sig3
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[0], test_sigs[2]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc5);
CHK(recent2 == doc2);
CHK(recent3 == doc1);
// type2, sig1
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[1], test_sigs[0]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc1);
// type2, sig2
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[1], test_sigs[1]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc2);
// type2, sig3
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types[1], test_sigs[2]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc5);
CHK(recent2 == doc4);
CHK(recent3 == doc3);
//---------
// [type1], sig1
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[0], 1, test_sigs[0]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc3);
CHK(recent2 == doc2);
CHK(recent3 == doc1);
// [type1], sig2
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[0], 1, test_sigs[1]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc2);
CHK(recent3 == doc1);
// [type1], sig3
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[0], 1, test_sigs[2]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc5);
CHK(recent2 == doc2);
CHK(recent3 == doc1);
// [type2], sig1
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[1], 1, test_sigs[0]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc1);
// [type2], sig2
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[1], 1, test_sigs[1]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc2);
// [type2], sig3
NextSubTest();
roster.GetRecentDocuments(&msg, 5, &test_types[1], 1, test_sigs[2]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 3) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(recent1 == doc5);
CHK(recent2 == doc4);
CHK(recent3 == doc3);
// [type1, type2], sig1
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types, 2, test_sigs[0]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 4) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc2);
CHK(recent4 == doc1);
// [type1, type2], sig2
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types, 2, test_sigs[1]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 4) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc2);
CHK(recent4 == doc1);
// [type1, type2], sig3
NextSubTest();
roster.GetRecentDocuments(&msg, 5, test_types, 2, test_sigs[2]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 5) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(msg.FindRef("refs", 4, &recent5) == B_OK);
CHK(recent1 == doc5);
CHK(recent2 == doc4);
CHK(recent3 == doc3);
CHK(recent4 == doc2);
CHK(recent5 == doc1);
}
/*
void GetRecentDocuments(BMessage *refList, int32 maxCount,
const char *fileType, const char *appSig)
@case 5 Six recent folders are added, two of which are duplicates
under different app sigs.
@results A request for the four duplicates should return the
four non-duplicates.
*/
void
GetRecentTester::GetRecentDocumentsTest5()
{
entry_ref doc1;
entry_ref doc2;
entry_ref doc3;
entry_ref doc4;
entry_ref recent1;
entry_ref recent2;
entry_ref recent3;
entry_ref recent4;
BRoster roster;
BMessage msg;
// Add two entries twice with different app sigs
CHK(get_test_ref(test_docs[0].name, &doc1) == B_OK);
CHK(get_test_ref(test_docs[1].name, &doc2) == B_OK);
CHK(get_test_ref(test_docs[2].name, &doc3) == B_OK);
CHK(get_test_ref(test_docs[3].name, &doc4) == B_OK);
roster.AddToRecentDocuments(&doc1, test_sigs[4]);
roster.AddToRecentDocuments(&doc2, test_sigs[5]);
roster.AddToRecentDocuments(&doc3, test_sigs[4]);
roster.AddToRecentDocuments(&doc4, test_sigs[5]);
roster.AddToRecentDocuments(&doc3, test_sigs[6]);
roster.AddToRecentDocuments(&doc4, test_sigs[7]);
// Verify our duplicates exist
NextSubTest();
roster.GetRecentDocuments(&msg, 1, NULL, test_sigs[7]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == doc4);
NextSubTest();
roster.GetRecentDocuments(&msg, 1, NULL, test_sigs[6]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == doc3);
NextSubTest();
roster.GetRecentDocuments(&msg, 1, NULL, test_sigs[5]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == doc4);
NextSubTest();
roster.GetRecentDocuments(&msg, 1, NULL, test_sigs[4]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == doc3);
// Verify that duplicates are not returned
NextSubTest();
roster.GetRecentDocuments(&msg, 4);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 4) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(recent1 == doc4);
CHK(recent2 == doc3);
CHK(recent3 == doc2);
CHK(recent4 == doc1);
}
//------------------------------------------------------------------------------
// GetRecentFolders()
//------------------------------------------------------------------------------
/*
void GetRecentFolders(BMessage *refList, int32 maxCount, const char *appSig)
@case 1 refList is NULL; maxCount is valid, appSig is NULL.
@results Should quietly do nothing.
*/
void
GetRecentTester::GetRecentFoldersTest1()
{
// R5 crashes if refList is NULL
#if !TEST_R5
BRoster roster;
roster.GetRecentFolders(NULL, 1);
#endif
}
/*
void GetRecentFolders(BMessage *refList, int32 maxCount, const char *appSig)
@case 2 refList is valid, maxCount is negative, appSig is NULL.
@results R5: Returns one recent document.
OBOS: Returns an empty message
*/
void
GetRecentTester::GetRecentFoldersTest2()
{
entry_ref folder1;
entry_ref folder2;
entry_ref recent1;
entry_ref recent2;
BRoster roster;
BMessage msg;
CHK(get_test_ref(test_folders[0], &folder1) == B_OK);
CHK(get_test_ref(test_folders[1], &folder2) == B_OK);
roster.AddToRecentFolders(&folder1, NULL);
roster.GetRecentFolders(&msg, -1);
// msg.PrintToStream();
#ifdef TEST_R5
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == folder1);
#else
CHK(check_ref_count(&msg, 0) == B_OK);
#endif
}
/*
void GetRecentFolders(BMessage *refList, int32 maxCount, const char *appSig)
@case 3 refList is valid, maxCount is zero, appSig is NULL.
@results R5: Returns one recent document.
OBOS: Returns an empty message
*/
void
GetRecentTester::GetRecentFoldersTest3()
{
entry_ref folder1;
entry_ref folder2;
entry_ref recent1;
entry_ref recent2;
BRoster roster;
BMessage msg;
CHK(get_test_ref(test_folders[0], &folder1) == B_OK);
CHK(get_test_ref(test_folders[1], &folder2) == B_OK);
roster.AddToRecentFolders(&folder1, NULL);
roster.GetRecentFolders(&msg, 0);
// msg.PrintToStream();
#ifdef TEST_R5
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == folder1);
#else
CHK(check_ref_count(&msg, 0) == B_OK);
#endif
}
/*
void GetRecentFolders(BMessage *refList, int32 maxCount, const char *appSig)
@case 4 Four recent folders are added, with each pair having matching
app sigs.
@results When no app sig and a count of 4 is specified, the four folders
in reverse order are returned.
When the first app sig and a count of 4 is specified, the two
folders that match that sig are returned.
When the second app sig and a count of 4 is specified, the two
folders that match that sig are returned.
*/
void
GetRecentTester::GetRecentFoldersTest4()
{
entry_ref folder1;
entry_ref folder2;
entry_ref folder3;
entry_ref folder4;
entry_ref recent1;
entry_ref recent2;
entry_ref recent3;
entry_ref recent4;
BRoster roster;
BMessage msg;
// ExecCommand("ls -l ", kTempDir);
// Add four entries with two different app sigs
CHK(get_test_ref(test_folders[0], &folder1) == B_OK);
CHK(get_test_ref(test_folders[1], &folder2) == B_OK);
CHK(get_test_ref(test_folders[2], &folder3) == B_OK);
CHK(get_test_ref(test_folders[3], &folder4) == B_OK);
roster.AddToRecentFolders(&folder1, test_sigs[0]);
roster.AddToRecentFolders(&folder2, test_sigs[1]);
roster.AddToRecentFolders(&folder3, test_sigs[0]);
roster.AddToRecentFolders(&folder4, test_sigs[1]);
NextSubTest();
roster.GetRecentFolders(&msg, 4, NULL);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 4) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(recent1 == folder4);
CHK(recent2 == folder3);
CHK(recent3 == folder2);
CHK(recent4 == folder1);
NextSubTest();
roster.GetRecentFolders(&msg, 4, test_sigs[0]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == folder3);
CHK(recent2 == folder1);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentFolders(&msg, 4, test_sigs[1]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 2) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == folder4);
CHK(recent2 == folder2);
}
/*
void GetRecentFolders(BMessage *refList, int32 maxCount, const char *appSig)
@case 5 Six recent folders are added, two of which are duplicates
under different app sigs.
@results A request for the four duplicates should return the
four non-duplicates.
*/
void
GetRecentTester::GetRecentFoldersTest5()
{
entry_ref folder1;
entry_ref folder2;
entry_ref folder3;
entry_ref folder4;
entry_ref recent1;
entry_ref recent2;
entry_ref recent3;
entry_ref recent4;
BRoster roster;
BMessage msg;
// Add two entries twice with different app sigs
CHK(get_test_ref(test_folders[0], &folder1) == B_OK);
CHK(get_test_ref(test_folders[1], &folder2) == B_OK);
CHK(get_test_ref(test_folders[2], &folder3) == B_OK);
CHK(get_test_ref(test_folders[3], &folder4) == B_OK);
roster.AddToRecentFolders(&folder1, test_sigs[4]);
roster.AddToRecentFolders(&folder2, test_sigs[5]);
roster.AddToRecentFolders(&folder3, test_sigs[4]);
roster.AddToRecentFolders(&folder4, test_sigs[5]);
roster.AddToRecentFolders(&folder3, test_sigs[6]);
roster.AddToRecentFolders(&folder4, test_sigs[7]);
// Verify our duplicates exist
NextSubTest();
roster.GetRecentFolders(&msg, 1, test_sigs[7]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == folder4);
NextSubTest();
roster.GetRecentFolders(&msg, 1, test_sigs[6]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == folder3);
NextSubTest();
roster.GetRecentFolders(&msg, 1, test_sigs[5]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == folder4);
NextSubTest();
roster.GetRecentFolders(&msg, 1, test_sigs[4]);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 1) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(recent1 == folder3);
// Verify that duplicates are not returned
NextSubTest();
roster.GetRecentFolders(&msg, 4, NULL);
// msg.PrintToStream();
CHK(check_ref_count(&msg, 4) == B_OK);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(msg.FindRef("refs", 2, &recent3) == B_OK);
CHK(msg.FindRef("refs", 3, &recent4) == B_OK);
CHK(recent1 == folder4);
CHK(recent2 == folder3);
CHK(recent3 == folder2);
CHK(recent4 == folder1);
}
void
GetRecentTester::RecentListsLoadSaveClearTest()
{
#ifdef TEST_R5
Outputf("(no tests actually performed for R5 version)\n");
#else
entry_ref doc1;
entry_ref doc2;
entry_ref folder1;
entry_ref folder2;
entry_ref app1;
entry_ref app2;
const char *appSig1 = kRecentAppsTestAppSigs[kQualifyingApp];
const char *appSig2 = kRecentAppsTestAppSigs[kControlApp];
entry_ref recent1;
entry_ref recent2;
BRoster roster;
BMessage msg;
//--------------------------------------------------------------------
// Add a few docs, folders, and apps. Check that they're there.
// Save the to disk. Clear. Check that the lists are empty.
// Load from disk. Check that things look like they used
// to.
//--------------------------------------------------------------------
// Add
CHK(get_test_ref(test_docs[0].name, &doc1) == B_OK);
CHK(get_test_ref(test_docs[1].name, &doc2) == B_OK);
CHK(get_test_ref(test_folders[0], &folder1) == B_OK);
CHK(get_test_ref(test_folders[1], &folder2) == B_OK);
CHK(get_test_app_ref(kQualifyingApp, &app1) == B_OK);
CHK(get_test_app_ref(kControlApp, &app2) == B_OK);
CHK(set_test_app_attributes(&app1, kRecentAppsTestAppSigs[kQualifyingApp],
&kMultipleLaunchFlags) == B_OK);
CHK(set_test_app_attributes(&app2, kRecentAppsTestAppSigs[kControlApp],
&kMultipleLaunchFlags) == B_OK);
roster.AddToRecentDocuments(&doc1, test_sigs[0]);
roster.AddToRecentDocuments(&doc2, test_sigs[1]);
roster.AddToRecentFolders(&folder1, test_sigs[0]);
roster.AddToRecentFolders(&folder2, test_sigs[1]);
BRoster::Private(roster).AddToRecentApps(appSig1);
BRoster::Private(roster).AddToRecentApps(appSig2);
// Check #1
NextSubTest();
msg.MakeEmpty();
roster.GetRecentDocuments(&msg, 2);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc2);
CHK(recent2 == doc1);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentFolders(&msg, 2);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == folder2);
CHK(recent2 == folder1);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentApps(&msg, 2);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == app2);
CHK(recent2 == app1);
// Save to disk and clear
NextSubTest();
BRoster::Private(roster).SaveRecentLists(kTempSaveFile);
BRoster::Private(roster).ClearRecentDocuments();
BRoster::Private(roster).ClearRecentFolders();
BRoster::Private(roster).ClearRecentApps();
// Check #2
NextSubTest();
msg.MakeEmpty();
roster.GetRecentDocuments(&msg, 2);
CHK(check_ref_count(&msg, 0) == B_OK);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentFolders(&msg, 2);
CHK(check_ref_count(&msg, 0) == B_OK);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentApps(&msg, 2);
CHK(check_ref_count(&msg, 0) == B_OK);
// Load back from disk
NextSubTest();
BRoster::Private(roster).LoadRecentLists(kTempSaveFile);
// Check #3
NextSubTest();
msg.MakeEmpty();
roster.GetRecentDocuments(&msg, 2);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == doc2);
CHK(recent2 == doc1);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentFolders(&msg, 2);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == folder2);
CHK(recent2 == folder1);
NextSubTest();
msg.MakeEmpty();
roster.GetRecentApps(&msg, 2);
CHK(msg.FindRef("refs", 0, &recent1) == B_OK);
CHK(msg.FindRef("refs", 1, &recent2) == B_OK);
CHK(recent1 == app2);
CHK(recent2 == app1);
#endif // ifdef TEST_R5 else
}
void
GetRecentTester::setUp()
{
status_t err = B_OK;
BDirectory tempDir;
// Create our base folder for test entries
if (!BEntry(kTempDir).Exists()) {
BDirectory rootDir;
err = rootDir.SetTo(kTempDirRoot);
if (!err)
err = rootDir.CreateDirectory(kTempDir, &tempDir);
if (!err)
err = tempDir.InitCheck();
if (err) {
printf("WARNING: Unable to create temp directory for BRoster::GetRecent*() tests, error "
"== 0x%lx. It's entirely possible that most of these tests will fail because "
"of this\n", err);
return;
}
}
// Create our test documents
if (!err) {
int count = sizeof(test_docs) / sizeof(test_doc);
for (int i = 0; !err && i < count; i++) {
BFile file;
char filename[B_PATH_NAME_LENGTH];
sprintf(filename, "%s/%s", kTempDir, test_docs[i].name);
ExecCommand("touch ", filename);
err = file.SetTo(filename, B_READ_WRITE);
// For some reason, only the first CreateFile() call works with R5. None
// work with OBOS...
/*
err = tempDir.CreateFile(test_docs[i].name, &file);
if (!err)
err = file.InitCheck();
*/
// Write its type (if necessary)
if (!err && test_docs[i].type) {
int len = strlen(test_docs[i].type)+1;
ssize_t bytes = file.WriteAttr(kTypeAttr, B_MIME_STRING_TYPE, 0,
test_docs[i].type, len);
if (bytes >= 0)
err = bytes == len ? B_OK : B_FILE_ERROR;
else
err = bytes;
}
}
}
// Create our test folders
if (!err) {
int count = sizeof(test_folders) / sizeof(char*);
for (int i = 0; !err && i < count; i++) {
// For some reason, only the first CreateFile() call works with R5
char dirname[B_PATH_NAME_LENGTH];
sprintf(dirname, "%s/%s", kTempDir, test_folders[i]);
if (!BEntry(dirname).Exists())
ExecCommand("mkdir ", dirname);
/*
err = tempDir.CreateDirectory(test_folders[i], NULL);
if (err == B_FILE_EXISTS)
err = B_OK;
*/
}
}
// Let the user know if we hit an error
if (err) {
printf("WARNING: Error encountered while creating test files and/or folders, error "
"code == 0x%lx. It's entirely possible that most or all of these tests will "
"fail now because of this\n", err);
}
}
void
GetRecentTester::tearDown()
{
// Remove the folder containing all of our test files
if (BEntry(kTempDir).Exists())
ExecCommand("rm -rf ", kTempDir);
}
Test* GetRecentTester::Suite()
{
TestSuite* SuiteOfTests = new TestSuite;
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestA1);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestA2);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestA3);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestB1);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestB2);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestB3);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestC1);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestC2);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentAppsTestC3);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentDocumentsTest1);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentDocumentsTest2);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentDocumentsTest3);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentDocumentsTest4);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentDocumentsTest5);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentFoldersTest1);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentFoldersTest2);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentFoldersTest3);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentFoldersTest4);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, GetRecentFoldersTest5);
ADD_TEST4(BRoster, SuiteOfTests, GetRecentTester, RecentListsLoadSaveClearTest);
return SuiteOfTests;
}