#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <string>
using std::string;
#include <Application.h>
#include <Bitmap.h>
#include <Directory.h>
#include <Entry.h>
#include <fs_attr.h>
#include <Node.h>
#include <NodeInfo.h>
#include <Path.h>
#include <TypeConstants.h>
#include <MimeTypes.h>
#include <cppunit/Test.h>
#include <cppunit/TestCaller.h>
#include <cppunit/TestSuite.h>
#include <TestShell.h>
#include <TestUtils.h>
#include <cppunit/TestAssert.h>
#include "NodeInfoTest.h"
#include "../app/bmessenger/Helpers.h"
static const char *testDir = "/tmp/testDir";
static const char *testFile1 = "/tmp/testDir/file1";
static const char *testFile2 = "/tmp/testDir/file2";
static const char *testFile3 = "/tmp/testDir/file3";
static const char *testFile4 = "/tmp/testDir/file4";
static const char *abstractTestEntry = "/tmp/testDir/abstract-entry";
static const char *testType1 = "application/x-vnd.obos.node-info-test1";
static const char *testType2 = "application/x-vnd.obos.node-info-test2";
static const char *invalidTestType = "invalid-mime-type";
static const char *tooLongTestType =
"0123456789012345678901234567890123456789012345678901234567890123456789"
"0123456789012345678901234567890123456789012345678901234567890123456789"
"0123456789012345678901234567890123456789012345678901234567890123456789"
"0123456789012345678901234567890123456789012345678901234567890123456789"
;
static const char *testAppSignature1
= "application/x-vnd.obos.node-info-test-app1";
static const char *testAppSignature2
= "application/x-vnd.obos.node-info-test-app2";
static const char *kTypeAttribute = "BEOS:TYPE";
static const char *kMiniIconAttribute = "BEOS:M:STD_ICON";
static const char *kLargeIconAttribute = "BEOS:L:STD_ICON";
static const char *kPreferredAppAttribute = "BEOS:PREF_APP";
static const char *kAppHintAttribute = "BEOS:PPATH";
enum {
MINI_ICON_TYPE = 'MICN',
LARGE_ICON_TYPE = 'ICON',
};
static
BBitmap *
create_test_icon(icon_size size, int fill)
{
BBitmap *icon = NULL;
switch (size) {
case B_MINI_ICON:
icon = new BBitmap(BRect(0, 0, 15, 15), B_CMAP8);
break;
case B_LARGE_ICON:
icon = new BBitmap(BRect(0, 0, 31, 31), B_CMAP8);
break;
}
if (icon)
memset(icon->Bits(), fill, icon->BitsLength());
return icon;
}
static
bool
icon_equal(const BBitmap *icon1, const BBitmap *icon2)
{
return (icon1->Bounds() == icon2->Bounds()
&& icon1->BitsLength() == icon2->BitsLength()
&& memcmp(icon1->Bits(), icon2->Bits(), icon1->BitsLength()) == 0);
}
CppUnit::Test*
NodeInfoTest::Suite() {
CppUnit::TestSuite *suite = new CppUnit::TestSuite();
typedef CppUnit::TestCaller<NodeInfoTest> TC;
suite->addTest( new TC("BNodeInfo::Init Test1", &NodeInfoTest::InitTest1) );
suite->addTest( new TC("BNodeInfo::Init Test2", &NodeInfoTest::InitTest2) );
suite->addTest( new TC("BNodeInfo::Type Test", &NodeInfoTest::TypeTest) );
suite->addTest( new TC("BNodeInfo::Icon Test", &NodeInfoTest::IconTest) );
suite->addTest( new TC("BNodeInfo::Preferred App Test",
&NodeInfoTest::PreferredAppTest) );
suite->addTest( new TC("BNodeInfo::App Hint Test",
&NodeInfoTest::AppHintTest) );
suite->addTest( new TC("BNodeInfo::Tracker Icon Test",
&NodeInfoTest::TrackerIconTest) );
return suite;
}
void
NodeInfoTest::setUp()
{
BasicTest::setUp();
execCommand(
string("mkdir ") + testDir
+ "; touch " + testFile1
+ " " + testFile2
+ " " + testFile3
+ " " + testFile4
);
fApplication = new BApplication("application/x-vnd.obos.node-info-test");
fIconM1 = create_test_icon(B_MINI_ICON, 1);
fIconM2 = create_test_icon(B_MINI_ICON, 2);
fIconM3 = create_test_icon(B_MINI_ICON, 3);
fIconM4 = create_test_icon(B_MINI_ICON, 4);
fIconL1 = create_test_icon(B_LARGE_ICON, 1);
fIconL2 = create_test_icon(B_LARGE_ICON, 2);
fIconL3 = create_test_icon(B_LARGE_ICON, 3);
fIconL4 = create_test_icon(B_LARGE_ICON, 4);
}
void
NodeInfoTest::tearDown()
{
delete fIconM1;
delete fIconM2;
delete fIconM3;
delete fIconM4;
delete fIconL1;
delete fIconL2;
delete fIconL3;
delete fIconL4;
fIconM1 = fIconM2 = fIconL1 = fIconL2 = NULL;
delete fApplication;
fApplication = NULL;
const char * const testTypes[] = {
testType1, testType2, testAppSignature1, testAppSignature2
};
for (uint32 i = 0; i < sizeof(testTypes) / sizeof(const char*); i++) {
BMimeType type(testTypes[i]);
type.Delete();
}
execCommand(string("rm -rf ") + testDir);
BasicTest::tearDown();
}
void
NodeInfoTest::InitTest1()
{
NextSubTest();
{
BNodeInfo nodeInfo;
CHK(nodeInfo.InitCheck() == B_NO_INIT);
}
NextSubTest();
{
BNodeInfo nodeInfo(NULL);
CHK(nodeInfo.InitCheck() == B_BAD_VALUE);
}
NextSubTest();
{
BNode node;
BNodeInfo nodeInfo(&node);
CHK(nodeInfo.InitCheck() == B_BAD_VALUE);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo(&node);
CHK(nodeInfo.InitCheck() == B_OK);
}
}
void
NodeInfoTest::InitTest2()
{
NextSubTest();
{
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(NULL) == B_BAD_VALUE);
CHK(nodeInfo.InitCheck() == B_BAD_VALUE);
}
NextSubTest();
{
BNode node;
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_BAD_VALUE);
CHK(nodeInfo.InitCheck() == B_BAD_VALUE);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.InitCheck() == B_OK);
CHK(nodeInfo.SetTo(NULL) == B_BAD_VALUE);
CHK(nodeInfo.InitCheck() == B_BAD_VALUE);
BNode node2(testFile2);
CHK(nodeInfo.SetTo(&node2) == B_OK);
CHK(nodeInfo.InitCheck() == B_OK);
}
}
static
void
CheckAttr(BNode &node, const char *name, type_code type, const void *data,
int32 dataSize)
{
attr_info info;
CHK(node.GetAttrInfo(name, &info) == B_OK);
CHK(info.type == type);
CHK(info.size == dataSize);
char *buffer = new char[dataSize];
AutoDeleter<char> deleter(buffer, true);
CHK(node.ReadAttr(name, type, 0, buffer, dataSize) == dataSize);
CHK(memcmp(buffer, data, dataSize) == 0);
}
static
void
CheckNoAttr(BNode &node, const char *name)
{
attr_info info;
CHK(node.GetAttrInfo(name, &info) == B_ENTRY_NOT_FOUND);
}
void
CheckStringAttr(BNode &node, const char *name, const char *data)
{
CheckAttr(node, name, B_STRING_TYPE, data, strlen(data) + 1);
}*/
static
void
CheckTypeAttr(BNode &node, const char *data)
{
CheckAttr(node, kTypeAttribute, B_MIME_STRING_TYPE, data,
strlen(data) + 1);
}
static
void
CheckIconAttr(BNode &node, BBitmap *data)
{
const char *attribute = NULL;
uint32 type = 0;
switch (data->Bounds().IntegerWidth()) {
case 15:
attribute = kMiniIconAttribute;
type = MINI_ICON_TYPE;
break;
case 31:
attribute = kLargeIconAttribute;
type = LARGE_ICON_TYPE;
break;
default:
CHK(false);
break;
}
CheckAttr(node, attribute, type, data->Bits(), data->BitsLength());
}
static
void
CheckPreferredAppAttr(BNode &node, const char *data)
{
CheckAttr(node, kPreferredAppAttribute, B_MIME_STRING_TYPE, data,
strlen(data) + 1);
}
static
void
CheckAppHintAttr(BNode &node, const entry_ref *ref)
{
BPath path;
CHK(path.SetTo(ref) == B_OK);
const char *data = path.Path();
CheckAttr(node, kAppHintAttribute, B_MIME_STRING_TYPE, data,
strlen(data) + 1);
}
void
NodeInfoTest::TypeTest()
{
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(equals(nodeInfo.GetType(NULL), B_BAD_ADDRESS, B_BAD_VALUE));
}
NextSubTest();
{
BNodeInfo nodeInfo;
char type[B_MIME_TYPE_LENGTH];
CHK(nodeInfo.GetType(type) == B_NO_INIT);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
char type[B_MIME_TYPE_LENGTH];
CHK(nodeInfo.GetType(type) == B_ENTRY_NOT_FOUND);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.SetType(testType1) == B_OK);
char type[B_MIME_TYPE_LENGTH];
CHK(nodeInfo.GetType(type) == B_OK);
CHK(strcmp(testType1, type) == 0);
CheckTypeAttr(node, testType1);
CHK(nodeInfo.SetType(testType2) == B_OK);
CHK(nodeInfo.GetType(type) == B_OK);
CHK(strcmp(testType2, type) == 0);
CheckTypeAttr(node, testType2);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.SetType(NULL) == B_OK);
char type[B_MIME_TYPE_LENGTH];
CHK(nodeInfo.GetType(type) == B_ENTRY_NOT_FOUND);
CheckNoAttr(node, kTypeAttribute);
}
NextSubTest();
{
BNodeInfo nodeInfo;
CHK(nodeInfo.SetType(testType1) == B_NO_INIT);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.SetType(invalidTestType) == B_OK);
char type[B_MIME_TYPE_LENGTH];
CHK(nodeInfo.GetType(type) == B_OK);
CHK(strcmp(invalidTestType, type) == 0);
CheckTypeAttr(node, invalidTestType);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.SetType(NULL) == B_OK);
#ifdef TEST_R5
CHK(nodeInfo.SetType(tooLongTestType) == B_OK);
char type[1024];
CHK(nodeInfo.GetType(type) == B_OK);
CheckTypeAttr(node, tooLongTestType);
#else
CHK(nodeInfo.SetType(tooLongTestType) == B_BAD_VALUE);
CheckNoAttr(node, kTypeAttribute);
#endif
}
}
void
NodeInfoTest::IconTest()
{
#ifndef TEST_R5
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.GetIcon(NULL, B_MINI_ICON) == B_BAD_VALUE);
CHK(nodeInfo.GetIcon(NULL, B_LARGE_ICON) == B_BAD_VALUE);
}
#endif
NextSubTest();
{
BNodeInfo nodeInfo;
BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8);
CHK(nodeInfo.GetIcon(&icon, B_MINI_ICON) == B_NO_INIT);
BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8);
CHK(nodeInfo.GetIcon(&icon2, B_LARGE_ICON) == B_NO_INIT);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
BBitmap icon(BRect(0, 0, 31, 31), B_CMAP8);
CHK(nodeInfo.GetIcon(&icon, B_MINI_ICON) == B_BAD_VALUE);
BBitmap icon2(BRect(0, 0, 15, 15), B_CMAP8);
CHK(nodeInfo.GetIcon(&icon2, B_LARGE_ICON) == B_BAD_VALUE);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8);
CHK(nodeInfo.GetIcon(&icon, B_MINI_ICON) == B_ENTRY_NOT_FOUND);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.SetIcon(fIconM1, B_MINI_ICON) == B_OK);
BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8);
CHK(nodeInfo.GetIcon(&icon, B_MINI_ICON) == B_OK);
CHK(icon_equal(fIconM1, &icon));
CheckIconAttr(node, fIconM1);
CHK(nodeInfo.SetIcon(fIconM2, B_MINI_ICON) == B_OK);
BBitmap icon2(BRect(0, 0, 15, 15), B_CMAP8);
CHK(nodeInfo.GetIcon(&icon2, B_MINI_ICON) == B_OK);
CHK(icon_equal(fIconM2, &icon2));
CheckIconAttr(node, fIconM2);
CHK(nodeInfo.SetIcon(fIconL1, B_LARGE_ICON) == B_OK);
BBitmap icon3(BRect(0, 0, 31, 31), B_CMAP8);
CHK(nodeInfo.GetIcon(&icon3, B_LARGE_ICON) == B_OK);
CHK(icon_equal(fIconL1, &icon3));
CheckIconAttr(node, fIconL1);
CHK(nodeInfo.SetIcon(fIconL2, B_LARGE_ICON) == B_OK);
BBitmap icon4(BRect(0, 0, 31, 31), B_CMAP8);
CHK(nodeInfo.GetIcon(&icon4, B_LARGE_ICON) == B_OK);
CHK(icon_equal(fIconL2, &icon4));
CheckIconAttr(node, fIconL2);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
BBitmap icon(BRect(0, 0, 15, 15), B_RGB32);
CHK(nodeInfo.GetIcon(&icon, B_MINI_ICON) == B_OK);
BBitmap icon2(BRect(0, 0, 15, 15), B_RGB32);
icon2.SetBits(fIconM2->Bits(), fIconM2->BitsLength(), 0, B_CMAP8);
CHK(icon_equal(&icon, &icon2));
#ifndef TEST_R5
BBitmap icon3(BRect(0, 0, 31, 31), B_RGB32);
CHK(nodeInfo.GetIcon(&icon3, B_LARGE_ICON) == B_OK);
BBitmap icon4(BRect(0, 0, 31, 31), B_RGB32);
icon4.SetBits(fIconL2->Bits(), fIconL2->BitsLength(), 0, B_CMAP8);
CHK(icon_equal(&icon3, &icon4));
#endif
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.SetIcon(NULL, B_MINI_ICON) == B_OK);
BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8);
CHK(nodeInfo.GetIcon(&icon, B_MINI_ICON) == B_ENTRY_NOT_FOUND);
CheckNoAttr(node, kMiniIconAttribute);
CHK(nodeInfo.SetIcon(NULL, B_LARGE_ICON) == B_OK);
BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8);
CHK(nodeInfo.GetIcon(&icon2, B_LARGE_ICON) == B_ENTRY_NOT_FOUND);
CheckNoAttr(node, kLargeIconAttribute);
}
NextSubTest();
{
BNodeInfo nodeInfo;
BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8);
CHK(nodeInfo.SetIcon(&icon, B_MINI_ICON) == B_NO_INIT);
BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8);
CHK(nodeInfo.SetIcon(&icon2, B_LARGE_ICON) == B_NO_INIT);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
BBitmap icon(BRect(0, 0, 31, 31), B_CMAP8);
CHK(nodeInfo.SetIcon(&icon, B_MINI_ICON) == B_BAD_VALUE);
BBitmap icon2(BRect(0, 0, 15, 15), B_CMAP8);
CHK(nodeInfo.SetIcon(&icon2, B_LARGE_ICON) == B_BAD_VALUE);
}
}
void
NodeInfoTest::PreferredAppTest()
{
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(equals(nodeInfo.GetPreferredApp(NULL), B_BAD_ADDRESS,
B_BAD_VALUE));
}
NextSubTest();
{
BNodeInfo nodeInfo;
char signature[B_MIME_TYPE_LENGTH];
CHK(nodeInfo.GetPreferredApp(signature) == B_NO_INIT);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
char signature[B_MIME_TYPE_LENGTH];
CHK(nodeInfo.GetPreferredApp(signature) == B_ENTRY_NOT_FOUND);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.SetPreferredApp(testAppSignature1) == B_OK);
char signature[B_MIME_TYPE_LENGTH];
CHK(nodeInfo.GetPreferredApp(signature) == B_OK);
CHK(strcmp(testAppSignature1, signature) == 0);
CheckPreferredAppAttr(node, testAppSignature1);
CHK(nodeInfo.SetPreferredApp(testAppSignature2) == B_OK);
CHK(nodeInfo.GetPreferredApp(signature) == B_OK);
CHK(strcmp(testAppSignature2, signature) == 0);
CheckPreferredAppAttr(node, testAppSignature2);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.SetPreferredApp(NULL) == B_OK);
char signature[B_MIME_TYPE_LENGTH];
CHK(nodeInfo.GetPreferredApp(signature) == B_ENTRY_NOT_FOUND);
CheckNoAttr(node, kPreferredAppAttribute);
}
NextSubTest();
{
BNodeInfo nodeInfo;
CHK(nodeInfo.SetPreferredApp(testAppSignature1) == B_NO_INIT);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.SetPreferredApp(invalidTestType) == B_OK);
char signature[B_MIME_TYPE_LENGTH];
CHK(nodeInfo.GetPreferredApp(signature) == B_OK);
CHK(strcmp(invalidTestType, signature) == 0);
CheckPreferredAppAttr(node, invalidTestType);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.SetPreferredApp(NULL) == B_OK);
CHK(nodeInfo.SetPreferredApp(tooLongTestType) == B_BAD_VALUE);
char signature[1024];
CHK(nodeInfo.GetPreferredApp(signature) == B_ENTRY_NOT_FOUND);
CheckNoAttr(node, kPreferredAppAttribute);
}
}
void
NodeInfoTest::AppHintTest()
{
entry_ref testRef1, testRef2, abstractRef;
CHK(get_ref_for_path(testFile3, &testRef1) == B_OK);
CHK(get_ref_for_path(testFile4, &testRef2) == B_OK);
CHK(get_ref_for_path(abstractTestEntry, &abstractRef) == B_OK);
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.GetAppHint(NULL) == B_BAD_VALUE);
}
NextSubTest();
{
BNodeInfo nodeInfo;
entry_ref ref;
CHK(nodeInfo.GetAppHint(&ref) == B_NO_INIT);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
entry_ref ref;
CHK(nodeInfo.GetAppHint(&ref) == B_ENTRY_NOT_FOUND);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.SetAppHint(&testRef1) == B_OK);
entry_ref ref;
CHK(nodeInfo.GetAppHint(&ref) == B_OK);
CHK(ref == testRef1);
CheckAppHintAttr(node, &testRef1);
CHK(nodeInfo.SetAppHint(&testRef2) == B_OK);
CHK(nodeInfo.GetAppHint(&ref) == B_OK);
CHK(ref == testRef2);
CheckAppHintAttr(node, &testRef2);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.SetAppHint(NULL) == B_OK);
entry_ref ref;
CHK(nodeInfo.GetAppHint(&ref) == B_ENTRY_NOT_FOUND);
CheckNoAttr(node, kAppHintAttribute);
}
NextSubTest();
{
BNodeInfo nodeInfo;
CHK(nodeInfo.SetAppHint(&testRef1) == B_NO_INIT);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
entry_ref invalidRef;
CHK(nodeInfo.SetAppHint(&invalidRef) != B_OK);
CHK(nodeInfo.SetAppHint(&abstractRef) == B_OK);
entry_ref ref;
CHK(nodeInfo.GetAppHint(&ref) == B_OK);
CHK(ref == abstractRef);
CheckAppHintAttr(node, &abstractRef);
}
}
static
void
TestTrackerIcon(BNodeInfo &nodeInfo, entry_ref *ref, icon_size size,
BBitmap *expectedIcon)
{
if (size == B_MINI_ICON) {
BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8);
CHK(nodeInfo.GetTrackerIcon(&icon, B_MINI_ICON) == B_OK);
CHK(icon_equal(expectedIcon, &icon));
BBitmap icon1(BRect(0, 0, 15, 15), B_CMAP8);
CHK(BNodeInfo::GetTrackerIcon(ref, &icon1, B_MINI_ICON) == B_OK);
CHK(icon_equal(expectedIcon, &icon1));
} else {
BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8);
CHK(nodeInfo.GetTrackerIcon(&icon2, B_LARGE_ICON) == B_OK);
CHK(icon_equal(expectedIcon, &icon2));
BBitmap icon3(BRect(0, 0, 31, 31), B_CMAP8);
CHK(BNodeInfo::GetTrackerIcon(ref, &icon3, B_LARGE_ICON) == B_OK);
CHK(icon_equal(expectedIcon, &icon3));
}
}
static void
TestTrackerIcon(const char *path, const char *type)
{
BBitmap miniIcon(BRect(0, 0, 15, 15), B_CMAP8);
BBitmap largeIcon(BRect(0, 0, 31, 31), B_CMAP8);
BMimeType mimeType(type);
CHK(mimeType.GetIcon(&miniIcon, B_MINI_ICON) == B_OK);
CHK(mimeType.GetIcon(&largeIcon, B_LARGE_ICON) == B_OK);
BNode node(path);
CHK(node.InitCheck() == B_OK);
BEntry entry(path);
CHK(entry.InitCheck() == B_OK);
entry_ref ref;
CHK(entry.GetRef(&ref) == B_OK);
BNodeInfo info(&node);
CHK(info.InitCheck() == B_OK);
TestTrackerIcon(info, &ref, B_MINI_ICON, &miniIcon);
TestTrackerIcon(info, &ref, B_LARGE_ICON, &largeIcon);
}
void
NodeInfoTest::TrackerIconTest()
{
entry_ref testRef1;
CHK(get_ref_for_path(testFile1, &testRef1) == B_OK);
BBitmap octetMIcon(BRect(0, 0, 15, 15), B_CMAP8);
BBitmap octetLIcon(BRect(0, 0, 31, 31), B_CMAP8);
BMimeType octetType(B_FILE_MIME_TYPE);
CHK(octetType.GetIcon(&octetMIcon, B_MINI_ICON) == B_OK);
CHK(octetType.GetIcon(&octetLIcon, B_LARGE_ICON) == B_OK);
NextSubTest();
{
BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8);
CHK(BNodeInfo::GetTrackerIcon(NULL, &icon, B_MINI_ICON)
== B_BAD_VALUE);
BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8);
CHK(BNodeInfo::GetTrackerIcon(NULL, &icon2, B_LARGE_ICON)
== B_BAD_VALUE);
}
NextSubTest();
{
BNodeInfo nodeInfo;
BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8);
CHK(nodeInfo.GetTrackerIcon(&icon, B_MINI_ICON) == B_NO_INIT);
BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8);
CHK(nodeInfo.GetTrackerIcon(&icon2, B_LARGE_ICON) == B_NO_INIT);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
CHK(nodeInfo.GetTrackerIcon(NULL, B_MINI_ICON) == B_BAD_VALUE);
CHK(nodeInfo.GetTrackerIcon(NULL, B_LARGE_ICON) == B_BAD_VALUE);
CHK(BNodeInfo::GetTrackerIcon(&testRef1, NULL, B_MINI_ICON)
== B_BAD_VALUE);
BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8);
CHK(BNodeInfo::GetTrackerIcon(&testRef1, NULL, B_LARGE_ICON)
== B_BAD_VALUE);
}
NextSubTest();
{
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
BBitmap icon(BRect(0, 0, 31, 31), B_CMAP8);
CHK(nodeInfo.GetTrackerIcon(&icon, B_MINI_ICON) == B_BAD_VALUE);
BBitmap icon2(BRect(0, 0, 15, 15), B_CMAP8);
CHK(nodeInfo.GetTrackerIcon(&icon2, B_LARGE_ICON) == B_BAD_VALUE);
CHK(BNodeInfo::GetTrackerIcon(&testRef1, &icon, B_MINI_ICON)
== B_BAD_VALUE);
CHK(BNodeInfo::GetTrackerIcon(&testRef1, &icon2, B_LARGE_ICON)
== B_BAD_VALUE);
}
BNode node(testFile1);
BNodeInfo nodeInfo;
CHK(nodeInfo.SetTo(&node) == B_OK);
BMimeType type(testType1);
CHK(type.Install() == B_OK);
CHK(nodeInfo.SetIcon(fIconM1, B_MINI_ICON) == B_OK);
CHK(nodeInfo.SetIcon(fIconL1, B_LARGE_ICON) == B_OK);
BMimeType appType(testAppSignature1);
CHK(appType.Install() == B_OK);
CHK(appType.SetIconForType(testType1, fIconM2, B_MINI_ICON) == B_OK);
CHK(appType.SetIconForType(testType1, fIconL2, B_LARGE_ICON) == B_OK);
CHK(nodeInfo.SetPreferredApp(testAppSignature1) == B_OK);
CHK(type.SetIcon(fIconM3, B_MINI_ICON) == B_OK);
CHK(type.SetIcon(fIconL3, B_LARGE_ICON) == B_OK);
BMimeType appType2(testAppSignature2);
CHK(appType2.Install() == B_OK);
CHK(appType2.SetIconForType(testType1, fIconM4, B_MINI_ICON) == B_OK);
CHK(appType2.SetIconForType(testType1, fIconL4, B_LARGE_ICON) == B_OK);
CHK(type.SetPreferredApp(testAppSignature2) == B_OK);
NextSubTest();
{
TestTrackerIcon(nodeInfo, &testRef1, B_MINI_ICON, &octetMIcon);
TestTrackerIcon(nodeInfo, &testRef1, B_LARGE_ICON, &octetLIcon);
}
CHK(nodeInfo.SetType(invalidTestType) == B_OK);
NextSubTest();
{
TestTrackerIcon(nodeInfo, &testRef1, B_MINI_ICON, fIconM1);
TestTrackerIcon(nodeInfo, &testRef1, B_LARGE_ICON, fIconL1);
}
CHK(nodeInfo.SetType(testType1) == B_OK);
NextSubTest();
{
TestTrackerIcon(nodeInfo, &testRef1, B_MINI_ICON, fIconM1);
TestTrackerIcon(nodeInfo, &testRef1, B_LARGE_ICON, fIconL1);
}
CHK(nodeInfo.SetIcon(NULL, B_MINI_ICON) == B_OK);
CHK(nodeInfo.SetIcon(NULL, B_LARGE_ICON) == B_OK);
NextSubTest();
{
TestTrackerIcon(nodeInfo, &testRef1, B_MINI_ICON, fIconM2);
TestTrackerIcon(nodeInfo, &testRef1, B_LARGE_ICON, fIconL2);
}
CHK(appType.SetIconForType(testType1, NULL, B_MINI_ICON) == B_OK);
CHK(appType.SetIconForType(testType1, NULL, B_LARGE_ICON) == B_OK);
NextSubTest();
{
TestTrackerIcon(nodeInfo, &testRef1, B_MINI_ICON, fIconM3);
TestTrackerIcon(nodeInfo, &testRef1, B_LARGE_ICON, fIconL3);
}
CHK(nodeInfo.SetPreferredApp(NULL) == B_OK);
NextSubTest();
{
TestTrackerIcon(nodeInfo, &testRef1, B_MINI_ICON, fIconM3);
TestTrackerIcon(nodeInfo, &testRef1, B_LARGE_ICON, fIconL3);
}
CHK(type.SetIcon(NULL, B_MINI_ICON) == B_OK);
CHK(type.SetIcon(NULL, B_LARGE_ICON) == B_OK);
NextSubTest();
{
TestTrackerIcon(nodeInfo, &testRef1, B_MINI_ICON, fIconM4);
TestTrackerIcon(nodeInfo, &testRef1, B_LARGE_ICON, fIconL4);
}
CHK(appType2.SetIconForType(testType1, NULL, B_MINI_ICON) == B_OK);
CHK(appType2.SetIconForType(testType1, NULL, B_LARGE_ICON) == B_OK);
NextSubTest();
{
TestTrackerIcon(nodeInfo, &testRef1, B_MINI_ICON, &octetMIcon);
TestTrackerIcon(nodeInfo, &testRef1, B_LARGE_ICON, &octetLIcon);
}
CHK(type.SetPreferredApp(NULL) == B_OK);
NextSubTest();
{
TestTrackerIcon(nodeInfo, &testRef1, B_MINI_ICON, &octetMIcon);
TestTrackerIcon(nodeInfo, &testRef1, B_LARGE_ICON, &octetLIcon);
}
NextSubTest();
{
TestTrackerIcon(testDir, B_DIRECTORY_MIME_TYPE);
TestTrackerIcon("/", B_VOLUME_MIME_TYPE);
TestTrackerIcon("/system", B_SYMLINK_MIME_TYPE);
chmod(testFile4, 0755);
TestTrackerIcon(testFile4, B_APP_MIME_TYPE);
chmod(testFile4, 0644);
}
}