Added remaining BRoster::FindApp() tests.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1099 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2002-09-20 21:53:13 +00:00
parent e690855c7b
commit 66ca3e0417
3 changed files with 660 additions and 305 deletions

View File

@ -148,17 +148,47 @@ case 15:mimeType is installed, but has no preferred application,
Should return B_OK and set the ref to refer to the application Should return B_OK and set the ref to refer to the application
executable associated with the preferred app of the supertype. executable associated with the preferred app of the supertype.
Should set the app hint on the app type. Should set the app hint on the app type.
case 16:installed type mimeType, preferred app, app type not installed,
app has signature, app is trash =>
Should return B_LAUNCH_FAILED_APP_IN_TRASH.
status_t FindApp(entry_ref *ref, entry_ref *app) const status_t FindApp(entry_ref *ref, entry_ref *app) const
case 1: ref or app are NULL => case 1: ref or app are NULL =>
Should return B_BAD_VALUE. Should return B_BAD_VALUE.
case 2: ref doesn't refer to an existing entry => case 2: ref doesn't refer to an existing entry =>
Should return B_ENTRY_NOT_FOUND. Should return B_ENTRY_NOT_FOUND.
cases: ref is valid, file has no type, sniffing results in a type, case 3: ref is valid, file has type and preferred app, preferred app is in
trash =>
Should return B_LAUNCH_FAILED_APP_IN_TRASH.
case 4: ref is valid, file has type and preferred app, app type is not
installed, app exists and has signature =>
Should return B_OK and set the ref to refer to the file's (not the
file type's) preferred application's executable. Should install the
app type and set the app hint on it.
case 5: ref is valid, file has no type, but preferred app, app type is not
installed, app exists and has signature =>
Should return B_OK and set the ref to refer to the application's
executable. Should install the app type and set the app hint on it.
case 6: ref is valid, file has type and app hint, the type's preferred app
type is not installed, app exists and has signature =>
Should return B_OK and set the ref to refer to the file type's
preferred application's executable. Should install the app type and
set the app hint on it.
case 7: ref is valid, file has type, the type's preferred app
type is not installed, app exists and has signature, file is
executable =>
Should return B_OK and set the ref to refer to the file.
Should not set the app hint on the app or file type (Why?).
case 8: ref is valid and refers to a link to a file, file has type,
the type's preferred app type is not installed,
app exists and has signature =>
Should return B_OK and set the ref to refer to the file type's
preferred application's executable. Should install the app type and
set the app hint on it.
case 9: ref is valid, file has type,
FindApp(const char*, entry_ref*) cases 3-16 (== common cases 1-14)
case 10:ref is valid, file has no type, sniffing results in a type,
type is set on file, type is set on file,
FindApp(const char*, entry_ref*) cases 2-15 FindApp(const char*, entry_ref*) cases 4-16 (== common cases 2-14)
cases: ref is valid, file has type,
FindApp(const char*, entry_ref*) cases 2-15
INVESTIGATE: NodeInfo::GetAppHint()/GetPreferredApp()/
BMimeType::GetPreferredApp()

View File

@ -14,6 +14,7 @@
#include <AppFileInfo.h> #include <AppFileInfo.h>
#include <Application.h> #include <Application.h>
#include <File.h> #include <File.h>
#include <FindDirectory.h>
#include <Handler.h> #include <Handler.h>
#include <Looper.h> #include <Looper.h>
#include <Path.h> #include <Path.h>
@ -46,23 +47,46 @@ static const char *textTestType = "text/x-vnd.obos-roster-findapp";
static const char *testDir = "/tmp/testdir"; static const char *testDir = "/tmp/testdir";
static const char *appFile1 = "/tmp/testdir/app1"; static const char *appFile1 = "/tmp/testdir/app1";
static const char *appFile2 = "/tmp/testdir/app2"; static const char *appFile2 = "/tmp/testdir/app2";
static const char *testFile1 = "/tmp/testdir/testFile1";
static const char *testLink1 = "/tmp/testdir/testLink1";
static const char *trashAppName = "roster-findapp-app";
// get_trash_app_file
static
const char*
get_trash_app_file()
{
static char trashAppFile[B_PATH_NAME_LENGTH];
static bool initialized = false;
if (!initialized) {
BPath path;
CHK(find_directory(B_TRASH_DIRECTORY, &path) == B_OK);
CHK(path.Append(trashAppName) == B_OK);
strcpy(trashAppFile, path.Path());
initialized = true;
}
return trashAppFile;
}
// install_type // install_type
static static
void void
install_type(const char *type, const char *preferredApp = NULL) install_type(const char *type, const char *preferredApp = NULL,
const char *snifferRule = NULL)
{ {
BMimeType mimeType(type); BMimeType mimeType(type);
if (!mimeType.IsInstalled())
CHK(mimeType.Install() == B_OK); CHK(mimeType.Install() == B_OK);
if (preferredApp) if (preferredApp)
CHK(mimeType.SetPreferredApp(preferredApp) == B_OK); CHK(mimeType.SetPreferredApp(preferredApp) == B_OK);
if (snifferRule)
CHK(mimeType.SetSnifferRule(snifferRule) == B_OK);
} }
// ref_for_file // ref_for_path
static static
entry_ref entry_ref
ref_for_file(const char *filename) ref_for_path(const char *filename)
{ {
entry_ref ref; entry_ref ref;
BEntry entry; BEntry entry;
@ -91,6 +115,34 @@ create_app(const char *filename, const char *signature = NULL,
} }
} }
// create_file
static
entry_ref
create_file(const char *filename, const char *type,
const char *preferredApp = NULL, const char *appHintPath = NULL,
const char *contents = NULL)
{
if (contents)
system((string("echo -n \"") + contents + "\" > " + filename).c_str());
else
system((string("touch ") + filename).c_str());
if (type || preferredApp || appHintPath) {
BFile file;
CHK(file.SetTo(filename, B_READ_WRITE) == B_OK);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&file) == B_OK);
if (type)
CHK(nodeInfo.SetType(type) == B_OK);
if (preferredApp)
CHK(nodeInfo.SetPreferredApp(preferredApp) == B_OK);
if (appHintPath) {
entry_ref appHint(ref_for_path(appHintPath));
CHK(nodeInfo.SetAppHint(&appHint) == B_OK);
}
}
return ref_for_path(filename);
}
// check_app_type // check_app_type
static static
void void
@ -101,7 +153,7 @@ check_app_type(const char *signature, const char *filename)
if (filename) { if (filename) {
entry_ref appHint; entry_ref appHint;
CHK(type.GetAppHint(&appHint) == B_OK); CHK(type.GetAppHint(&appHint) == B_OK);
CHK(ref_for_file(filename) == appHint); CHK(ref_for_path(filename) == appHint);
} }
} }
@ -137,7 +189,7 @@ set_type_app_hint(const char *signature, const char *filename)
BMimeType type(signature); BMimeType type(signature);
if (!type.IsInstalled()); if (!type.IsInstalled());
CHK(type.Install() == B_OK); CHK(type.Install() == B_OK);
entry_ref fileRef(ref_for_file(filename)); entry_ref fileRef(ref_for_path(filename));
CHK(type.SetAppHint(&fileRef) == B_OK); CHK(type.SetAppHint(&fileRef) == B_OK);
} }
@ -161,8 +213,321 @@ FindAppTester::tearDown()
BMimeType(textTestType).Delete(); BMimeType(textTestType).Delete();
delete fApplication; delete fApplication;
system((string("rm -rf ") + testDir).c_str()); system((string("rm -rf ") + testDir).c_str());
system((string("rm -f ") + get_trash_app_file()).c_str());
} }
// FindAppCaller
class FindAppCaller {
public:
virtual status_t operator()(const char *type, entry_ref *ref) = 0;
};
/*
@case 1 uninstalled type mimeType
@results Should return B_LAUNCH_FAILED_APP_NOT_FOUND.
*/
static
void
CommonFindAppTest1(FindAppCaller &caller)
{
BRoster roster;
entry_ref ref;
CHK(caller(uninstalledType, &ref) == B_LAUNCH_FAILED_APP_NOT_FOUND);
}
/*
@case 2 installed type mimeType, no preferred app
@results Should return B_LAUNCH_FAILED_NO_PREFERRED_APP.
*/
static
void
CommonFindAppTest2(FindAppCaller &caller)
{
BRoster roster;
install_type(fileType1);
entry_ref ref;
CHK(caller(fileType1, &ref) == B_LAUNCH_FAILED_NO_PREFERRED_APP);
}
/*
@case 3 installed type mimeType, preferred app, app type not
installed, app has no signature
@results Should return B_LAUNCH_FAILED_APP_NOT_FOUND.
*/
static
void
CommonFindAppTest3(FindAppCaller &caller)
{
BRoster roster;
install_type(fileType1, appType1);
entry_ref ref;
CHK(caller(fileType1, &ref) == B_LAUNCH_FAILED_APP_NOT_FOUND);
}
/*
@case 4 installed type mimeType, preferred app, app type not
installed, app has signature
@results Should return B_OK and set the ref to refer to the
application's executable. Should install the app type and
set the app hint on it.
*/
static
void
CommonFindAppTest4(FindAppCaller &caller)
{
BRoster roster;
create_app(appFile1, appType1);
install_type(fileType1, appType1);
entry_ref ref;
CHK(caller(fileType1, &ref) == B_OK);
CHK(ref_for_path(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
@case 5 installed type mimeType, preferred app, app type installed,
app has signature
@results Should return B_OK and set the ref to refer to the
application'sexecutable. Should set the app hint on the
app type.
*/
static
void
CommonFindAppTest5(FindAppCaller &caller)
{
BRoster roster;
create_app(appFile1, appType1, true);
install_type(fileType1, appType1);
entry_ref ref;
CHK(caller(fileType1, &ref) == B_OK);
CHK(ref_for_path(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
@case 6 installed type mimeType, preferred app, app type installed,
app has signature, app has no execute permission
@results Should return B_OK and set the ref to refer to the
application's executable. Should set the app hint on the
app type.
*/
static
void
CommonFindAppTest6(FindAppCaller &caller)
{
BRoster roster;
create_app(appFile1, appType1, true, false);
install_type(fileType1, appType1);
entry_ref ref;
CHK(caller(fileType1, &ref) == B_OK);
CHK(ref_for_path(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
@case 7 installed type mimeType, preferred app, app type installed,
two apps have the signature
@results Should return B_OK and set the ref to refer to the
application executable with the most recent modification
time. Should set the app hint on the app type.
*/
static
void
CommonFindAppTest7(FindAppCaller &caller)
{
BRoster roster;
create_app(appFile1, appType1);
create_app(appFile2, appType1, true);
set_file_time(appFile2, time(NULL) + 1);
install_type(fileType1, appType1);
entry_ref ref;
CHK(caller(fileType1, &ref) == B_OK);
CHK(ref_for_path(appFile2) == ref);
check_app_type(appType1, appFile2);
}
/*
@case 8 installed type mimeType, preferred app, app type installed,
two apps have the signature, one has a version info, the
other one is newer
@results Should return B_OK and set the ref to refer to the
application executable with version info. Should set the
app hint on the app type.
*/
static
void
CommonFindAppTest8(FindAppCaller &caller)
{
BRoster roster;
create_app(appFile1, appType1);
set_version(appFile1, 1);
create_app(appFile2, appType1, true);
set_file_time(appFile2, time(NULL) + 1);
install_type(fileType1, appType1);
entry_ref ref;
CHK(caller(fileType1, &ref) == B_OK);
CHK(ref_for_path(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
@case 9 installed type mimeType, preferred app, app type installed,
two apps have the signature, both apps have a version info
@results Should return B_OK and set the ref to refer to the
application executable with the greater version. Should
set the app hint on the app type.
*/
static
void
CommonFindAppTest9(FindAppCaller &caller)
{
BRoster roster;
create_app(appFile1, appType1);
set_version(appFile1, 2);
create_app(appFile2, appType1, true);
set_version(appFile1, 1);
set_file_time(appFile2, time(NULL) + 1);
install_type(fileType1, appType1);
entry_ref ref;
CHK(caller(fileType1, &ref) == B_OK);
CHK(ref_for_path(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
@case 10 installed type mimeType, preferred app, app type installed,
preferred app type has an app hint that points to an app
with a different signature
@results Should return B_OK and set the ref to refer to the
application's executable. Should remove the incorrect app
hint on the app type. (OBOS: Should set the correct app
hint. Don't even return the wrong app?)
*/
static
void
CommonFindAppTest10(FindAppCaller &caller)
{
BRoster roster;
create_app(appFile1, appType2);
set_type_app_hint(appType1, appFile1);
entry_ref appHint;
CHK(BMimeType(appType1).GetAppHint(&appHint) == B_OK);
install_type(fileType1, appType1);
entry_ref ref;
CHK(caller(fileType1, &ref) == B_OK);
CHK(ref_for_path(appFile1) == ref);
CHK(BMimeType(appType1).GetAppHint(&appHint) == B_ENTRY_NOT_FOUND);
CHK(BMimeType(appType2).IsInstalled() == false);
}
/*
@case 11 installed type mimeType, preferred app, app type installed,
preferred app type has an app hint pointing to void,
a differently named app with this signature exists
@results Should return B_OK and set the ref to refer to the
application's executable. Should update the app
hint on the app type.
*/
static
void
CommonFindAppTest11(FindAppCaller &caller)
{
BRoster roster;
create_app(appFile1, appType1);
set_type_app_hint(appType1, appFile2);
install_type(fileType1, appType1);
entry_ref ref;
CHK(caller(fileType1, &ref) == B_OK);
CHK(ref_for_path(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
@case 12 mimeType is app signature, not installed
@results Should return B_OK and set the ref to refer to the
application executable. Should set the app hint on the
app type.
*/
static
void
CommonFindAppTest12(FindAppCaller &caller)
{
BRoster roster;
create_app(appFile1, appType1);
entry_ref ref;
CHK(caller(appType1, &ref) == B_OK);
CHK(ref_for_path(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
@case 13 mimeType is installed, but has no preferred application,
super type has preferred application
@results Should return B_OK and set the ref to refer to the
application executable associated with the preferred app
of the supertype. Should set the app hint on the app type.
*/
static
void
CommonFindAppTest13(FindAppCaller &caller)
{
BRoster roster;
// make sure, the original preferred app for the "text" supertype is
// re-installed
struct TextTypeSaver {
TextTypeSaver()
{
BMimeType textType("text");
hasPreferredApp
= (textType.GetPreferredApp(preferredApp) == B_OK);
}
~TextTypeSaver()
{
BMimeType textType("text");
textType.SetPreferredApp(hasPreferredApp ? preferredApp : NULL);
}
bool hasPreferredApp;
char preferredApp[B_MIME_TYPE_LENGTH];
} _saver;
create_app(appFile1, appType1);
CHK(BMimeType("text").SetPreferredApp(appType1) == B_OK);
install_type(textTestType);
entry_ref ref;
CHK(caller(textTestType, &ref) == B_OK);
CHK(ref_for_path(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
@case 14 installed type mimeType, preferred app, app type not installed,
app has signature, app is trash
@results Should return B_LAUNCH_FAILED_APP_IN_TRASH.
*/
static
void
CommonFindAppTest14(FindAppCaller &caller)
{
BRoster roster;
create_app(get_trash_app_file(), appType1);
install_type(fileType1, appType1);
entry_ref ref;
CHK(caller(fileType1, &ref) == B_LAUNCH_FAILED_APP_IN_TRASH);
}
typedef void commonTestFunction(FindAppCaller &caller);
static commonTestFunction *commonTestFunctions[] = {
CommonFindAppTest1, CommonFindAppTest2, CommonFindAppTest3,
CommonFindAppTest4, CommonFindAppTest5, CommonFindAppTest6,
CommonFindAppTest7, CommonFindAppTest8, CommonFindAppTest9,
CommonFindAppTest10, CommonFindAppTest11, CommonFindAppTest12,
CommonFindAppTest13, CommonFindAppTest14
};
static int32 commonTestFunctionCount
= sizeof(commonTestFunctions) / sizeof(commonTestFunction*);
/* /*
status_t FindApp(const char *mimeType, entry_ref *app) const status_t FindApp(const char *mimeType, entry_ref *app) const
@case 1 mimeType or app are NULL @case 1 mimeType or app are NULL
@ -192,282 +557,247 @@ void FindAppTester::FindAppTestA2()
CHK(roster.FindApp("invalid/mine/type", &ref) == B_BAD_VALUE); CHK(roster.FindApp("invalid/mine/type", &ref) == B_BAD_VALUE);
} }
// FindAppTypeCaller
class FindAppTypeCaller : public FindAppCaller {
public:
virtual status_t operator()(const char *type, entry_ref *ref)
{
BRoster roster;
return roster.FindApp(type, ref);
}
};
/* /*
status_t FindApp(const char *mimeType, entry_ref *app) const status_t FindApp(entry_ref *ref, entry_ref *app) const
@case 3 uninstalled type mimeType @case 3 FindApp(const char*, entry_ref*) cases 3-16
@results Should return B_LAUNCH_FAILED_APP_NOT_FOUND. (== common cases 1-14)
*/ */
void FindAppTester::FindAppTestA3() void FindAppTester::FindAppTestA3()
{ {
BRoster roster; FindAppTypeCaller caller;
entry_ref ref; for (int32 i = 0; i < commonTestFunctionCount; i++) {
CHK(roster.FindApp(uninstalledType, &ref) NextSubTest();
== B_LAUNCH_FAILED_APP_NOT_FOUND); (*commonTestFunctions[i])(caller);
} tearDown();
setUp();
/*
status_t FindApp(const char *mimeType, entry_ref *app) const
@case 4 installed type mimeType, no preferred app
@results Should return B_LAUNCH_FAILED_NO_PREFERRED_APP.
*/
void FindAppTester::FindAppTestA4()
{
BRoster roster;
install_type(fileType1);
entry_ref ref;
CHK(roster.FindApp(fileType1, &ref) == B_LAUNCH_FAILED_NO_PREFERRED_APP);
}
/*
status_t FindApp(const char *mimeType, entry_ref *app) const
@case 5 installed type mimeType, preferred app, app type not
installed, app has no signature
@results Should return B_LAUNCH_FAILED_APP_NOT_FOUND.
*/
void FindAppTester::FindAppTestA5()
{
BRoster roster;
install_type(fileType1, appType1);
entry_ref ref;
CHK(roster.FindApp(fileType1, &ref) == B_LAUNCH_FAILED_APP_NOT_FOUND);
}
/*
status_t FindApp(const char *mimeType, entry_ref *app) const
@case 6 installed type mimeType, preferred app, app type not
installed, app has signature
@results Should return B_OK and set the ref to refer to the
application's executable. Should install the app type and
set the app hint on it.
*/
void FindAppTester::FindAppTestA6()
{
BRoster roster;
create_app(appFile1, appType1);
install_type(fileType1, appType1);
entry_ref ref;
CHK(roster.FindApp(fileType1, &ref) == B_OK);
CHK(ref_for_file(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
status_t FindApp(const char *mimeType, entry_ref *app) const
@case 7 installed type mimeType, preferred app, app type installed,
app has signature
@results Should return B_OK and set the ref to refer to the
application'sexecutable. Should set the app hint on the
app type.
*/
void FindAppTester::FindAppTestA7()
{
BRoster roster;
create_app(appFile1, appType1, true);
install_type(fileType1, appType1);
entry_ref ref;
CHK(roster.FindApp(fileType1, &ref) == B_OK);
CHK(ref_for_file(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
status_t FindApp(const char *mimeType, entry_ref *app) const
@case 8 installed type mimeType, preferred app, app type installed,
app has signature, app has no execute permission
@results Should return B_OK and set the ref to refer to the
application's executable. Should set the app hint on the
app type.
*/
void FindAppTester::FindAppTestA8()
{
BRoster roster;
create_app(appFile1, appType1, true, false);
install_type(fileType1, appType1);
entry_ref ref;
CHK(roster.FindApp(fileType1, &ref) == B_OK);
CHK(ref_for_file(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
status_t FindApp(const char *mimeType, entry_ref *app) const
@case 9 installed type mimeType, preferred app, app type installed,
two apps have the signature
@results Should return B_OK and set the ref to refer to the
application executable with the most recent modification
time. Should set the app hint on the app type.
*/
void FindAppTester::FindAppTestA9()
{
BRoster roster;
create_app(appFile1, appType1);
create_app(appFile2, appType1, true);
set_file_time(appFile2, time(NULL) + 1);
install_type(fileType1, appType1);
entry_ref ref;
CHK(roster.FindApp(fileType1, &ref) == B_OK);
CHK(ref_for_file(appFile2) == ref);
check_app_type(appType1, appFile2);
}
/*
status_t FindApp(const char *mimeType, entry_ref *app) const
@case 10 installed type mimeType, preferred app, app type installed,
two apps have the signature, one has a version info, the
other one is newer
@results Should return B_OK and set the ref to refer to the
application executable with version info. Should set the
app hint on the app type.
*/
void FindAppTester::FindAppTestA10()
{
BRoster roster;
create_app(appFile1, appType1);
set_version(appFile1, 1);
create_app(appFile2, appType1, true);
set_file_time(appFile2, time(NULL) + 1);
install_type(fileType1, appType1);
entry_ref ref;
CHK(roster.FindApp(fileType1, &ref) == B_OK);
CHK(ref_for_file(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
status_t FindApp(const char *mimeType, entry_ref *app) const
@case 11 installed type mimeType, preferred app, app type installed,
two apps have the signature, both apps have a version info
@results Should return B_OK and set the ref to refer to the
application executable with the greater version. Should
set the app hint on the app type.
*/
void FindAppTester::FindAppTestA11()
{
BRoster roster;
create_app(appFile1, appType1);
set_version(appFile1, 2);
create_app(appFile2, appType1, true);
set_version(appFile1, 1);
set_file_time(appFile2, time(NULL) + 1);
install_type(fileType1, appType1);
entry_ref ref;
CHK(roster.FindApp(fileType1, &ref) == B_OK);
CHK(ref_for_file(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
status_t FindApp(const char *mimeType, entry_ref *app) const
@case 12 installed type mimeType, preferred app, app type installed,
preferred app type has an app hint that points to an app
with a different signature
@results Should return B_OK and set the ref to refer to the
application's executable. Should remove the incorrect app
hint on the app type. (OBOS: Should set the correct app
hint. Don't even return the wrong app?)
*/
void FindAppTester::FindAppTestA12()
{
BRoster roster;
create_app(appFile1, appType2);
set_type_app_hint(appType1, appFile1);
entry_ref appHint;
CHK(BMimeType(appType1).GetAppHint(&appHint) == B_OK);
install_type(fileType1, appType1);
entry_ref ref;
CHK(roster.FindApp(fileType1, &ref) == B_OK);
CHK(ref_for_file(appFile1) == ref);
CHK(BMimeType(appType1).GetAppHint(&appHint) == B_ENTRY_NOT_FOUND);
CHK(BMimeType(appType2).IsInstalled() == false);
}
/*
status_t FindApp(const char *mimeType, entry_ref *app) const
@case 13 installed type mimeType, preferred app, app type installed,
preferred app type has an app hint pointing to void,
a differently named app with this signature exists
@results Should return B_OK and set the ref to refer to the
application's executable. Should update the app
hint on the app type.
*/
void FindAppTester::FindAppTestA13()
{
BRoster roster;
create_app(appFile1, appType1);
set_type_app_hint(appType1, appFile2);
install_type(fileType1, appType1);
entry_ref ref;
CHK(roster.FindApp(fileType1, &ref) == B_OK);
CHK(ref_for_file(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
status_t FindApp(const char *mimeType, entry_ref *app) const
@case 14 mimeType is app signature, not installed
@results Should return B_OK and set the ref to refer to the
application executable. Should set the app hint on the
app type.
*/
void FindAppTester::FindAppTestA14()
{
BRoster roster;
create_app(appFile1, appType1);
entry_ref ref;
CHK(roster.FindApp(appType1, &ref) == B_OK);
CHK(ref_for_file(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
status_t FindApp(const char *mimeType, entry_ref *app) const
@case 15 mimeType is installed, but has no preferred application,
super type has preferred application
@results Should return B_OK and set the ref to refer to the
application executable associated with the preferred app
of the supertype. Should set the app hint on the app type.
*/
void FindAppTester::FindAppTestA15()
{
BRoster roster;
// make sure, the original preferred app for the "text" supertype is
// re-installed
struct TextTypeSaver {
TextTypeSaver()
{
BMimeType textType("text");
hasPreferredApp
= (textType.GetPreferredApp(preferredApp) == B_OK);
} }
~TextTypeSaver()
{
BMimeType textType("text");
textType.SetPreferredApp(hasPreferredApp ? preferredApp : NULL);
}
bool hasPreferredApp;
char preferredApp[B_MIME_TYPE_LENGTH];
} _saver;
create_app(appFile1, appType1);
CHK(BMimeType("text").SetPreferredApp(appType1) == B_OK);
install_type(textTestType);
entry_ref ref;
CHK(roster.FindApp(textTestType, &ref) == B_OK);
CHK(ref_for_file(appFile1) == ref);
check_app_type(appType1, appFile1);
} }
/* /*
team_id FindApp(entry_ref *ref) const status_t FindApp(entry_ref *ref, entry_ref *app) const
@case 1 ref is NULL @case 1 ref or app are NULL
@results Should return B_BAD_VALUE. @results Should return B_BAD_VALUE.
*/ */
void FindAppTester::FindAppTestB1() void FindAppTester::FindAppTestB1()
{ {
BRoster roster;
CHK(roster.FindApp((entry_ref*)NULL, NULL) == B_BAD_VALUE);
// R5: Crashes when passing a NULL (app) ref.
#ifndef TEST_R5
create_app(appFile1, appType1);
entry_ref fileRef(create_file(testFile1, fileType1, appType1));
CHK(roster.FindApp(&fileRef, NULL) == B_BAD_VALUE);
#endif
entry_ref ref;
CHK(roster.FindApp((entry_ref*)NULL, &ref) == B_BAD_VALUE);
} }
/*
status_t FindApp(entry_ref *ref, entry_ref *app) const
@case 2 ref doesn't refer to an existing entry =>
@results Should return B_ENTRY_NOT_FOUND.
*/
void FindAppTester::FindAppTestB2()
{
BRoster roster;
entry_ref fileRef(ref_for_path(testFile1));
entry_ref ref;
CHK(roster.FindApp(&fileRef, &ref) == B_ENTRY_NOT_FOUND);
}
/*
status_t FindApp(entry_ref *ref, entry_ref *app) const
@case 3 ref is valid, file has type and preferred app, preferred
app is in trash
@results Should return B_LAUNCH_FAILED_APP_IN_TRASH.
*/
void FindAppTester::FindAppTestB3()
{
BRoster roster;
create_app(get_trash_app_file(), appType1);
entry_ref fileRef(create_file(testFile1, fileType1, appType1));
entry_ref ref;
CHK(roster.FindApp(&fileRef, &ref) == B_LAUNCH_FAILED_APP_IN_TRASH);
}
/*
status_t FindApp(entry_ref *ref, entry_ref *app) const
@case 4 ref is valid, file has type and preferred app, app type is
not installed, app exists and has signature
@results Should return B_OK and set the ref to refer to the file's
(not the file type's) preferred application's executable.
Should install the app type and set the app hint on it.
*/
void FindAppTester::FindAppTestB4()
{
BRoster roster;
create_app(appFile1, appType1);
create_app(appFile2, appType2);
install_type(fileType1, appType1);
entry_ref fileRef(create_file(testFile1, fileType1, appType2));
entry_ref ref;
CHK(roster.FindApp(&fileRef, &ref) == B_OK);
CHK(ref_for_path(appFile2) == ref);
check_app_type(appType2, appFile2);
}
/*
status_t FindApp(entry_ref *ref, entry_ref *app) const
@case 5 ref is valid, file has no type, but preferred app,
app type is not installed, app exists and has signature
@results Should return B_OK and set the ref to refer to the
application's executable. Should install the app type and
set the app hint on it.
*/
void FindAppTester::FindAppTestB5()
{
BRoster roster;
create_app(appFile1, appType1);
entry_ref fileRef(create_file(testFile1, NULL, appType1));
entry_ref ref;
CHK(roster.FindApp(&fileRef, &ref) == B_OK);
CHK(ref_for_path(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
status_t FindApp(entry_ref *ref, entry_ref *app) const
@case 6 ref is valid, file has type and app hint, the type's
preferred app type is not installed, app exists and has
signature
@results Should return B_OK and set the ref to refer to the file
type's preferred application's executable. Should install
the app type and set the app hint on it.
*/
void FindAppTester::FindAppTestB6()
{
BRoster roster;
create_app(appFile1, appType1);
create_app(appFile2, appType2);
install_type(fileType1, appType1);
entry_ref fileRef(create_file(testFile1, fileType1, NULL, appFile2));
entry_ref ref;
CHK(roster.FindApp(&fileRef, &ref) == B_OK);
CHK(ref_for_path(appFile1) == ref);
check_app_type(appType1, appFile1);
}
/*
status_t FindApp(entry_ref *ref, entry_ref *app) const
@case 7 ref is valid, file has type, the type's preferred app
type is not installed, app exists and has signature,
file is executable
@results Should return B_OK and set the ref to refer to the file.
Should not set the app hint on the app or file type (Why?).
*/
void FindAppTester::FindAppTestB7()
{
BRoster roster;
create_app(appFile1, appType1);
install_type(fileType1, appType1);
entry_ref fileRef(create_file(testFile1, fileType1));
system((string("chmod a+x ") + testFile1).c_str());
entry_ref ref;
CHK(roster.FindApp(&fileRef, &ref) == B_OK);
CHK(ref_for_path(testFile1) == ref);
CHK(BMimeType(appType1).IsInstalled() == false);
CHK(BMimeType(fileType1).GetAppHint(&ref) == B_ENTRY_NOT_FOUND);
}
/*
status_t FindApp(entry_ref *ref, entry_ref *app) const
@case 8 ref is valid and refers to a link to a file, file has type,
the type's preferred app type is not installed,
app exists and has signature
@results Should return B_OK and set the ref to refer to the file
type's preferred application's executable. Should install
the app type and set the app hint on it.
*/
void FindAppTester::FindAppTestB8()
{
BRoster roster;
create_app(appFile1, appType1);
install_type(fileType1, appType1);
create_file(testFile1, fileType1);
system((string("ln -s ") + testFile1 + " " + testLink1).c_str());
entry_ref linkRef(ref_for_path(testLink1));
entry_ref ref;
CHK(roster.FindApp(&linkRef, &ref) == B_OK);
CHK(ref_for_path(appFile1) == ref);
check_app_type(appType1, appFile1);
}
// FileWithTypeCaller
class FileWithTypeCaller : public FindAppCaller {
public:
virtual status_t operator()(const char *type, entry_ref *ref)
{
BRoster roster;
entry_ref fileRef(create_file(testFile1, type));
return roster.FindApp(&fileRef, ref);
}
};
/*
status_t FindApp(entry_ref *ref, entry_ref *app) const
@case 9 ref is valid, file has no type, sniffing results in a type,
type is set on file,
FindApp(const char*, entry_ref*) cases 4-16
(== common cases 2-14)
*/
void FindAppTester::FindAppTestB9()
{
FileWithTypeCaller caller;
for (int32 i = 1; i < commonTestFunctionCount; i++) {
NextSubTest();
(*commonTestFunctions[i])(caller);
tearDown();
setUp();
}
}
// SniffFileTypeCaller
class SniffFileTypeCaller : public FindAppCaller {
public:
virtual status_t operator()(const char *type, entry_ref *ref)
{
BRoster roster;
entry_ref fileRef(create_file(testFile1, type, NULL, NULL,
"UnIQe pAtTeRn"));
install_type(fileType1, NULL, "1.0 [0] ('UnIQe pAtTeRn')");
return roster.FindApp(&fileRef, ref);
}
};
/*
status_t FindApp(entry_ref *ref, entry_ref *app) const
@case 10 ref is valid, file has no type, sniffing results in a type,
type is set on file,
FindApp(const char*, entry_ref*) cases 3-16
(== common cases 1-14)
*/
void FindAppTester::FindAppTestB10()
{
SniffFileTypeCaller caller;
for (int32 i = 0; i < commonTestFunctionCount; i++) {
NextSubTest();
(*commonTestFunctions[i])(caller);
tearDown();
setUp();
}
}
Test* FindAppTester::Suite() Test* FindAppTester::Suite()
{ {
@ -476,20 +806,17 @@ Test* FindAppTester::Suite()
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA1); ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA1);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA2); ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA2);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA3); ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA3);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA4);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA5);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA6);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA7);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA8);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA9);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA10);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA11);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA12);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA13);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA14);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestA15);
// ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestB1); ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestB1);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestB2);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestB3);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestB4);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestB5);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestB6);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestB7);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestB8);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestB9);
ADD_TEST4(BApplication, SuiteOfTests, FindAppTester, FindAppTestB10);
return SuiteOfTests; return SuiteOfTests;
} }

View File

@ -11,6 +11,7 @@
// System Includes ------------------------------------------------------------- // System Includes -------------------------------------------------------------
// Project Includes ------------------------------------------------------------ // Project Includes ------------------------------------------------------------
#include <TestCase.h>
// Local Includes -------------------------------------------------------------- // Local Includes --------------------------------------------------------------
#include "../common.h" #include "../common.h"
@ -19,11 +20,11 @@
// Globals --------------------------------------------------------------------- // Globals ---------------------------------------------------------------------
class FindAppTester : public TestCase class FindAppTester : public BTestCase
{ {
public: public:
FindAppTester() {;} FindAppTester() {;}
FindAppTester(std::string name) : TestCase(name) {;} FindAppTester(std::string name) : BTestCase(name) {;}
void setUp(); void setUp();
void tearDown(); void tearDown();
@ -31,20 +32,17 @@ class FindAppTester : public TestCase
void FindAppTestA1(); void FindAppTestA1();
void FindAppTestA2(); void FindAppTestA2();
void FindAppTestA3(); void FindAppTestA3();
void FindAppTestA4();
void FindAppTestA5();
void FindAppTestA6();
void FindAppTestA7();
void FindAppTestA8();
void FindAppTestA9();
void FindAppTestA10();
void FindAppTestA11();
void FindAppTestA12();
void FindAppTestA13();
void FindAppTestA14();
void FindAppTestA15();
void FindAppTestB1(); void FindAppTestB1();
void FindAppTestB2();
void FindAppTestB3();
void FindAppTestB4();
void FindAppTestB5();
void FindAppTestB6();
void FindAppTestB7();
void FindAppTestB8();
void FindAppTestB9();
void FindAppTestB10();
static Test* Suite(); static Test* Suite();