1 // AppFileInfoTest.cpp 2 3 #include <stdio.h> 4 #include <string> 5 #include <unistd.h> 6 7 #include <AppFileInfo.h> 8 #include <Application.h> 9 #include <Bitmap.h> 10 #include <Directory.h> 11 #include <Entry.h> 12 #include <File.h> 13 #include <fs_attr.h> 14 #include <Path.h> 15 #include <Resources.h> 16 #include <Roster.h> 17 #include <String.h> 18 #include <TypeConstants.h> 19 20 #include <cppunit/Test.h> 21 #include <cppunit/TestCaller.h> 22 #include <cppunit/TestSuite.h> 23 #include <TestShell.h> 24 #include <TestUtils.h> 25 #include <cppunit/TestAssert.h> 26 27 #include "AppFileInfoTest.h" 28 #include "../app/bmessenger/Helpers.h" 29 30 // test dirs/files/types 31 static const char *testDir = "/tmp/testDir"; 32 static const char *testFile1 = "/tmp/testDir/file1"; 33 static const char *testFile2 = "/tmp/testDir/file2"; 34 static const char *testFile3 = "/tmp/testDir/file3"; 35 static const char *testFile4 = "/tmp/testDir/file4"; 36 static const char *testType1 37 = "application/x-vnd.obos.app-file-info-test1"; 38 static const char *testType2 39 = "application/x-vnd.obos.app-file-info-test2"; 40 static const char *testType3 41 = "application/x-vnd.obos.app-file-info-test3"; 42 static const char *testType4 43 = "application/x-vnd.obos.app-file-info-test4"; 44 static const char *invalidTestType = "invalid/mime/type"; 45 static const char *tooLongTestType = 46 "0123456789012345678901234567890123456789012345678901234567890123456789" 47 "0123456789012345678901234567890123456789012345678901234567890123456789" 48 "0123456789012345678901234567890123456789012345678901234567890123456789" 49 "0123456789012345678901234567890123456789012345678901234567890123456789" 50 ; 51 static const char *testAppSignature1 52 = "application/x-vnd.obos.app-file-info-test-app1"; 53 static const char *testAppSignature2 54 = "application/x-vnd.obos.app-file-info-test-app2"; 55 static const char *testAppSignature3 56 = "application/x-vnd.obos.app-file-info-test-app3"; 57 58 59 // attributes 60 static const char *kTypeAttribute = "BEOS:TYPE"; 61 static const char *kSignatureAttribute = "BEOS:APP_SIG"; 62 static const char *kAppFlagsAttribute = "BEOS:APP_FLAGS"; 63 static const char *kSupportedTypesAttribute = "BEOS:FILE_TYPES"; 64 static const char *kMiniIconAttribute = "BEOS:M:STD_ICON"; 65 static const char *kLargeIconAttribute = "BEOS:L:STD_ICON"; 66 static const char *kVersionInfoAttribute = "BEOS:APP_VERSION"; 67 static const char *kMiniIconForTypeAttribute = "BEOS:M:"; 68 static const char *kLargeIconForTypeAttribute = "BEOS:L:"; 69 70 // resource IDs 71 static const int32 kTypeResourceID = 2; 72 static const int32 kSignatureResourceID = 1; 73 static const int32 kAppFlagsResourceID = 1; 74 static const int32 kSupportedTypesResourceID = 1; 75 static const int32 kMiniIconResourceID = 101; 76 static const int32 kLargeIconResourceID = 101; 77 static const int32 kVersionInfoResourceID = 1; 78 static const int32 kMiniIconForTypeResourceID = 0; 79 static const int32 kLargeIconForTypeResourceID = 0; 80 81 82 enum { 83 APP_FLAGS_TYPE = 'APPF', 84 MINI_ICON_TYPE = 'MICN', 85 LARGE_ICON_TYPE = 'ICON', 86 VERSION_INFO_TYPE = 'APPV', 87 }; 88 89 // create_test_icon 90 static 91 BBitmap * 92 create_test_icon(icon_size size, int fill) 93 { 94 BBitmap *icon = NULL; 95 // create 96 switch (size) { 97 case B_MINI_ICON: 98 icon = new BBitmap(BRect(0, 0, 15, 15), B_CMAP8); 99 break; 100 case B_LARGE_ICON: 101 icon = new BBitmap(BRect(0, 0, 31, 31), B_CMAP8); 102 break; 103 } 104 // fill 105 if (icon) 106 memset(icon->Bits(), fill, icon->BitsLength()); 107 return icon; 108 } 109 110 // icon_equal 111 static 112 bool 113 icon_equal(const BBitmap *icon1, const BBitmap *icon2) 114 { 115 return (icon1->Bounds() == icon2->Bounds() 116 && icon1->BitsLength() == icon2->BitsLength() 117 && memcmp(icon1->Bits(), icon2->Bits(), icon1->BitsLength()) == 0); 118 } 119 120 // == (version_info) 121 static 122 bool 123 operator==(const version_info &info1, const version_info &info2) 124 { 125 return (info1.major == info2.major 126 && info1.middle == info2.middle 127 && info1.minor == info2.minor 128 && info1.variety == info2.variety 129 && info1.internal == info2.internal 130 && !strcmp(info1.short_info, info2.short_info) 131 && !strcmp(info1.long_info, info2.long_info)); 132 } 133 134 135 // Suite 136 CppUnit::Test* 137 AppFileInfoTest::Suite() { 138 CppUnit::TestSuite *suite = new CppUnit::TestSuite(); 139 typedef CppUnit::TestCaller<AppFileInfoTest> TC; 140 141 suite->addTest( new TC("BAppFileInfo::Init Test1", 142 &AppFileInfoTest::InitTest1) ); 143 suite->addTest( new TC("BAppFileInfo::Init Test2", 144 &AppFileInfoTest::InitTest2) ); 145 suite->addTest( new TC("BAppFileInfo::Type Test", 146 &AppFileInfoTest::TypeTest) ); 147 suite->addTest( new TC("BAppFileInfo::Signature Test", 148 &AppFileInfoTest::SignatureTest) ); 149 suite->addTest( new TC("BAppFileInfo::App Flags Test", 150 &AppFileInfoTest::AppFlagsTest) ); 151 suite->addTest( new TC("BAppFileInfo::Supported Types Test", 152 &AppFileInfoTest::SupportedTypesTest) ); 153 suite->addTest( new TC("BAppFileInfo::Icon Test", 154 &AppFileInfoTest::IconTest) ); 155 suite->addTest( new TC("BAppFileInfo::Version Info Test", 156 &AppFileInfoTest::VersionInfoTest) ); 157 suite->addTest( new TC("BAppFileInfo::Icon For Type Test", 158 &AppFileInfoTest::IconForTypeTest) ); 159 suite->addTest( new TC("BAppFileInfo::Info Location Test", 160 &AppFileInfoTest::InfoLocationTest) ); 161 162 return suite; 163 } 164 165 // setUp 166 void 167 AppFileInfoTest::setUp() 168 { 169 BasicTest::setUp(); 170 // create test dir and files 171 execCommand( 172 string("mkdir ") + testDir 173 + "; touch " + testFile1 174 + " " + testFile2 175 + " " + testFile3 176 + " " + testFile4 177 ); 178 // create app 179 fApplication 180 = new BApplication("application/x-vnd.obos.app-file-info-test"); 181 // create icons 182 fIconM1 = create_test_icon(B_MINI_ICON, 1); 183 fIconM2 = create_test_icon(B_MINI_ICON, 2); 184 fIconM3 = create_test_icon(B_MINI_ICON, 3); 185 fIconM4 = create_test_icon(B_MINI_ICON, 4); 186 fIconL1 = create_test_icon(B_LARGE_ICON, 1); 187 fIconL2 = create_test_icon(B_LARGE_ICON, 2); 188 fIconL3 = create_test_icon(B_LARGE_ICON, 3); 189 fIconL4 = create_test_icon(B_LARGE_ICON, 4); 190 } 191 192 // tearDown 193 void 194 AppFileInfoTest::tearDown() 195 { 196 // delete the icons 197 delete fIconM1; 198 delete fIconM2; 199 delete fIconM3; 200 delete fIconM4; 201 delete fIconL1; 202 delete fIconL2; 203 delete fIconL3; 204 delete fIconL4; 205 fIconM1 = fIconM2 = fIconL1 = fIconL2 = NULL; 206 // delete the application 207 delete fApplication; 208 fApplication = NULL; 209 // remove the types we've added 210 const char * const testTypes[] = { 211 testType1, testType2, testType3, testType4, 212 testAppSignature1, testAppSignature2, testAppSignature3 213 }; 214 for (uint32 i = 0; i < sizeof(testTypes) / sizeof(const char*); i++) { 215 BMimeType type(testTypes[i]); 216 type.Delete(); 217 } 218 219 // delete the test dir 220 execCommand(string("rm -rf ") + testDir); 221 222 BasicTest::tearDown(); 223 } 224 225 // SyncResources 226 static 227 void 228 SyncResources(BAppFileInfo &info) 229 { 230 struct node_info_hack { 231 virtual ~node_info_hack() {} 232 BNode *fNode; 233 uint32 _reserved[2]; 234 status_t fCStatus; 235 }; 236 struct app_file_info_hack : node_info_hack { 237 virtual ~app_file_info_hack() {} 238 BResources *fResources; 239 info_location fWhere; 240 uint32 _reserved[2]; 241 }; 242 app_file_info_hack &hackedInfo 243 = reinterpret_cast<app_file_info_hack&>(info); 244 BResources *resources = hackedInfo.fResources; 245 if (resources) 246 resources->Sync(); 247 } 248 249 // ReadAttr 250 static 251 char* 252 ReadAttr(BNode &node, const char *name, type_code type, size_t &size) 253 { 254 attr_info info; 255 CHK(node.GetAttrInfo(name, &info) == B_OK); 256 CHK(info.type == type); 257 char *buffer = new char[info.size]; 258 if (node.ReadAttr(name, type, 0, buffer, info.size) == info.size) 259 size = info.size; 260 else { 261 delete[] buffer; 262 CHK(false); 263 } 264 return buffer; 265 } 266 267 // ReadResource 268 static 269 char* 270 ReadResource(BFile &file, const char *name, int32 id, type_code type, 271 size_t &size) 272 { 273 BResources resources; 274 CHK(resources.SetTo(&file) == B_OK); 275 int32 idFound; 276 CHK(resources.GetResourceInfo(type, name, &idFound, &size) == true); 277 CHK(idFound == id); 278 const void *resourceData = resources.LoadResource(type, name, &size); 279 CHK(resourceData != NULL); 280 char *buffer = new char[size]; 281 memcpy(buffer, resourceData, size); 282 return buffer; 283 } 284 285 // CheckAttr 286 static 287 void 288 CheckAttr(BNode &node, const char *name, type_code type, const void *data, 289 int32 dataSize) 290 { 291 attr_info info; 292 CHK(node.GetAttrInfo(name, &info) == B_OK); 293 CHK(info.type == type); 294 CHK(info.size == dataSize); 295 char *buffer = new char[dataSize]; 296 AutoDeleter<char> deleter(buffer, true); 297 CHK(node.ReadAttr(name, type, 0, buffer, dataSize) == dataSize); 298 CHK(memcmp(buffer, data, dataSize) == 0); 299 } 300 301 // CheckResource 302 static 303 void 304 CheckResource(BFile &file, const char *name, int32 id, type_code type, 305 const void *data, size_t dataSize) 306 { 307 BResources resources; 308 CHK(resources.SetTo(&file) == B_OK); 309 int32 idFound; 310 size_t size; 311 CHK(resources.GetResourceInfo(type, name, &idFound, &size) == true); 312 CHK(idFound == id); 313 CHK(size == dataSize); 314 const void *resourceData = resources.LoadResource(type, name, &size); 315 CHK(resourceData != NULL); 316 CHK(size == dataSize); 317 CHK(memcmp(resourceData, data, dataSize) == 0); 318 } 319 320 // CheckNoAttr 321 static 322 void 323 CheckNoAttr(BNode &node, const char *name) 324 { 325 attr_info info; 326 CHK(node.GetAttrInfo(name, &info) == B_ENTRY_NOT_FOUND); 327 } 328 329 // CheckNoResource 330 static 331 void 332 CheckNoResource(BFile &file, const char *name) 333 { 334 BResources resources; 335 CHK(resources.SetTo(&file) == B_OK); 336 type_code typeFound; 337 int32 idFound; 338 const char *nameFound; 339 size_t size; 340 bool found = false; 341 for (int32 i = 0; 342 !found && resources.GetResourceInfo(i, &typeFound, &idFound, 343 &nameFound, &size); 344 i++) { 345 found = !strcmp(nameFound, name); 346 } 347 CHK(!found); 348 } 349 350 // TypeValue 351 struct TypeValue 352 { 353 TypeValue() : type() {} 354 TypeValue(const char *type) : type(type) {} 355 356 bool operator==(const TypeValue &value) 357 { 358 return (type == value.type); 359 } 360 361 string type; 362 }; 363 364 // TypeSetter 365 struct TypeSetter 366 { 367 static status_t Set(BAppFileInfo &info, const TypeValue &value) 368 { 369 return info.SetType(value.type.c_str()); 370 } 371 }; 372 373 // TypeGetter 374 struct TypeGetter 375 { 376 static status_t Get(BAppFileInfo &info, TypeValue &value) 377 { 378 char buffer[B_MIME_TYPE_LENGTH]; 379 status_t error = info.GetType(buffer); 380 if (error == B_OK) 381 value.type = buffer; 382 return error; 383 } 384 }; 385 386 // TypeChecker 387 struct TypeChecker 388 { 389 static void CheckAttribute(BNode &file, const TypeValue &value) 390 { 391 CheckAttr(file, kTypeAttribute, B_MIME_STRING_TYPE, value.type.c_str(), 392 value.type.length() + 1); 393 } 394 395 static void CheckResource(BFile &file, const TypeValue &value) 396 { 397 ::CheckResource(file, kTypeAttribute, kTypeResourceID, 398 B_MIME_STRING_TYPE, value.type.c_str(), 399 value.type.length() + 1); 400 } 401 }; 402 403 typedef TypeValue SignatureValue; 404 405 // SignatureSetter 406 struct SignatureSetter 407 { 408 static status_t Set(BAppFileInfo &info, const SignatureValue &value) 409 { 410 return info.SetSignature(value.type.c_str()); 411 } 412 }; 413 414 // SignatureGetter 415 struct SignatureGetter 416 { 417 static status_t Get(BAppFileInfo &info, SignatureValue &value) 418 { 419 char buffer[B_MIME_TYPE_LENGTH]; 420 status_t error = info.GetSignature(buffer); 421 if (error == B_OK) 422 value.type = buffer; 423 return error; 424 } 425 }; 426 427 // SignatureChecker 428 struct SignatureChecker 429 { 430 static void CheckAttribute(BNode &file, const SignatureValue &value) 431 { 432 CheckAttr(file, kSignatureAttribute, B_MIME_STRING_TYPE, value.type.c_str(), 433 value.type.length() + 1); 434 } 435 436 static void CheckResource(BFile &file, const SignatureValue &value) 437 { 438 ::CheckResource(file, kSignatureAttribute, kSignatureResourceID, 439 B_MIME_STRING_TYPE, value.type.c_str(), 440 value.type.length() + 1); 441 } 442 }; 443 444 // AppFlagsValue 445 struct AppFlagsValue 446 { 447 AppFlagsValue() : flags() {} 448 AppFlagsValue(uint32 flags) : flags(flags) {} 449 450 bool operator==(const AppFlagsValue &value) 451 { 452 return (flags == value.flags); 453 } 454 455 uint32 flags; 456 }; 457 458 // AppFlagsSetter 459 struct AppFlagsSetter 460 { 461 static status_t Set(BAppFileInfo &info, const AppFlagsValue &value) 462 { 463 return info.SetAppFlags(value.flags); 464 } 465 }; 466 467 // AppFlagsGetter 468 struct AppFlagsGetter 469 { 470 static status_t Get(BAppFileInfo &info, AppFlagsValue &value) 471 { 472 return info.GetAppFlags(&value.flags); 473 } 474 }; 475 476 // AppFlagsChecker 477 struct AppFlagsChecker 478 { 479 static void CheckAttribute(BNode &file, const AppFlagsValue &value) 480 { 481 CheckAttr(file, kAppFlagsAttribute, APP_FLAGS_TYPE, &value.flags, 482 sizeof(value.flags)); 483 } 484 485 static void CheckResource(BFile &file, const AppFlagsValue &value) 486 { 487 ::CheckResource(file, kAppFlagsAttribute, kAppFlagsResourceID, 488 APP_FLAGS_TYPE, &value.flags, sizeof(value.flags)); 489 } 490 }; 491 492 // SupportedTypesValue 493 struct SupportedTypesValue 494 { 495 SupportedTypesValue() : types() {} 496 SupportedTypesValue(const BMessage &types) : types(types) {} 497 SupportedTypesValue(const char **types, int32 count) 498 : types() 499 { 500 for (int32 i = 0; i < count; i++) 501 this->types.AddString("types", types[i]); 502 } 503 504 bool operator==(const SupportedTypesValue &value) 505 { 506 type_code type1, type2; 507 int32 count1, count2; 508 bool equal = (types.GetInfo("types", &type1, &count1) == B_OK 509 && value.types.GetInfo("types", &type2, &count2) == B_OK 510 && type1 == type2 && count1 == count2); 511 512 for (int32 i = 0; equal && i < count1; i++) { 513 BString str1, str2; 514 equal = types.FindString("types", i, &str1) == B_OK 515 && value.types.FindString("types", i, &str2) == B_OK 516 && str1 == str2; 517 } 518 return equal; 519 } 520 521 BMessage types; 522 }; 523 524 // SupportedTypesSetter 525 struct SupportedTypesSetter 526 { 527 static status_t Set(BAppFileInfo &info, const SupportedTypesValue &value) 528 { 529 return info.SetSupportedTypes(&value.types, false); 530 } 531 }; 532 533 // SupportedTypesGetter 534 struct SupportedTypesGetter 535 { 536 static status_t Get(BAppFileInfo &info, SupportedTypesValue &value) 537 { 538 return info.GetSupportedTypes(&value.types); 539 } 540 }; 541 542 // SupportedTypesChecker 543 struct SupportedTypesChecker 544 { 545 static void CheckAttribute(BNode &file, const SupportedTypesValue &value) 546 { 547 size_t size; 548 char *buffer = ReadAttr(file, kSupportedTypesAttribute, 549 B_MESSAGE_TYPE, size); 550 AutoDeleter<char> deleter(buffer, true); 551 BMessage storedTypes; 552 CHK(storedTypes.Unflatten(buffer) == B_OK); 553 SupportedTypesValue storedValue(storedTypes); 554 CHK(storedValue == value); 555 } 556 557 static void CheckResource(BFile &file, const SupportedTypesValue &value) 558 { 559 size_t size; 560 char *buffer = ReadResource(file, kSupportedTypesAttribute, 561 kSupportedTypesResourceID, B_MESSAGE_TYPE, 562 size); 563 AutoDeleter<char> deleter(buffer, true); 564 BMessage storedTypes; 565 CHK(storedTypes.Unflatten(buffer) == B_OK); 566 SupportedTypesValue storedValue(storedTypes); 567 CHK(storedValue == value); 568 } 569 }; 570 571 // IconValue 572 struct IconValue 573 { 574 IconValue() : mini(BRect(0, 0, 15, 15), B_CMAP8), 575 large(BRect(0, 0, 31, 31), B_CMAP8) {} 576 IconValue(const BBitmap *mini, const BBitmap *large) 577 : mini(BRect(0, 0, 15, 15), B_CMAP8), 578 large(BRect(0, 0, 31, 31), B_CMAP8) 579 { 580 this->mini.SetBits(mini->Bits(), mini->BitsLength(), 0, 581 mini->ColorSpace()); 582 this->large.SetBits(large->Bits(), large->BitsLength(), 0, 583 large->ColorSpace()); 584 } 585 586 bool operator==(const IconValue &value) 587 { 588 return (icon_equal(&mini, &value.mini) 589 && icon_equal(&large, &value.large)); 590 } 591 592 BBitmap mini; 593 BBitmap large; 594 }; 595 596 // IconSetter 597 struct IconSetter 598 { 599 static status_t Set(BAppFileInfo &info, const IconValue &value) 600 { 601 status_t error = info.SetIcon(&value.mini, B_MINI_ICON); 602 if (error == B_OK) 603 error = info.SetIcon(&value.large, B_LARGE_ICON); 604 return error; 605 } 606 }; 607 608 // IconGetter 609 struct IconGetter 610 { 611 static status_t Get(BAppFileInfo &info, IconValue &value) 612 { 613 status_t error = info.GetIcon(&value.mini, B_MINI_ICON); 614 if (error == B_OK) 615 error = info.GetIcon(&value.large, B_LARGE_ICON); 616 return error; 617 } 618 }; 619 620 // IconChecker 621 struct IconChecker 622 { 623 static void CheckAttribute(BNode &file, const IconValue &value) 624 { 625 CheckAttr(file, kMiniIconAttribute, MINI_ICON_TYPE, value.mini.Bits(), 626 value.mini.BitsLength()); 627 CheckAttr(file, kLargeIconAttribute, LARGE_ICON_TYPE, 628 value.large.Bits(), value.large.BitsLength()); 629 } 630 631 static void CheckResource(BFile &file, const IconValue &value) 632 { 633 ::CheckResource(file, kMiniIconAttribute, kMiniIconResourceID, 634 MINI_ICON_TYPE, value.mini.Bits(), 635 value.mini.BitsLength()); 636 ::CheckResource(file, kLargeIconAttribute, kLargeIconResourceID, 637 LARGE_ICON_TYPE, value.large.Bits(), 638 value.large.BitsLength()); 639 } 640 }; 641 642 // VersionInfoValue 643 struct VersionInfoValue 644 { 645 VersionInfoValue() : app(), system() {} 646 VersionInfoValue(const version_info &app, const version_info &system) 647 : app(app), system(system) {} 648 649 bool operator==(const VersionInfoValue &value) 650 { 651 return (app == value.app && system == value.system); 652 } 653 654 version_info app; 655 version_info system; 656 }; 657 658 // VersionInfoSetter 659 struct VersionInfoSetter 660 { 661 static status_t Set(BAppFileInfo &info, const VersionInfoValue &value) 662 { 663 status_t error = info.SetVersionInfo(&value.app, B_APP_VERSION_KIND); 664 if (error == B_OK) 665 error = info.SetVersionInfo(&value.system, B_SYSTEM_VERSION_KIND); 666 return error; 667 } 668 }; 669 670 // VersionInfoGetter 671 struct VersionInfoGetter 672 { 673 static status_t Get(BAppFileInfo &info, VersionInfoValue &value) 674 { 675 status_t error = info.GetVersionInfo(&value.app, B_APP_VERSION_KIND); 676 if (error == B_OK) 677 error = info.GetVersionInfo(&value.system, B_SYSTEM_VERSION_KIND); 678 return error; 679 } 680 }; 681 682 // VersionInfoChecker 683 struct VersionInfoChecker 684 { 685 static void CheckAttribute(BNode &file, const VersionInfoValue &value) 686 { 687 version_info infos[] = { value.app, value.system }; 688 CheckAttr(file, kVersionInfoAttribute, VERSION_INFO_TYPE, 689 infos, sizeof(infos)); 690 } 691 692 static void CheckResource(BFile &file, const VersionInfoValue &value) 693 { 694 version_info infos[] = { value.app, value.system }; 695 ::CheckResource(file, kVersionInfoAttribute, 696 kVersionInfoResourceID, VERSION_INFO_TYPE, 697 infos, sizeof(infos)); 698 } 699 }; 700 701 // IconForTypeValue 702 struct IconForTypeValue : public IconValue 703 { 704 // IconForTypeValue() : type() {} 705 // IconForTypeValue(const BBitmap *mini, const BBitmap *large, 706 // const char *type) : IconValue(mini, large), type(type) {} 707 IconForTypeValue() : type(testType1) {} 708 IconForTypeValue(const BBitmap *mini, const BBitmap *large) 709 : IconValue(mini, large), type(testType1) {} 710 711 string type; 712 }; 713 714 // IconForTypeSetter 715 struct IconForTypeSetter 716 { 717 static status_t Set(BAppFileInfo &info, const IconForTypeValue &value) 718 { 719 status_t error = info.SetIconForType(value.type.c_str(), &value.mini, 720 B_MINI_ICON); 721 if (error == B_OK) { 722 error = info.SetIconForType(value.type.c_str(), &value.large, 723 B_LARGE_ICON); 724 } 725 return error; 726 } 727 }; 728 729 // IconForTypeGetter 730 struct IconForTypeGetter 731 { 732 static status_t Get(BAppFileInfo &info, IconForTypeValue &value) 733 { 734 status_t error = info.GetIconForType(value.type.c_str(), &value.mini, 735 B_MINI_ICON); 736 if (error == B_OK) { 737 error = info.GetIconForType(value.type.c_str(), &value.large, 738 B_LARGE_ICON); 739 } 740 return error; 741 } 742 }; 743 744 // IconForTypeChecker 745 struct IconForTypeChecker 746 { 747 static void CheckAttribute(BNode &file, const IconForTypeValue &value) 748 { 749 string attrNameM(kMiniIconForTypeAttribute); 750 attrNameM += value.type; 751 CheckAttr(file, attrNameM.c_str(), MINI_ICON_TYPE, value.mini.Bits(), 752 value.mini.BitsLength()); 753 string attrNameL(kLargeIconForTypeAttribute); 754 attrNameL += value.type; 755 CheckAttr(file, attrNameL.c_str(), LARGE_ICON_TYPE, 756 value.large.Bits(), value.large.BitsLength()); 757 } 758 759 static void CheckResource(BFile &file, const IconForTypeValue &value) 760 { 761 string attrNameM(kMiniIconForTypeAttribute); 762 attrNameM += value.type; 763 ::CheckResource(file, attrNameM.c_str(), kMiniIconForTypeResourceID, 764 MINI_ICON_TYPE, value.mini.Bits(), 765 value.mini.BitsLength()); 766 string attrNameL(kLargeIconForTypeAttribute); 767 attrNameL += value.type; 768 ::CheckResource(file, attrNameL.c_str(), kLargeIconForTypeResourceID, 769 LARGE_ICON_TYPE, value.large.Bits(), 770 value.large.BitsLength()); 771 } 772 }; 773 774 775 // CheckTypeAttr 776 static 777 void 778 CheckTypeAttr(BNode &node, const char *data) 779 { 780 CheckAttr(node, kTypeAttribute, B_MIME_STRING_TYPE, data, 781 strlen(data) + 1); 782 } 783 784 // CheckTypeResource 785 static 786 void 787 CheckTypeResource(BFile &file, const char *data) 788 { 789 CheckResource(file, kTypeAttribute, kTypeResourceID, B_MIME_STRING_TYPE, 790 data, strlen(data) + 1); 791 } 792 793 // CheckSignatureAttr 794 static 795 void 796 CheckSignatureAttr(BNode &node, const char *data) 797 { 798 CheckAttr(node, kSignatureAttribute, B_MIME_STRING_TYPE, data, 799 strlen(data) + 1); 800 } 801 802 // CheckSignatureResource 803 static 804 void 805 CheckSignatureResource(BFile &file, const char *data) 806 { 807 CheckResource(file, kSignatureAttribute, kSignatureResourceID, 808 B_MIME_STRING_TYPE, data, strlen(data) + 1); 809 } 810 811 // CheckAppFlagsAttr 812 static 813 void 814 CheckAppFlagsAttr(BNode &node, uint32 flags) 815 { 816 CheckAttr(node, kAppFlagsAttribute, APP_FLAGS_TYPE, &flags, sizeof(flags)); 817 } 818 819 // CheckAppFlagsResource 820 static 821 void 822 CheckAppFlagsResource(BFile &file, uint32 flags) 823 { 824 CheckResource(file, kAppFlagsAttribute, kAppFlagsResourceID, 825 APP_FLAGS_TYPE, &flags, sizeof(flags)); 826 } 827 828 // CheckSupportedTypesAttr 829 static 830 void 831 CheckSupportedTypesAttr(BNode &node, const BMessage *data) 832 { 833 SupportedTypesChecker::CheckAttribute(node, SupportedTypesValue(*data)); 834 } 835 836 // CheckSupportedTypesResource 837 static 838 void 839 CheckSupportedTypesResource(BFile &file, const BMessage *data) 840 { 841 SupportedTypesChecker::CheckResource(file, SupportedTypesValue(*data)); 842 } 843 844 // CheckIconAttr 845 static 846 void 847 CheckIconAttr(BNode &node, BBitmap *data) 848 { 849 const char *attribute = NULL; 850 uint32 type = 0; 851 switch (data->Bounds().IntegerWidth()) { 852 case 15: 853 attribute = kMiniIconAttribute; 854 type = MINI_ICON_TYPE; 855 break; 856 case 31: 857 attribute = kLargeIconAttribute; 858 type = LARGE_ICON_TYPE; 859 break; 860 default: 861 CHK(false); 862 break; 863 } 864 CheckAttr(node, attribute, type, data->Bits(), data->BitsLength()); 865 } 866 867 // CheckIconResource 868 static 869 void 870 CheckIconResource(BFile &file, BBitmap *data) 871 { 872 const char *attribute = NULL; 873 int32 resourceID = 0; 874 uint32 type = 0; 875 switch (data->Bounds().IntegerWidth()) { 876 case 15: 877 attribute = kMiniIconAttribute; 878 resourceID = kMiniIconResourceID; 879 type = MINI_ICON_TYPE; 880 break; 881 case 31: 882 attribute = kLargeIconAttribute; 883 resourceID = kLargeIconResourceID; 884 type = LARGE_ICON_TYPE; 885 break; 886 default: 887 CHK(false); 888 break; 889 } 890 CheckResource(file, attribute, resourceID, type, data->Bits(), 891 data->BitsLength()); 892 } 893 894 // CheckVersionInfoAttr 895 static 896 void 897 CheckVersionInfoAttr(BNode &node, version_info *data) 898 { 899 CheckAttr(node, kVersionInfoAttribute, VERSION_INFO_TYPE, data, 900 2 * sizeof(version_info)); 901 } 902 903 // CheckVersionInfoResource 904 static 905 void 906 CheckVersionInfoResource(BFile &file, version_info *data) 907 { 908 CheckResource(file, kVersionInfoAttribute, kVersionInfoResourceID, 909 VERSION_INFO_TYPE, data, 2 * sizeof(version_info)); 910 } 911 912 // CheckIconForTypeAttr 913 static 914 void 915 CheckIconForTypeAttr(BNode &node, const char *type, BBitmap *data) 916 { 917 string attribute; 918 int32 resourceID = 0; 919 uint32 iconType = 0; 920 switch (data->Bounds().IntegerWidth()) { 921 case 15: 922 attribute = kMiniIconForTypeAttribute; 923 resourceID = kMiniIconForTypeResourceID; 924 iconType = MINI_ICON_TYPE; 925 break; 926 case 31: 927 attribute = kLargeIconForTypeAttribute; 928 resourceID = kLargeIconForTypeResourceID; 929 iconType = LARGE_ICON_TYPE; 930 break; 931 default: 932 CHK(false); 933 break; 934 } 935 attribute += type; 936 CheckAttr(node, attribute.c_str(), iconType, data->Bits(), 937 data->BitsLength()); 938 } 939 940 // CheckIconForTypeResource 941 static 942 void 943 CheckIconForTypeResource(BFile &file, const char *type, BBitmap *data, 944 int32 resourceID = -1) 945 { 946 string attribute; 947 uint32 iconType = 0; 948 switch (data->Bounds().IntegerWidth()) { 949 case 15: 950 attribute = kMiniIconForTypeAttribute; 951 if (resourceID < 0) 952 resourceID = kMiniIconForTypeResourceID; 953 iconType = MINI_ICON_TYPE; 954 break; 955 case 31: 956 attribute = kLargeIconForTypeAttribute; 957 if (resourceID < 0) 958 resourceID = kLargeIconForTypeResourceID; 959 iconType = LARGE_ICON_TYPE; 960 break; 961 default: 962 CHK(false); 963 break; 964 } 965 attribute += type; 966 CheckResource(file, attribute.c_str(), resourceID, iconType, data->Bits(), 967 data->BitsLength()); 968 } 969 970 // CheckNoIconForTypeAttr 971 static 972 void 973 CheckNoIconForTypeAttr(BNode &node, const char *type, icon_size iconSize) 974 { 975 string attribute; 976 switch (iconSize) { 977 case B_MINI_ICON: 978 attribute = kMiniIconForTypeAttribute; 979 break; 980 case B_LARGE_ICON: 981 attribute = kLargeIconForTypeAttribute; 982 break; 983 default: 984 CHK(false); 985 break; 986 } 987 attribute += type; 988 CheckNoAttr(node, attribute.c_str()); 989 } 990 991 // CheckNoIconForTypeResource 992 static 993 void 994 CheckNoIconForTypeResource(BFile &file, const char *type, icon_size iconSize) 995 { 996 string attribute; 997 switch (iconSize) { 998 case B_MINI_ICON: 999 attribute = kMiniIconForTypeAttribute; 1000 break; 1001 case B_LARGE_ICON: 1002 attribute = kLargeIconForTypeAttribute; 1003 break; 1004 default: 1005 CHK(false); 1006 break; 1007 } 1008 attribute += type; 1009 CheckNoResource(file, attribute.c_str()); 1010 } 1011 1012 1013 // InitTest1 1014 void 1015 AppFileInfoTest::InitTest1() 1016 { 1017 #ifdef TEST_R5 1018 const bool hasInitialLocation = false; 1019 #else 1020 const bool hasInitialLocation = true; 1021 #endif 1022 // BAppFileInfo() 1023 // * InitCheck() == B_NO_INIT 1024 NextSubTest(); 1025 { 1026 BAppFileInfo appFileInfo; 1027 CHK(appFileInfo.InitCheck() == B_NO_INIT); 1028 CHK(appFileInfo.IsUsingAttributes() == hasInitialLocation); 1029 CHK(appFileInfo.IsUsingResources() == hasInitialLocation); 1030 } 1031 1032 // BAppFileInfo(BFile *file) 1033 // * NULL file => InitCheck() == B_BAD_VALUE 1034 NextSubTest(); 1035 { 1036 BAppFileInfo appFileInfo(NULL); 1037 CHK(appFileInfo.InitCheck() == B_BAD_VALUE); 1038 CHK(appFileInfo.IsUsingAttributes() == hasInitialLocation); 1039 CHK(appFileInfo.IsUsingResources() == hasInitialLocation); 1040 } 1041 // * invalid file => InitCheck() == B_BAD_VALUE 1042 NextSubTest(); 1043 { 1044 BFile file; 1045 BAppFileInfo appFileInfo(&file); 1046 CHK(appFileInfo.InitCheck() == B_BAD_VALUE); 1047 CHK(appFileInfo.IsUsingAttributes() == hasInitialLocation); 1048 CHK(appFileInfo.IsUsingResources() == hasInitialLocation); 1049 } 1050 // * valid file => InitCheck() == B_OK 1051 NextSubTest(); 1052 { 1053 BFile file(testFile1, B_READ_WRITE); 1054 BAppFileInfo appFileInfo(&file); 1055 CHK(appFileInfo.InitCheck() == B_OK); 1056 CHK(appFileInfo.IsUsingAttributes() == true); 1057 CHK(appFileInfo.IsUsingResources() == true); 1058 } 1059 } 1060 1061 // InitTest2 1062 void 1063 AppFileInfoTest::InitTest2() 1064 { 1065 #ifdef TEST_R5 1066 const bool hasInitialLocation = false; 1067 #else 1068 const bool hasInitialLocation = true; 1069 #endif 1070 // status_t SetTo(BFile *file) 1071 // * NULL file => InitCheck() == B_NO_INIT 1072 NextSubTest(); 1073 { 1074 BAppFileInfo appFileInfo; 1075 CHK(appFileInfo.SetTo(NULL) == B_BAD_VALUE); 1076 CHK(appFileInfo.InitCheck() == B_BAD_VALUE); 1077 CHK(appFileInfo.IsUsingAttributes() == hasInitialLocation); 1078 CHK(appFileInfo.IsUsingResources() == hasInitialLocation); 1079 } 1080 // * invalid file => InitCheck() == B_BAD_VALUE 1081 NextSubTest(); 1082 { 1083 BFile file; 1084 BAppFileInfo appFileInfo; 1085 CHK(appFileInfo.SetTo(&file) == B_BAD_VALUE); 1086 CHK(appFileInfo.InitCheck() == B_BAD_VALUE); 1087 CHK(appFileInfo.IsUsingAttributes() == hasInitialLocation); 1088 CHK(appFileInfo.IsUsingResources() == hasInitialLocation); 1089 } 1090 // * valid file => InitCheck() == B_OK 1091 // * reinitialize invalid/valid => InitCheck() == B_BAD_VALUE/B_OK 1092 NextSubTest(); 1093 { 1094 BFile file(testFile1, B_READ_WRITE); 1095 BAppFileInfo appFileInfo; 1096 CHK(appFileInfo.SetTo(&file) == B_OK); 1097 CHK(appFileInfo.InitCheck() == B_OK); 1098 CHK(appFileInfo.IsUsingAttributes() == true); 1099 CHK(appFileInfo.IsUsingResources() == true); 1100 off_t size; 1101 CHK(file.GetSize(&size) == B_OK); 1102 CHK(size == 0); 1103 CheckNoAttr(file, kTypeAttribute); 1104 CheckNoAttr(file, kMiniIconAttribute); 1105 CheckNoAttr(file, kLargeIconAttribute); 1106 // reinit with NULL file 1107 CHK(appFileInfo.SetTo(NULL) == B_BAD_VALUE); 1108 CHK(appFileInfo.InitCheck() == B_BAD_VALUE); 1109 CHK(appFileInfo.IsUsingAttributes() == true); 1110 CHK(appFileInfo.IsUsingResources() == true); 1111 CHK(file.GetSize(&size) == B_OK); 1112 CHK(size == 0); 1113 CheckNoAttr(file, kTypeAttribute); 1114 CheckNoAttr(file, kMiniIconAttribute); 1115 CheckNoAttr(file, kLargeIconAttribute); 1116 // reinit with valid file 1117 BFile file2(testFile2, B_READ_WRITE); 1118 CHK(appFileInfo.SetTo(&file2) == B_OK); 1119 CHK(appFileInfo.InitCheck() == B_OK); 1120 CHK(appFileInfo.IsUsingAttributes() == true); 1121 CHK(appFileInfo.IsUsingResources() == true); 1122 } 1123 } 1124 1125 // TypeTest 1126 void 1127 AppFileInfoTest::TypeTest() 1128 { 1129 // status_t GetType(char *type) const 1130 // * NULL type => B_BAD_ADDRESS/B_BAD_VALUE 1131 NextSubTest(); 1132 { 1133 BFile file(testFile1, B_READ_WRITE); 1134 BAppFileInfo appFileInfo; 1135 CHK(appFileInfo.SetTo(&file) == B_OK); 1136 CHK(equals(appFileInfo.GetType(NULL), B_BAD_ADDRESS, B_BAD_VALUE)); 1137 } 1138 // * uninitialized => B_NO_INIT 1139 NextSubTest(); 1140 { 1141 BAppFileInfo appFileInfo; 1142 char type[B_MIME_TYPE_LENGTH]; 1143 CHK(appFileInfo.GetType(type) == B_NO_INIT); 1144 } 1145 // * has no type => B_ENTRY_NOT_FOUND 1146 NextSubTest(); 1147 { 1148 BFile file(testFile1, B_READ_WRITE); 1149 BAppFileInfo appFileInfo; 1150 CHK(appFileInfo.SetTo(&file) == B_OK); 1151 char type[B_MIME_TYPE_LENGTH]; 1152 CHK(appFileInfo.GetType(type) == B_ENTRY_NOT_FOUND); 1153 } 1154 // * set, get, reset, get 1155 NextSubTest(); 1156 { 1157 BFile file(testFile1, B_READ_WRITE); 1158 BAppFileInfo appFileInfo; 1159 CHK(appFileInfo.SetTo(&file) == B_OK); 1160 // set 1161 CHK(appFileInfo.SetType(testType1) == B_OK); 1162 // get 1163 char type[B_MIME_TYPE_LENGTH]; 1164 CHK(appFileInfo.GetType(type) == B_OK); 1165 CHK(strcmp(testType1, type) == 0); 1166 CheckTypeAttr(file, testType1); 1167 SyncResources(appFileInfo); 1168 CheckTypeResource(file, testType1); 1169 // reset 1170 CHK(appFileInfo.SetType(testType2) == B_OK); 1171 // get 1172 CHK(appFileInfo.GetType(type) == B_OK); 1173 CHK(strcmp(testType2, type) == 0); 1174 CheckTypeAttr(file, testType2); 1175 SyncResources(appFileInfo); 1176 CheckTypeResource(file, testType2); 1177 } 1178 1179 // status_t SetType(const char *type) 1180 // * NULL type => B_OK, unsets the type 1181 NextSubTest(); 1182 { 1183 BFile file(testFile1, B_READ_WRITE); 1184 BAppFileInfo appFileInfo; 1185 CHK(appFileInfo.SetTo(&file) == B_OK); 1186 CHK(appFileInfo.SetType(NULL) == B_OK); 1187 // get 1188 char type[B_MIME_TYPE_LENGTH]; 1189 CHK(appFileInfo.GetType(type) == B_ENTRY_NOT_FOUND); 1190 CheckNoAttr(file, kTypeAttribute); 1191 SyncResources(appFileInfo); 1192 CheckNoResource(file, kTypeAttribute); 1193 } 1194 // * uninitialized => B_NO_INIT 1195 NextSubTest(); 1196 { 1197 BAppFileInfo appFileInfo; 1198 CHK(appFileInfo.SetType(testType1) == B_NO_INIT); 1199 } 1200 // * invalid MIME type => B_OK 1201 NextSubTest(); 1202 { 1203 BFile file(testFile1, B_READ_WRITE); 1204 BAppFileInfo appFileInfo; 1205 CHK(appFileInfo.SetTo(&file) == B_OK); 1206 CHK(appFileInfo.SetType(invalidTestType) == B_OK); 1207 // get 1208 char type[B_MIME_TYPE_LENGTH]; 1209 CHK(appFileInfo.GetType(type) == B_OK); 1210 CHK(strcmp(invalidTestType, type) == 0); 1211 CheckTypeAttr(file, invalidTestType); 1212 SyncResources(appFileInfo); 1213 CheckTypeResource(file, invalidTestType); 1214 } 1215 // * type string too long => B_BAD_VALUE 1216 NextSubTest(); 1217 { 1218 BFile file(testFile1, B_READ_WRITE); 1219 BAppFileInfo appFileInfo; 1220 CHK(appFileInfo.SetTo(&file) == B_OK); 1221 // remove attr first 1222 CHK(appFileInfo.SetType(NULL) == B_OK); 1223 // try to set the too long type 1224 CHK(appFileInfo.SetType(tooLongTestType) == B_BAD_VALUE); 1225 CheckNoAttr(file, kTypeAttribute); 1226 SyncResources(appFileInfo); 1227 CheckNoResource(file, kTypeAttribute); 1228 } 1229 } 1230 1231 // SignatureTest 1232 void 1233 AppFileInfoTest::SignatureTest() 1234 { 1235 // status_t GetSignature(char *signature) const 1236 // * NULL signature => B_BAD_ADDRESS/B_BAD_VALUE 1237 NextSubTest(); 1238 { 1239 BFile file(testFile1, B_READ_WRITE); 1240 BAppFileInfo appFileInfo; 1241 CHK(appFileInfo.SetTo(&file) == B_OK); 1242 CHK(equals(appFileInfo.GetSignature(NULL), B_BAD_ADDRESS, B_BAD_VALUE)); 1243 } 1244 // * uninitialized => B_NO_INIT 1245 NextSubTest(); 1246 { 1247 BAppFileInfo appFileInfo; 1248 char signature[B_MIME_TYPE_LENGTH]; 1249 CHK(appFileInfo.GetSignature(signature) == B_NO_INIT); 1250 } 1251 // * has no signature => B_ENTRY_NOT_FOUND 1252 NextSubTest(); 1253 { 1254 BFile file(testFile1, B_READ_WRITE); 1255 BAppFileInfo appFileInfo; 1256 CHK(appFileInfo.SetTo(&file) == B_OK); 1257 char signature[B_MIME_TYPE_LENGTH]; 1258 CHK(appFileInfo.GetSignature(signature) == B_ENTRY_NOT_FOUND); 1259 } 1260 // * set, get, reset, get 1261 NextSubTest(); 1262 { 1263 BFile file(testFile1, B_READ_WRITE); 1264 BAppFileInfo appFileInfo; 1265 CHK(appFileInfo.SetTo(&file) == B_OK); 1266 // set 1267 CHK(appFileInfo.SetSignature(testAppSignature1) == B_OK); 1268 CHK(BMimeType(testAppSignature1).IsInstalled() == false); 1269 // get 1270 char signature[B_MIME_TYPE_LENGTH]; 1271 CHK(appFileInfo.GetSignature(signature) == B_OK); 1272 CHK(strcmp(testAppSignature1, signature) == 0); 1273 CheckSignatureAttr(file, testAppSignature1); 1274 SyncResources(appFileInfo); 1275 CheckSignatureResource(file, testAppSignature1); 1276 // reset 1277 CHK(appFileInfo.SetSignature(testAppSignature2) == B_OK); 1278 CHK(BMimeType(testAppSignature2).IsInstalled() == false); 1279 // get 1280 CHK(appFileInfo.GetSignature(signature) == B_OK); 1281 CHK(strcmp(testAppSignature2, signature) == 0); 1282 CheckSignatureAttr(file, testAppSignature2); 1283 SyncResources(appFileInfo); 1284 CheckSignatureResource(file, testAppSignature2); 1285 } 1286 1287 // status_t SetSignature(const char *signature) 1288 // * NULL signature => B_OK, unsets the signature 1289 NextSubTest(); 1290 { 1291 BFile file(testFile1, B_READ_WRITE); 1292 BAppFileInfo appFileInfo; 1293 CHK(appFileInfo.SetTo(&file) == B_OK); 1294 CHK(appFileInfo.SetSignature(NULL) == B_OK); 1295 // get 1296 char signature[B_MIME_TYPE_LENGTH]; 1297 CHK(appFileInfo.GetSignature(signature) == B_ENTRY_NOT_FOUND); 1298 CheckNoAttr(file, kSignatureAttribute); 1299 SyncResources(appFileInfo); 1300 CheckNoResource(file, kSignatureAttribute); 1301 } 1302 // * uninitialized => B_NO_INIT 1303 NextSubTest(); 1304 { 1305 BAppFileInfo appFileInfo; 1306 CHK(appFileInfo.SetSignature(testAppSignature1) == B_NO_INIT); 1307 } 1308 // * invalid MIME signature => B_OK 1309 NextSubTest(); 1310 { 1311 BFile file(testFile1, B_READ_WRITE); 1312 BAppFileInfo appFileInfo; 1313 CHK(appFileInfo.SetTo(&file) == B_OK); 1314 CHK(appFileInfo.SetSignature(invalidTestType) == B_OK); 1315 // get 1316 char signature[B_MIME_TYPE_LENGTH]; 1317 CHK(appFileInfo.GetSignature(signature) == B_OK); 1318 CHK(strcmp(invalidTestType, signature) == 0); 1319 CheckSignatureAttr(file, invalidTestType); 1320 SyncResources(appFileInfo); 1321 CheckSignatureResource(file, invalidTestType); 1322 } 1323 // * signature string too long => B_BAD_VALUE 1324 NextSubTest(); 1325 { 1326 BFile file(testFile1, B_READ_WRITE); 1327 BAppFileInfo appFileInfo; 1328 CHK(appFileInfo.SetTo(&file) == B_OK); 1329 // remove attr first 1330 CHK(appFileInfo.SetSignature(NULL) == B_OK); 1331 // try to set the too long signature 1332 CHK(appFileInfo.SetSignature(tooLongTestType) == B_BAD_VALUE); 1333 CheckNoAttr(file, kSignatureAttribute); 1334 SyncResources(appFileInfo); 1335 CheckNoResource(file, kSignatureAttribute); 1336 } 1337 } 1338 1339 // AppFlagsTest 1340 void 1341 AppFileInfoTest::AppFlagsTest() 1342 { 1343 // status_t GetAppFlags(uint32 *flags) const 1344 // * NULL flags => B_BAD_ADDRESS/B_BAD_VALUE 1345 NextSubTest(); 1346 { 1347 BFile file(testFile1, B_READ_WRITE); 1348 BAppFileInfo appFileInfo; 1349 CHK(appFileInfo.SetTo(&file) == B_OK); 1350 CHK(equals(appFileInfo.GetAppFlags(NULL), B_BAD_ADDRESS, B_BAD_VALUE)); 1351 } 1352 // * uninitialized => B_NO_INIT 1353 NextSubTest(); 1354 { 1355 BAppFileInfo appFileInfo; 1356 uint32 flags; 1357 CHK(appFileInfo.GetAppFlags(&flags) == B_NO_INIT); 1358 } 1359 // * has no flags => B_ENTRY_NOT_FOUND 1360 NextSubTest(); 1361 { 1362 BFile file(testFile1, B_READ_WRITE); 1363 BAppFileInfo appFileInfo; 1364 CHK(appFileInfo.SetTo(&file) == B_OK); 1365 uint32 flags; 1366 CHK(appFileInfo.GetAppFlags(&flags) == B_ENTRY_NOT_FOUND); 1367 } 1368 // * set, get, reset, get 1369 NextSubTest(); 1370 { 1371 uint32 testFlags1 = B_SINGLE_LAUNCH | B_BACKGROUND_APP; 1372 uint32 testFlags2 = B_MULTIPLE_LAUNCH | B_ARGV_ONLY; 1373 BFile file(testFile1, B_READ_WRITE); 1374 BAppFileInfo appFileInfo; 1375 CHK(appFileInfo.SetTo(&file) == B_OK); 1376 // set 1377 CHK(appFileInfo.SetAppFlags(testFlags1) == B_OK); 1378 // get 1379 uint32 flags; 1380 CHK(appFileInfo.GetAppFlags(&flags) == B_OK); 1381 CHK(flags == testFlags1); 1382 CheckAppFlagsAttr(file, testFlags1); 1383 SyncResources(appFileInfo); 1384 CheckAppFlagsResource(file, testFlags1); 1385 // reset 1386 CHK(appFileInfo.SetAppFlags(testFlags2) == B_OK); 1387 // get 1388 CHK(appFileInfo.GetAppFlags(&flags) == B_OK); 1389 CHK(flags == testFlags2); 1390 CheckAppFlagsAttr(file, testFlags2); 1391 SyncResources(appFileInfo); 1392 CheckAppFlagsResource(file, testFlags2); 1393 } 1394 1395 // status_t SetAppFlags(uint32 flags) 1396 // * uninitialized => B_NO_INIT 1397 NextSubTest(); 1398 { 1399 BAppFileInfo appFileInfo; 1400 CHK(appFileInfo.SetAppFlags(B_SINGLE_LAUNCH) == B_NO_INIT); 1401 } 1402 } 1403 1404 // IsSupportingApp 1405 static 1406 bool 1407 IsSupportingApp(const char *type, const char *signature) 1408 { 1409 BMessage apps; 1410 // CHK(BMimeType(type).GetSupportingApps(&apps) == B_OK); 1411 BMimeType(type).GetSupportingApps(&apps); 1412 bool found = false; 1413 BString app; 1414 for (int32 i = 0; 1415 !found && apps.FindString("applications", i, &app) == B_OK; 1416 i++) { 1417 found = (app == signature); 1418 } 1419 return found; 1420 } 1421 1422 // SupportedTypesTest 1423 void 1424 AppFileInfoTest::SupportedTypesTest() 1425 { 1426 // test data 1427 BMessage testTypes1; 1428 CHK(testTypes1.AddString("types", testType1) == B_OK); 1429 CHK(testTypes1.AddString("types", testType2) == B_OK); 1430 BMessage testTypes2; 1431 CHK(testTypes2.AddString("types", testType3) == B_OK); 1432 CHK(testTypes2.AddString("types", testType4) == B_OK); 1433 BMimeType mimeTestType1(testType1); 1434 BMimeType mimeTestType2(testType2); 1435 BMimeType mimeTestType3(testType3); 1436 BMimeType mimeTestType4(testType4); 1437 // add and install the app signature 1438 { 1439 BFile file(testFile1, B_READ_WRITE); 1440 BAppFileInfo appFileInfo; 1441 CHK(appFileInfo.SetTo(&file) == B_OK); 1442 CHK(appFileInfo.SetSignature(testAppSignature1) == B_OK); 1443 CHK(BMimeType(testAppSignature1).Install() == B_OK); 1444 } 1445 1446 // status_t GetSupportedTypes(BMessage *types) const; 1447 // * uninitialized => B_NO_INIT 1448 NextSubTest(); 1449 { 1450 BAppFileInfo appFileInfo; 1451 BMessage types; 1452 CHK(appFileInfo.GetSupportedTypes(&types) == B_NO_INIT); 1453 } 1454 // * has no supported types => B_ENTRY_NOT_FOUND 1455 NextSubTest(); 1456 { 1457 BFile file(testFile1, B_READ_WRITE); 1458 BAppFileInfo appFileInfo; 1459 CHK(appFileInfo.SetTo(&file) == B_OK); 1460 BMessage types; 1461 CHK(appFileInfo.GetSupportedTypes(&types) == B_ENTRY_NOT_FOUND); 1462 } 1463 // * set, get, reset, get 1464 NextSubTest(); 1465 { 1466 BFile file(testFile1, B_READ_WRITE); 1467 BAppFileInfo appFileInfo; 1468 CHK(appFileInfo.SetTo(&file) == B_OK); 1469 // set 1470 CHK(BMimeType(testType1).IsInstalled() == false); 1471 CHK(BMimeType(testType2).IsInstalled() == false); 1472 CHK(appFileInfo.SetSupportedTypes(&testTypes1) == B_OK); 1473 // get 1474 BMessage types; 1475 CHK(appFileInfo.GetSupportedTypes(&types) == B_OK); 1476 CHK(SupportedTypesValue(types) == SupportedTypesValue(testTypes1)); 1477 CHK(appFileInfo.IsSupportedType(testType1) == true); 1478 CHK(appFileInfo.IsSupportedType(testType2) == true); 1479 CHK(appFileInfo.Supports(&mimeTestType1) == true); 1480 CHK(appFileInfo.Supports(&mimeTestType2) == true); 1481 CheckSupportedTypesAttr(file, &testTypes1); 1482 SyncResources(appFileInfo); 1483 CheckSupportedTypesResource(file, &testTypes1); 1484 CHK(BMimeType(testType1).IsInstalled() == true); 1485 CHK(BMimeType(testType2).IsInstalled() == true); 1486 // reset 1487 CHK(BMimeType(testType3).IsInstalled() == false); 1488 CHK(BMimeType(testType4).IsInstalled() == false); 1489 CHK(appFileInfo.SetSupportedTypes(&testTypes2) == B_OK); 1490 // get 1491 BMessage types2; 1492 CHK(appFileInfo.GetSupportedTypes(&types2) == B_OK); 1493 CHK(SupportedTypesValue(types2) == SupportedTypesValue(testTypes2)); 1494 CHK(appFileInfo.IsSupportedType(testType1) == false); 1495 CHK(appFileInfo.IsSupportedType(testType2) == false); 1496 CHK(appFileInfo.IsSupportedType(testType3) == true); 1497 CHK(appFileInfo.IsSupportedType(testType4) == true); 1498 CHK(appFileInfo.Supports(&mimeTestType1) == false); 1499 CHK(appFileInfo.Supports(&mimeTestType2) == false); 1500 CHK(appFileInfo.Supports(&mimeTestType3) == true); 1501 CHK(appFileInfo.Supports(&mimeTestType4) == true); 1502 CheckSupportedTypesAttr(file, &testTypes2); 1503 SyncResources(appFileInfo); 1504 CheckSupportedTypesResource(file, &testTypes2); 1505 CHK(BMimeType(testType3).IsInstalled() == true); 1506 CHK(BMimeType(testType4).IsInstalled() == true); 1507 } 1508 // * partially filled types => types is cleared beforehand 1509 NextSubTest(); 1510 { 1511 BFile file(testFile1, B_READ_WRITE); 1512 BAppFileInfo appFileInfo; 1513 CHK(appFileInfo.SetTo(&file) == B_OK); 1514 BMessage types2; 1515 CHK(types2.AddString("types", testType1) == B_OK); 1516 CHK(types2.AddString("dummy", "Hello") == B_OK); 1517 CHK(appFileInfo.GetSupportedTypes(&types2) == B_OK); 1518 CHK(SupportedTypesValue(types2) == SupportedTypesValue(testTypes2)); 1519 const char *dummy; 1520 CHK(types2.FindString("dummy", &dummy) != B_OK); 1521 } 1522 // * NULL types => B_BAD_VALUE 1523 // R5: crashes when passing NULL types 1524 #ifndef TEST_R5 1525 NextSubTest(); 1526 { 1527 BFile file(testFile1, B_READ_WRITE); 1528 BAppFileInfo appFileInfo; 1529 CHK(appFileInfo.SetTo(&file) == B_OK); 1530 CHK(appFileInfo.GetSupportedTypes(NULL) == B_BAD_VALUE); 1531 } 1532 #endif 1533 1534 // status_t SetSupportedTypes(const BMessage *types, bool syncAll); 1535 // status_t SetSupportedTypes(const BMessage *types); 1536 // * uninitialized => B_NO_INIT 1537 NextSubTest(); 1538 { 1539 BAppFileInfo appFileInfo; 1540 BMessage types; 1541 CHK(appFileInfo.SetSupportedTypes(&types) == B_NO_INIT); 1542 } 1543 // * NULL types => unsets supported types 1544 NextSubTest(); 1545 { 1546 BFile file(testFile1, B_READ_WRITE); 1547 BAppFileInfo appFileInfo; 1548 CHK(appFileInfo.SetTo(&file) == B_OK); 1549 // set 1550 CHK(appFileInfo.SetSupportedTypes(NULL) == B_OK); 1551 // get 1552 BMessage types; 1553 CHK(appFileInfo.GetSupportedTypes(&types) == B_ENTRY_NOT_FOUND); 1554 CHK(appFileInfo.IsSupportedType(testType1) == false); 1555 CHK(appFileInfo.IsSupportedType(testType2) == false); 1556 CHK(appFileInfo.IsSupportedType(testType3) == false); 1557 CHK(appFileInfo.IsSupportedType(testType4) == false); 1558 CHK(appFileInfo.Supports(&mimeTestType1) == false); 1559 CHK(appFileInfo.Supports(&mimeTestType2) == false); 1560 CHK(appFileInfo.Supports(&mimeTestType3) == false); 1561 CHK(appFileInfo.Supports(&mimeTestType4) == false); 1562 CheckNoAttr(file, kSupportedTypesAttribute); 1563 SyncResources(appFileInfo); 1564 CheckNoResource(file, kSupportedTypesAttribute); 1565 // set: syncAll = true 1566 // R5: crashes when passing NULL types 1567 #ifndef TEST_R5 1568 CHK(appFileInfo.SetSupportedTypes(&testTypes1) == B_OK); 1569 CHK(appFileInfo.SetSupportedTypes(NULL, true) == B_OK); 1570 // get 1571 CHK(appFileInfo.GetSupportedTypes(&types) == B_ENTRY_NOT_FOUND); 1572 CHK(appFileInfo.IsSupportedType(testType1) == false); 1573 CHK(appFileInfo.IsSupportedType(testType2) == false); 1574 CHK(appFileInfo.IsSupportedType(testType3) == false); 1575 CHK(appFileInfo.IsSupportedType(testType4) == false); 1576 CHK(appFileInfo.Supports(&mimeTestType1) == false); 1577 CHK(appFileInfo.Supports(&mimeTestType2) == false); 1578 CHK(appFileInfo.Supports(&mimeTestType3) == false); 1579 CHK(appFileInfo.Supports(&mimeTestType4) == false); 1580 CheckNoAttr(file, kSupportedTypesAttribute); 1581 SyncResources(appFileInfo); 1582 CheckNoResource(file, kSupportedTypesAttribute); 1583 #endif 1584 } 1585 // * cross check with BMimeType::GetSupportingApps(): no syncAll 1586 NextSubTest(); 1587 { 1588 // clean up 1589 CHK(BMimeType(testType1).Delete() == B_OK); 1590 CHK(BMimeType(testType2).Delete() == B_OK); 1591 CHK(BMimeType(testType3).Delete() == B_OK); 1592 CHK(BMimeType(testType4).Delete() == B_OK); 1593 CHK(BMimeType(testAppSignature1).Delete() == B_OK); 1594 CHK(BMimeType(testAppSignature1).Install() == B_OK); 1595 CHK(BEntry(testFile1).Remove() == B_OK); 1596 // init 1597 BFile file(testFile1, B_READ_WRITE | B_CREATE_FILE); 1598 BAppFileInfo appFileInfo; 1599 CHK(appFileInfo.SetTo(&file) == B_OK); 1600 CHK(appFileInfo.SetSignature(testAppSignature1) == B_OK); 1601 // set 1602 CHK(appFileInfo.SetSupportedTypes(&testTypes1) == B_OK); 1603 // get 1604 CHK(IsSupportingApp(testType1, testAppSignature1) == true); 1605 CHK(IsSupportingApp(testType2, testAppSignature1) == true); 1606 // reset 1607 CHK(appFileInfo.SetSupportedTypes(&testTypes2) == B_OK); 1608 // get 1609 CHK(IsSupportingApp(testType1, testAppSignature1) == true); 1610 CHK(IsSupportingApp(testType2, testAppSignature1) == true); 1611 CHK(IsSupportingApp(testType3, testAppSignature1) == true); 1612 CHK(IsSupportingApp(testType4, testAppSignature1) == true); 1613 } 1614 // * cross check with BMimeType::GetSupportingApps(): syncAll == false 1615 NextSubTest(); 1616 { 1617 // clean up 1618 CHK(BMimeType(testType1).Delete() == B_OK); 1619 CHK(BMimeType(testType2).Delete() == B_OK); 1620 CHK(BMimeType(testType3).Delete() == B_OK); 1621 CHK(BMimeType(testType4).Delete() == B_OK); 1622 CHK(BMimeType(testAppSignature1).Delete() == B_OK); 1623 CHK(BMimeType(testAppSignature1).Install() == B_OK); 1624 CHK(BEntry(testFile1).Remove() == B_OK); 1625 // init 1626 BFile file(testFile1, B_READ_WRITE | B_CREATE_FILE); 1627 BAppFileInfo appFileInfo; 1628 CHK(appFileInfo.SetTo(&file) == B_OK); 1629 CHK(appFileInfo.SetSignature(testAppSignature1) == B_OK); 1630 // set 1631 CHK(appFileInfo.SetSupportedTypes(&testTypes1, false) == B_OK); 1632 // get 1633 CHK(IsSupportingApp(testType1, testAppSignature1) == true); 1634 CHK(IsSupportingApp(testType2, testAppSignature1) == true); 1635 // reset 1636 CHK(appFileInfo.SetSupportedTypes(&testTypes2, false) == B_OK); 1637 // get 1638 CHK(IsSupportingApp(testType1, testAppSignature1) == true); 1639 CHK(IsSupportingApp(testType2, testAppSignature1) == true); 1640 CHK(IsSupportingApp(testType3, testAppSignature1) == true); 1641 CHK(IsSupportingApp(testType4, testAppSignature1) == true); 1642 } 1643 // * cross check with BMimeType::GetSupportingApps(): syncAll == true 1644 NextSubTest(); 1645 { 1646 // clean up 1647 CHK(BMimeType(testType1).Delete() == B_OK); 1648 CHK(BMimeType(testType2).Delete() == B_OK); 1649 CHK(BMimeType(testType3).Delete() == B_OK); 1650 CHK(BMimeType(testType4).Delete() == B_OK); 1651 CHK(BMimeType(testAppSignature1).Delete() == B_OK); 1652 CHK(BMimeType(testAppSignature1).Install() == B_OK); 1653 CHK(BEntry(testFile1).Remove() == B_OK); 1654 // init 1655 BFile file(testFile1, B_READ_WRITE | B_CREATE_FILE); 1656 BAppFileInfo appFileInfo; 1657 CHK(appFileInfo.SetTo(&file) == B_OK); 1658 CHK(appFileInfo.SetSignature(testAppSignature1) == B_OK); 1659 // set 1660 CHK(appFileInfo.SetSupportedTypes(&testTypes1, true) == B_OK); 1661 // get 1662 CHK(IsSupportingApp(testType1, testAppSignature1) == true); 1663 CHK(IsSupportingApp(testType2, testAppSignature1) == true); 1664 // reset 1665 CHK(appFileInfo.SetSupportedTypes(&testTypes2, true) == B_OK); 1666 // get 1667 CHK(IsSupportingApp(testType1, testAppSignature1) == false); 1668 CHK(IsSupportingApp(testType2, testAppSignature1) == false); 1669 CHK(IsSupportingApp(testType3, testAppSignature1) == true); 1670 CHK(IsSupportingApp(testType4, testAppSignature1) == true); 1671 } 1672 // * types contains invalid MIME types 1673 // R5: doesn't fail 1674 #ifndef TEST_R5 1675 NextSubTest(); 1676 { 1677 // init 1678 BFile file(testFile1, B_READ_WRITE); 1679 BAppFileInfo appFileInfo; 1680 CHK(appFileInfo.SetTo(&file) == B_OK); 1681 // set 1682 BMessage invalidTestTypes; 1683 CHK(invalidTestTypes.AddString("types", invalidTestType) == B_OK); 1684 CHK(appFileInfo.SetSupportedTypes(NULL, true) == B_OK); 1685 CHK(appFileInfo.SetSupportedTypes(&invalidTestTypes, false) 1686 == B_BAD_VALUE); 1687 // get 1688 BMessage types; 1689 CHK(appFileInfo.GetSupportedTypes(&types) == B_ENTRY_NOT_FOUND); 1690 CHK(appFileInfo.IsSupportedType(invalidTestType) == false); 1691 CheckNoAttr(file, kSupportedTypesAttribute); 1692 SyncResources(appFileInfo); 1693 CheckNoResource(file, kSupportedTypesAttribute); 1694 } 1695 #endif 1696 1697 // bool IsSupportedType(const char *type) const; 1698 // bool Supports(BMimeType *type) const; 1699 // * NULL type => false 1700 NextSubTest(); 1701 { 1702 BFile file(testFile1, B_READ_WRITE); 1703 BAppFileInfo appFileInfo; 1704 CHK(appFileInfo.SetTo(&file) == B_OK); 1705 CHK(appFileInfo.IsSupportedType(NULL) == false); 1706 // R5: crashes when passing a NULL type 1707 #ifndef TEST_R5 1708 CHK(appFileInfo.Supports(NULL) == false); 1709 #endif 1710 } 1711 // * supports "application/octet-stream" 1712 NextSubTest(); 1713 { 1714 BFile file(testFile1, B_READ_WRITE); 1715 BAppFileInfo appFileInfo; 1716 CHK(appFileInfo.SetTo(&file) == B_OK); 1717 BMimeType gifType("image/gif"); 1718 CHK(appFileInfo.IsSupportedType(gifType.Type()) == false); 1719 CHK(appFileInfo.Supports(&gifType) == false); 1720 BMessage types; 1721 CHK(types.AddString("types", "application/octet-stream") == B_OK); 1722 CHK(appFileInfo.SetSupportedTypes(&types) == B_OK); 1723 CHK(appFileInfo.IsSupportedType(gifType.Type()) == true); 1724 CHK(appFileInfo.Supports(&gifType) == false); 1725 BMessage noTypes; 1726 CHK(appFileInfo.SetSupportedTypes(&noTypes, true) == B_OK); 1727 } 1728 1729 // various 1730 // * signature not installed, syncAll = true 1731 NextSubTest(); 1732 { 1733 // clean up 1734 CHK(BMimeType(testType1).Delete() == B_OK); 1735 CHK(BMimeType(testType2).Delete() == B_OK); 1736 CHK(BMimeType(testType3).Delete() == B_OK); 1737 CHK(BMimeType(testType4).Delete() == B_OK); 1738 CHK(BMimeType(testAppSignature1).Delete() == B_OK); 1739 CHK(BEntry(testFile1).Remove() == B_OK); 1740 // init 1741 BFile file(testFile1, B_READ_WRITE | B_CREATE_FILE); 1742 BAppFileInfo appFileInfo; 1743 CHK(appFileInfo.SetTo(&file) == B_OK); 1744 CHK(appFileInfo.SetSignature(testAppSignature1) == B_OK); 1745 // set 1746 CHK(BMimeType(testType1).IsInstalled() == false); 1747 CHK(BMimeType(testType2).IsInstalled() == false); 1748 CHK(appFileInfo.SetSupportedTypes(&testTypes1, true) == B_OK); 1749 // get 1750 BMessage types; 1751 CHK(appFileInfo.GetSupportedTypes(&types) == B_OK); 1752 CHK(SupportedTypesValue(types) == SupportedTypesValue(testTypes1)); 1753 CHK(appFileInfo.IsSupportedType(testType1) == true); 1754 CHK(appFileInfo.IsSupportedType(testType2) == true); 1755 CHK(appFileInfo.Supports(&mimeTestType1) == true); 1756 CHK(appFileInfo.Supports(&mimeTestType2) == true); 1757 CheckSupportedTypesAttr(file, &testTypes1); 1758 SyncResources(appFileInfo); 1759 CheckSupportedTypesResource(file, &testTypes1); 1760 CHK(BMimeType(testType1).IsInstalled() == false); 1761 CHK(BMimeType(testType2).IsInstalled() == false); 1762 // set 1763 CHK(BMimeType(testType3).IsInstalled() == false); 1764 CHK(BMimeType(testType4).IsInstalled() == false); 1765 CHK(appFileInfo.SetSupportedTypes(&testTypes2, true) == B_OK); 1766 // get 1767 CHK(appFileInfo.GetSupportedTypes(&types) == B_OK); 1768 CHK(SupportedTypesValue(types) == SupportedTypesValue(testTypes2)); 1769 CHK(appFileInfo.IsSupportedType(testType1) == false); 1770 CHK(appFileInfo.IsSupportedType(testType2) == false); 1771 CHK(appFileInfo.IsSupportedType(testType3) == true); 1772 CHK(appFileInfo.IsSupportedType(testType4) == true); 1773 CHK(appFileInfo.Supports(&mimeTestType1) == false); 1774 CHK(appFileInfo.Supports(&mimeTestType2) == false); 1775 CHK(appFileInfo.Supports(&mimeTestType3) == true); 1776 CHK(appFileInfo.Supports(&mimeTestType4) == true); 1777 CheckSupportedTypesAttr(file, &testTypes2); 1778 SyncResources(appFileInfo); 1779 CheckSupportedTypesResource(file, &testTypes2); 1780 CHK(BMimeType(testType1).IsInstalled() == false); 1781 CHK(BMimeType(testType2).IsInstalled() == false); 1782 CHK(BMimeType(testType3).IsInstalled() == false); 1783 // R5: returns true. In fact the last SetSupportedTypes() installed testType4 1784 // in the database, but not testType3. Certainly a bug 1785 #ifndef TEST_R5 1786 CHK(BMimeType(testType4).IsInstalled() == false); 1787 #endif 1788 } 1789 // * signature not installed, no syncAll 1790 NextSubTest(); 1791 { 1792 // clean up 1793 BMimeType(testType1).Delete(); 1794 BMimeType(testType2).Delete(); 1795 BMimeType(testType3).Delete(); 1796 BMimeType(testType4).Delete(); 1797 BMimeType(testAppSignature1).Delete(); 1798 CHK(BEntry(testFile1).Remove() == B_OK); 1799 // init 1800 BFile file(testFile1, B_READ_WRITE | B_CREATE_FILE); 1801 BAppFileInfo appFileInfo; 1802 CHK(appFileInfo.SetTo(&file) == B_OK); 1803 CHK(appFileInfo.SetSignature(testAppSignature1) == B_OK); 1804 // set 1805 CHK(BMimeType(testType1).IsInstalled() == false); 1806 CHK(BMimeType(testType2).IsInstalled() == false); 1807 // R5: SetSupportedTypes() returns B_ENTRY_NOT_FOUND, although it does not 1808 // fail. 1809 #ifdef TEST_R5 1810 CHK(appFileInfo.SetSupportedTypes(&testTypes1) == B_ENTRY_NOT_FOUND); 1811 #else 1812 CHK(appFileInfo.SetSupportedTypes(&testTypes1) == B_OK); 1813 #endif 1814 // get 1815 BMessage types; 1816 CHK(appFileInfo.GetSupportedTypes(&types) == B_OK); 1817 CHK(SupportedTypesValue(types) == SupportedTypesValue(testTypes1)); 1818 CHK(appFileInfo.IsSupportedType(testType1) == true); 1819 CHK(appFileInfo.IsSupportedType(testType2) == true); 1820 CHK(appFileInfo.Supports(&mimeTestType1) == true); 1821 CHK(appFileInfo.Supports(&mimeTestType2) == true); 1822 CheckSupportedTypesAttr(file, &testTypes1); 1823 SyncResources(appFileInfo); 1824 CheckSupportedTypesResource(file, &testTypes1); 1825 CHK(BMimeType(testType1).IsInstalled() == false); 1826 CHK(BMimeType(testType2).IsInstalled() == false); 1827 // set 1828 CHK(BMimeType(testType3).IsInstalled() == false); 1829 CHK(BMimeType(testType4).IsInstalled() == false); 1830 // R5: SetSupportedTypes() returns B_ENTRY_NOT_FOUND, although it does not 1831 // fail. 1832 #ifdef TEST_R5 1833 CHK(appFileInfo.SetSupportedTypes(&testTypes2) == B_ENTRY_NOT_FOUND); 1834 #else 1835 CHK(appFileInfo.SetSupportedTypes(&testTypes2) == B_OK); 1836 #endif 1837 // get 1838 CHK(appFileInfo.GetSupportedTypes(&types) == B_OK); 1839 CHK(SupportedTypesValue(types) == SupportedTypesValue(testTypes2)); 1840 CHK(appFileInfo.IsSupportedType(testType1) == false); 1841 CHK(appFileInfo.IsSupportedType(testType2) == false); 1842 CHK(appFileInfo.IsSupportedType(testType3) == true); 1843 CHK(appFileInfo.IsSupportedType(testType4) == true); 1844 CHK(appFileInfo.Supports(&mimeTestType1) == false); 1845 CHK(appFileInfo.Supports(&mimeTestType2) == false); 1846 CHK(appFileInfo.Supports(&mimeTestType3) == true); 1847 CHK(appFileInfo.Supports(&mimeTestType4) == true); 1848 CheckSupportedTypesAttr(file, &testTypes2); 1849 SyncResources(appFileInfo); 1850 CheckSupportedTypesResource(file, &testTypes2); 1851 CHK(BMimeType(testType1).IsInstalled() == false); 1852 CHK(BMimeType(testType2).IsInstalled() == false); 1853 CHK(BMimeType(testType3).IsInstalled() == false); 1854 // R5: returns true. In fact the last SetSupportedTypes() installed testType4 1855 // in the database, but not testType3. Certainly a bug 1856 #ifndef TEST_R5 1857 CHK(BMimeType(testType4).IsInstalled() == false); 1858 #endif 1859 } 1860 // * no signature 1861 NextSubTest(); 1862 { 1863 // clean up 1864 BMimeType(testType1).Delete(); 1865 BMimeType(testType2).Delete(); 1866 BMimeType(testType3).Delete(); 1867 BMimeType(testType4).Delete(); 1868 BMimeType(testAppSignature1).Delete(); 1869 CHK(BEntry(testFile1).Remove() == B_OK); 1870 // init 1871 BFile file(testFile1, B_READ_WRITE | B_CREATE_FILE); 1872 BAppFileInfo appFileInfo; 1873 CHK(appFileInfo.SetTo(&file) == B_OK); 1874 // set, syncAll = true 1875 CHK(BMimeType(testType1).IsInstalled() == false); 1876 CHK(BMimeType(testType2).IsInstalled() == false); 1877 CHK(appFileInfo.SetSupportedTypes(&testTypes1, true) 1878 == B_ENTRY_NOT_FOUND); 1879 // get 1880 BMessage types; 1881 CHK(appFileInfo.GetSupportedTypes(&types) == B_ENTRY_NOT_FOUND); 1882 CHK(appFileInfo.IsSupportedType(testType1) == false); 1883 CHK(appFileInfo.IsSupportedType(testType2) == false); 1884 CHK(appFileInfo.Supports(&mimeTestType1) == false); 1885 CHK(appFileInfo.Supports(&mimeTestType2) == false); 1886 CheckNoAttr(file, kSupportedTypesAttribute); 1887 SyncResources(appFileInfo); 1888 CheckNoResource(file, kSupportedTypesAttribute); 1889 CHK(BMimeType(testType1).IsInstalled() == false); 1890 CHK(BMimeType(testType2).IsInstalled() == false); 1891 // set, no syncAll 1892 CHK(BMimeType(testType1).IsInstalled() == false); 1893 CHK(BMimeType(testType2).IsInstalled() == false); 1894 CHK(appFileInfo.SetSupportedTypes(&testTypes1) == B_ENTRY_NOT_FOUND); 1895 // get 1896 CHK(appFileInfo.GetSupportedTypes(&types) == B_ENTRY_NOT_FOUND); 1897 CHK(appFileInfo.IsSupportedType(testType1) == false); 1898 CHK(appFileInfo.IsSupportedType(testType2) == false); 1899 CHK(appFileInfo.Supports(&mimeTestType1) == false); 1900 CHK(appFileInfo.Supports(&mimeTestType2) == false); 1901 CheckNoAttr(file, kSupportedTypesAttribute); 1902 SyncResources(appFileInfo); 1903 CheckNoResource(file, kSupportedTypesAttribute); 1904 CHK(BMimeType(testType1).IsInstalled() == false); 1905 CHK(BMimeType(testType2).IsInstalled() == false); 1906 } 1907 // * set supported types, remove file, create file, get supported types 1908 NextSubTest(); 1909 { 1910 // clean up 1911 BMimeType(testType1).Delete(); 1912 BMimeType(testType2).Delete(); 1913 BMimeType(testType3).Delete(); 1914 BMimeType(testType4).Delete(); 1915 BMimeType(testAppSignature1).Delete(); 1916 CHK(BMimeType(testAppSignature1).Install() == B_OK); 1917 CHK(BEntry(testFile1).Remove() == B_OK); 1918 // init 1919 BFile file(testFile1, B_READ_WRITE | B_CREATE_FILE); 1920 BAppFileInfo appFileInfo; 1921 CHK(appFileInfo.SetTo(&file) == B_OK); 1922 CHK(appFileInfo.SetSignature(testAppSignature1) == B_OK); 1923 // set 1924 CHK(appFileInfo.SetSupportedTypes(&testTypes1) == B_OK); 1925 // get 1926 BMessage types; 1927 CHK(appFileInfo.GetSupportedTypes(&types) == B_OK); 1928 CHK(SupportedTypesValue(types) == SupportedTypesValue(testTypes1)); 1929 CHK(appFileInfo.IsSupportedType(testType1) == true); 1930 CHK(appFileInfo.IsSupportedType(testType2) == true); 1931 CHK(appFileInfo.Supports(&mimeTestType1) == true); 1932 CHK(appFileInfo.Supports(&mimeTestType2) == true); 1933 CheckSupportedTypesAttr(file, &testTypes1); 1934 SyncResources(appFileInfo); 1935 CheckSupportedTypesResource(file, &testTypes1); 1936 CHK(IsSupportingApp(testType1, testAppSignature1) == true); 1937 CHK(IsSupportingApp(testType2, testAppSignature1) == true); 1938 // remove the file 1939 appFileInfo.SetTo(NULL); 1940 file.Unset(); 1941 CHK(BEntry(testFile1).Remove() == B_OK); 1942 // init 1943 CHK(file.SetTo(testFile1, B_READ_WRITE | B_CREATE_FILE) == B_OK); 1944 CHK(appFileInfo.SetTo(&file) == B_OK); 1945 CHK(appFileInfo.SetSignature(testAppSignature1) == B_OK); 1946 // get 1947 BMessage types2; 1948 CHK(appFileInfo.GetSupportedTypes(&types2) == B_ENTRY_NOT_FOUND); 1949 CHK(appFileInfo.IsSupportedType(testType1) == false); 1950 CHK(appFileInfo.IsSupportedType(testType2) == false); 1951 CHK(appFileInfo.Supports(&mimeTestType1) == false); 1952 CHK(appFileInfo.Supports(&mimeTestType2) == false); 1953 CheckNoAttr(file, kSupportedTypesAttribute); 1954 SyncResources(appFileInfo); 1955 CheckNoResource(file, kSupportedTypesAttribute); 1956 CHK(IsSupportingApp(testType1, testAppSignature1) == true); 1957 CHK(IsSupportingApp(testType2, testAppSignature1) == true); 1958 } 1959 } 1960 1961 // IconTest 1962 void 1963 AppFileInfoTest::IconTest() 1964 { 1965 // status_t GetIcon(BBitmap *icon, icon_size k) const 1966 // * NULL icon => B_BAD_VALUE 1967 NextSubTest(); 1968 { 1969 BFile file(testFile1, B_READ_WRITE); 1970 BAppFileInfo appFileInfo; 1971 CHK(appFileInfo.SetTo(&file) == B_OK); 1972 CHK(appFileInfo.GetIcon(NULL, B_MINI_ICON) == B_BAD_VALUE); 1973 CHK(appFileInfo.GetIcon(NULL, B_LARGE_ICON) == B_BAD_VALUE); 1974 } 1975 // * uninitialized => B_NO_INIT 1976 NextSubTest(); 1977 { 1978 BAppFileInfo appFileInfo; 1979 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 1980 CHK(appFileInfo.GetIcon(&icon, B_MINI_ICON) == B_NO_INIT); 1981 BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8); 1982 CHK(appFileInfo.GetIcon(&icon2, B_LARGE_ICON) == B_NO_INIT); 1983 } 1984 // * icon dimensions != icon size => B_BAD_VALUE 1985 NextSubTest(); 1986 { 1987 BFile file(testFile1, B_READ_WRITE); 1988 BAppFileInfo appFileInfo; 1989 CHK(appFileInfo.SetTo(&file) == B_OK); 1990 BBitmap icon(BRect(0, 0, 31, 31), B_CMAP8); 1991 CHK(appFileInfo.GetIcon(&icon, B_MINI_ICON) == B_BAD_VALUE); 1992 BBitmap icon2(BRect(0, 0, 15, 15), B_CMAP8); 1993 CHK(appFileInfo.GetIcon(&icon2, B_LARGE_ICON) == B_BAD_VALUE); 1994 } 1995 // * has no icon => B_ENTRY_NOT_FOUND 1996 NextSubTest(); 1997 { 1998 BFile file(testFile1, B_READ_WRITE); 1999 BAppFileInfo appFileInfo; 2000 CHK(appFileInfo.SetTo(&file) == B_OK); 2001 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2002 CHK(appFileInfo.GetIcon(&icon, B_MINI_ICON) == B_ENTRY_NOT_FOUND); 2003 } 2004 // * set, get, reset, get 2005 NextSubTest(); 2006 { 2007 BFile file(testFile1, B_READ_WRITE); 2008 BAppFileInfo appFileInfo; 2009 CHK(appFileInfo.SetTo(&file) == B_OK); 2010 // mini 2011 // set 2012 CHK(appFileInfo.SetIcon(fIconM1, B_MINI_ICON) == B_OK); 2013 // get 2014 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2015 CHK(appFileInfo.GetIcon(&icon, B_MINI_ICON) == B_OK); 2016 CHK(icon_equal(fIconM1, &icon)); 2017 CheckIconAttr(file, fIconM1); 2018 SyncResources(appFileInfo); 2019 CheckIconResource(file, fIconM1); 2020 // reset 2021 CHK(appFileInfo.SetIcon(fIconM2, B_MINI_ICON) == B_OK); 2022 // get 2023 BBitmap icon2(BRect(0, 0, 15, 15), B_CMAP8); 2024 CHK(appFileInfo.GetIcon(&icon2, B_MINI_ICON) == B_OK); 2025 CHK(icon_equal(fIconM2, &icon2)); 2026 CheckIconAttr(file, fIconM2); 2027 SyncResources(appFileInfo); 2028 CheckIconResource(file, fIconM2); 2029 // large 2030 // set 2031 CHK(appFileInfo.SetIcon(fIconL1, B_LARGE_ICON) == B_OK); 2032 // get 2033 BBitmap icon3(BRect(0, 0, 31, 31), B_CMAP8); 2034 CHK(appFileInfo.GetIcon(&icon3, B_LARGE_ICON) == B_OK); 2035 CHK(icon_equal(fIconL1, &icon3)); 2036 CheckIconAttr(file, fIconL1); 2037 SyncResources(appFileInfo); 2038 CheckIconResource(file, fIconL1); 2039 // reset 2040 CHK(appFileInfo.SetIcon(fIconL2, B_LARGE_ICON) == B_OK); 2041 // get 2042 BBitmap icon4(BRect(0, 0, 31, 31), B_CMAP8); 2043 CHK(appFileInfo.GetIcon(&icon4, B_LARGE_ICON) == B_OK); 2044 CHK(icon_equal(fIconL2, &icon4)); 2045 CheckIconAttr(file, fIconL2); 2046 SyncResources(appFileInfo); 2047 CheckIconResource(file, fIconL2); 2048 } 2049 // * bitmap color_space != B_CMAP8 => B_OK 2050 NextSubTest(); 2051 { 2052 BFile file(testFile1, B_READ_WRITE); 2053 BAppFileInfo appFileInfo; 2054 CHK(appFileInfo.SetTo(&file) == B_OK); 2055 // mini 2056 BBitmap icon(BRect(0, 0, 15, 15), B_RGB32); 2057 CHK(appFileInfo.GetIcon(&icon, B_MINI_ICON) == B_OK); 2058 BBitmap icon2(BRect(0, 0, 15, 15), B_RGB32); 2059 // SetBits() can be used, since there's no row padding for 16x16. 2060 icon2.SetBits(fIconM2->Bits(), fIconM2->BitsLength(), 0, B_CMAP8); 2061 CHK(icon_equal(&icon, &icon2)); 2062 // large 2063 // R5: Crashes for some weird reason in GetIcon(). 2064 #ifndef TEST_R5 2065 BBitmap icon3(BRect(0, 0, 31, 31), B_RGB32); 2066 CHK(appFileInfo.GetIcon(&icon3, B_LARGE_ICON) == B_OK); 2067 BBitmap icon4(BRect(0, 0, 31, 31), B_RGB32); 2068 // SetBits() can be used, since there's no row padding for 32x32. 2069 icon4.SetBits(fIconL2->Bits(), fIconL2->BitsLength(), 0, B_CMAP8); 2070 CHK(icon_equal(&icon3, &icon4)); 2071 #endif 2072 } 2073 2074 // status_t SetIcon(const BBitmap *icon, icon_size k) 2075 // * NULL icon => unsets icon, B_OK 2076 NextSubTest(); 2077 { 2078 BFile file(testFile1, B_READ_WRITE); 2079 BAppFileInfo appFileInfo; 2080 CHK(appFileInfo.SetTo(&file) == B_OK); 2081 // mini 2082 // set 2083 CHK(appFileInfo.SetIcon(NULL, B_MINI_ICON) == B_OK); 2084 // get 2085 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2086 CHK(appFileInfo.GetIcon(&icon, B_MINI_ICON) == B_ENTRY_NOT_FOUND); 2087 CheckNoAttr(file, kMiniIconAttribute); 2088 SyncResources(appFileInfo); 2089 CheckNoResource(file, kMiniIconAttribute); 2090 // large 2091 // set 2092 CHK(appFileInfo.SetIcon(NULL, B_LARGE_ICON) == B_OK); 2093 // get 2094 BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8); 2095 CHK(appFileInfo.GetIcon(&icon2, B_LARGE_ICON) == B_ENTRY_NOT_FOUND); 2096 CheckNoAttr(file, kLargeIconAttribute); 2097 SyncResources(appFileInfo); 2098 CheckNoResource(file, kLargeIconAttribute); 2099 } 2100 // * uninitialized => B_NO_INIT 2101 NextSubTest(); 2102 { 2103 BAppFileInfo appFileInfo; 2104 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2105 CHK(appFileInfo.SetIcon(&icon, B_MINI_ICON) == B_NO_INIT); 2106 BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8); 2107 CHK(appFileInfo.SetIcon(&icon2, B_LARGE_ICON) == B_NO_INIT); 2108 } 2109 // * icon dimensions != icon size => B_BAD_VALUE 2110 NextSubTest(); 2111 { 2112 BFile file(testFile1, B_READ_WRITE); 2113 BAppFileInfo appFileInfo; 2114 CHK(appFileInfo.SetTo(&file) == B_OK); 2115 BBitmap icon(BRect(0, 0, 31, 31), B_CMAP8); 2116 CHK(appFileInfo.SetIcon(&icon, B_MINI_ICON) == B_BAD_VALUE); 2117 BBitmap icon2(BRect(0, 0, 15, 15), B_CMAP8); 2118 CHK(appFileInfo.SetIcon(&icon2, B_LARGE_ICON) == B_BAD_VALUE); 2119 } 2120 // * file has app signature, set an icon => the icon is also set on the 2121 // MIME type 2122 NextSubTest(); 2123 { 2124 BFile file(testFile1, B_READ_WRITE); 2125 BAppFileInfo appFileInfo; 2126 CHK(appFileInfo.SetTo(&file) == B_OK); 2127 // uninstalled signature 2128 BMimeType mimeType(testAppSignature1); 2129 CHK(mimeType.IsInstalled() == false); 2130 CHK(appFileInfo.SetSignature(testAppSignature1) == B_OK); 2131 CHK(appFileInfo.SetIcon(fIconM1, B_MINI_ICON) == B_OK); 2132 CHK(appFileInfo.SetIcon(fIconL1, B_LARGE_ICON) == B_OK); 2133 CHK(mimeType.IsInstalled() == true); 2134 // get mini 2135 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2136 CHK(mimeType.GetIcon(&icon, B_MINI_ICON) == B_OK); 2137 CHK(icon_equal(fIconM1, &icon)); 2138 // get large 2139 BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8); 2140 CHK(mimeType.GetIcon(&icon2, B_LARGE_ICON) == B_OK); 2141 CHK(icon_equal(fIconL1, &icon2)); 2142 // installed signature 2143 CHK(appFileInfo.SetIcon(fIconM2, B_MINI_ICON) == B_OK); 2144 CHK(appFileInfo.SetIcon(fIconL2, B_LARGE_ICON) == B_OK); 2145 // get mini 2146 BBitmap icon3(BRect(0, 0, 15, 15), B_CMAP8); 2147 CHK(mimeType.GetIcon(&icon3, B_MINI_ICON) == B_OK); 2148 CHK(icon_equal(fIconM2, &icon3)); 2149 // get large 2150 BBitmap icon4(BRect(0, 0, 31, 31), B_CMAP8); 2151 CHK(mimeType.GetIcon(&icon4, B_LARGE_ICON) == B_OK); 2152 CHK(icon_equal(fIconL2, &icon4)); 2153 } 2154 } 2155 2156 // VersionInfoTest 2157 void 2158 AppFileInfoTest::VersionInfoTest() 2159 { 2160 // status_t GetVersionInfo(version_info *info, version_kind kind) const; 2161 // status_t SetVersionInfo(const version_info *info, version_kind kind); 2162 version_info testInfo1 = { 1, 1, 1, 1, 1, "short1", "long1" }; 2163 version_info testInfo2 = { 2, 2, 2, 2, 2, "short2", "long2" }; 2164 version_info testInfo3 = { 3, 3, 3, 3, 3, "short3", "long3" }; 2165 version_info testInfo4 = { 4, 4, 4, 4, 4, "short4", "long4" }; 2166 2167 2168 // status_t GetVersionInfo(version_info *info, version_kind kind) const 2169 // * uninitialized => B_NO_INIT 2170 NextSubTest(); 2171 { 2172 BAppFileInfo appFileInfo; 2173 version_info info; 2174 CHK(appFileInfo.GetVersionInfo(&info, B_APP_VERSION_KIND) 2175 == B_NO_INIT); 2176 version_info info2; 2177 CHK(appFileInfo.GetVersionInfo(&info2, B_SYSTEM_VERSION_KIND) 2178 == B_NO_INIT); 2179 } 2180 // * has no version info => B_ENTRY_NOT_FOUND 2181 NextSubTest(); 2182 { 2183 BFile file(testFile1, B_READ_WRITE); 2184 BAppFileInfo appFileInfo; 2185 CHK(appFileInfo.SetTo(&file) == B_OK); 2186 version_info info; 2187 CHK(appFileInfo.GetVersionInfo(&info, B_APP_VERSION_KIND) 2188 == B_ENTRY_NOT_FOUND); 2189 version_info info2; 2190 CHK(appFileInfo.GetVersionInfo(&info2, B_SYSTEM_VERSION_KIND) 2191 == B_ENTRY_NOT_FOUND); 2192 } 2193 // * set, get, reset, get 2194 NextSubTest(); 2195 { 2196 BFile file(testFile1, B_READ_WRITE); 2197 BAppFileInfo appFileInfo; 2198 CHK(appFileInfo.SetTo(&file) == B_OK); 2199 // set app info 2200 CHK(appFileInfo.SetVersionInfo(&testInfo1, B_APP_VERSION_KIND) 2201 == B_OK); 2202 // get both infos 2203 version_info info; 2204 CHK(appFileInfo.GetVersionInfo(&info, B_APP_VERSION_KIND) == B_OK); 2205 CHK(info == testInfo1); 2206 CHK(appFileInfo.GetVersionInfo(&info, B_SYSTEM_VERSION_KIND) == B_OK); 2207 // set app info 2208 CHK(appFileInfo.SetVersionInfo(&testInfo2, B_SYSTEM_VERSION_KIND) 2209 == B_OK); 2210 // get 2211 CHK(appFileInfo.GetVersionInfo(&info, B_APP_VERSION_KIND) == B_OK); 2212 CHK(info == testInfo1); 2213 CHK(appFileInfo.GetVersionInfo(&info, B_SYSTEM_VERSION_KIND) == B_OK); 2214 CHK(info == testInfo2); 2215 version_info testInfos1[] = { testInfo1, testInfo2 }; 2216 CheckVersionInfoAttr(file, testInfos1); 2217 SyncResources(appFileInfo); 2218 CheckVersionInfoResource(file, testInfos1); 2219 // reset app info 2220 CHK(appFileInfo.SetVersionInfo(&testInfo3, B_APP_VERSION_KIND) 2221 == B_OK); 2222 // get 2223 CHK(appFileInfo.GetVersionInfo(&info, B_APP_VERSION_KIND) == B_OK); 2224 CHK(info == testInfo3); 2225 CHK(appFileInfo.GetVersionInfo(&info, B_SYSTEM_VERSION_KIND) == B_OK); 2226 CHK(info == testInfo2); 2227 version_info testInfos2[] = { testInfo3, testInfo2 }; 2228 CheckVersionInfoAttr(file, testInfos2); 2229 SyncResources(appFileInfo); 2230 CheckVersionInfoResource(file, testInfos2); 2231 // reset system info 2232 CHK(appFileInfo.SetVersionInfo(&testInfo4, B_SYSTEM_VERSION_KIND) 2233 == B_OK); 2234 // get 2235 CHK(appFileInfo.GetVersionInfo(&info, B_APP_VERSION_KIND) == B_OK); 2236 CHK(info == testInfo3); 2237 CHK(appFileInfo.GetVersionInfo(&info, B_SYSTEM_VERSION_KIND) == B_OK); 2238 CHK(info == testInfo4); 2239 version_info testInfos3[] = { testInfo3, testInfo4 }; 2240 CheckVersionInfoAttr(file, testInfos3); 2241 SyncResources(appFileInfo); 2242 CheckVersionInfoResource(file, testInfos3); 2243 } 2244 // * NULL info => B_BAD_VALUE 2245 // R5: crashes when passing a NULL version_info 2246 #ifndef TEST_R5 2247 NextSubTest(); 2248 { 2249 BFile file(testFile1, B_READ_WRITE); 2250 BAppFileInfo appFileInfo; 2251 CHK(appFileInfo.SetTo(&file) == B_OK); 2252 CHK(equals(appFileInfo.GetVersionInfo(NULL, B_APP_VERSION_KIND), 2253 B_BAD_ADDRESS, B_BAD_VALUE)); 2254 CHK(equals(appFileInfo.GetVersionInfo(NULL, B_SYSTEM_VERSION_KIND), 2255 B_BAD_ADDRESS, B_BAD_VALUE)); 2256 } 2257 #endif 2258 2259 // status_t SetVersionInfo(const version_info *info, version_kind kind) 2260 // * NULL info => unsets both infos, B_OK 2261 // R5: crashes when passing a NULL version_info 2262 #ifndef TEST_R5 2263 NextSubTest(); 2264 { 2265 BFile file(testFile1, B_READ_WRITE); 2266 BAppFileInfo appFileInfo; 2267 CHK(appFileInfo.SetTo(&file) == B_OK); 2268 // unset app info 2269 CHK(appFileInfo.SetVersionInfo(NULL, B_APP_VERSION_KIND) 2270 == B_OK); 2271 // try to get 2272 version_info info; 2273 CHK(appFileInfo.GetVersionInfo(&info, B_APP_VERSION_KIND) 2274 == B_ENTRY_NOT_FOUND); 2275 CHK(appFileInfo.GetVersionInfo(&info, B_SYSTEM_VERSION_KIND) 2276 == B_ENTRY_NOT_FOUND); 2277 // check 2278 CheckNoAttr(file, kVersionInfoAttribute); 2279 SyncResources(appFileInfo); 2280 CheckNoResource(file, kVersionInfoAttribute); 2281 // reset the infos 2282 CHK(appFileInfo.SetVersionInfo(&testInfo1, B_APP_VERSION_KIND) 2283 == B_OK); 2284 CHK(appFileInfo.SetVersionInfo(&testInfo1, B_SYSTEM_VERSION_KIND) 2285 == B_OK); 2286 // unset system info 2287 CHK(appFileInfo.SetVersionInfo(NULL, B_SYSTEM_VERSION_KIND) == B_OK); 2288 // try to get 2289 CHK(appFileInfo.GetVersionInfo(&info, B_APP_VERSION_KIND) 2290 == B_ENTRY_NOT_FOUND); 2291 CHK(appFileInfo.GetVersionInfo(&info, B_SYSTEM_VERSION_KIND) 2292 == B_ENTRY_NOT_FOUND); 2293 // check 2294 CheckNoAttr(file, kVersionInfoAttribute); 2295 SyncResources(appFileInfo); 2296 CheckNoResource(file, kVersionInfoAttribute); 2297 } 2298 #endif 2299 // * uninitialized => B_NO_INIT 2300 NextSubTest(); 2301 { 2302 BAppFileInfo appFileInfo; 2303 CHK(appFileInfo.SetVersionInfo(&testInfo1, B_APP_VERSION_KIND) 2304 == B_NO_INIT); 2305 CHK(appFileInfo.GetVersionInfo(&testInfo1, B_SYSTEM_VERSION_KIND) 2306 == B_NO_INIT); 2307 } 2308 } 2309 2310 // IconForTypeTest 2311 void 2312 AppFileInfoTest::IconForTypeTest() 2313 { 2314 // status_t GetIconForType(const char *type, BBitmap *icon, 2315 // icon_size which) const 2316 // * NULL icon => B_BAD_VALUE 2317 NextSubTest(); 2318 { 2319 BFile file(testFile1, B_READ_WRITE); 2320 BAppFileInfo appFileInfo; 2321 CHK(appFileInfo.SetTo(&file) == B_OK); 2322 CHK(appFileInfo.GetIconForType(testType1, NULL, B_MINI_ICON) 2323 == B_BAD_VALUE); 2324 CHK(appFileInfo.GetIconForType(testType1, NULL, B_LARGE_ICON) 2325 == B_BAD_VALUE); 2326 } 2327 // * uninitialized => B_NO_INIT 2328 NextSubTest(); 2329 { 2330 BAppFileInfo appFileInfo; 2331 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2332 CHK(appFileInfo.GetIconForType(testType1, &icon, B_MINI_ICON) 2333 == B_NO_INIT); 2334 BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8); 2335 CHK(appFileInfo.GetIconForType(testType1, &icon2, B_LARGE_ICON) 2336 == B_NO_INIT); 2337 } 2338 // * icon dimensions != icon size => B_BAD_VALUE 2339 NextSubTest(); 2340 { 2341 BFile file(testFile1, B_READ_WRITE); 2342 BAppFileInfo appFileInfo; 2343 CHK(appFileInfo.SetTo(&file) == B_OK); 2344 BBitmap icon(BRect(0, 0, 31, 31), B_CMAP8); 2345 CHK(appFileInfo.GetIconForType(testType1, &icon, B_MINI_ICON) 2346 == B_BAD_VALUE); 2347 BBitmap icon2(BRect(0, 0, 15, 15), B_CMAP8); 2348 CHK(appFileInfo.GetIconForType(testType1, &icon2, B_LARGE_ICON) 2349 == B_BAD_VALUE); 2350 } 2351 // * has no icon => B_ENTRY_NOT_FOUND 2352 NextSubTest(); 2353 { 2354 BFile file(testFile1, B_READ_WRITE); 2355 BAppFileInfo appFileInfo; 2356 CHK(appFileInfo.SetTo(&file) == B_OK); 2357 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2358 CHK(appFileInfo.GetIconForType(testType1, &icon, B_MINI_ICON) 2359 == B_ENTRY_NOT_FOUND); 2360 } 2361 // * set, get, reset, get 2362 NextSubTest(); 2363 { 2364 BFile file(testFile1, B_READ_WRITE); 2365 BAppFileInfo appFileInfo; 2366 CHK(appFileInfo.SetTo(&file) == B_OK); 2367 // mini 2368 // set 2369 CHK(appFileInfo.SetIconForType(testType1, fIconM1, B_MINI_ICON) 2370 == B_OK); 2371 // get 2372 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2373 CHK(appFileInfo.GetIconForType(testType1, &icon, B_MINI_ICON) == B_OK); 2374 CHK(icon_equal(fIconM1, &icon)); 2375 CheckIconForTypeAttr(file, testType1, fIconM1); 2376 SyncResources(appFileInfo); 2377 CheckIconForTypeResource(file, testType1, fIconM1); 2378 // reset 2379 CHK(appFileInfo.SetIconForType(testType1, fIconM2, B_MINI_ICON) 2380 == B_OK); 2381 // get 2382 BBitmap icon2(BRect(0, 0, 15, 15), B_CMAP8); 2383 CHK(appFileInfo.GetIconForType(testType1, &icon2, B_MINI_ICON) 2384 == B_OK); 2385 CHK(icon_equal(fIconM2, &icon2)); 2386 CheckIconForTypeAttr(file, testType1, fIconM2); 2387 SyncResources(appFileInfo); 2388 CheckIconForTypeResource(file, testType1, fIconM2); 2389 // large 2390 // set 2391 CHK(appFileInfo.SetIconForType(testType1, fIconL1, B_LARGE_ICON) 2392 == B_OK); 2393 // get 2394 BBitmap icon3(BRect(0, 0, 31, 31), B_CMAP8); 2395 CHK(appFileInfo.GetIconForType(testType1, &icon3, B_LARGE_ICON) 2396 == B_OK); 2397 CHK(icon_equal(fIconL1, &icon3)); 2398 CheckIconForTypeAttr(file, testType1, fIconL1); 2399 SyncResources(appFileInfo); 2400 CheckIconForTypeResource(file, testType1, fIconL1); 2401 // reset 2402 CHK(appFileInfo.SetIconForType(testType1, fIconL2, B_LARGE_ICON) 2403 == B_OK); 2404 // get 2405 BBitmap icon4(BRect(0, 0, 31, 31), B_CMAP8); 2406 CHK(appFileInfo.GetIconForType(testType1, &icon4, B_LARGE_ICON) 2407 == B_OK); 2408 CHK(icon_equal(fIconL2, &icon4)); 2409 CheckIconForTypeAttr(file, testType1, fIconL2); 2410 SyncResources(appFileInfo); 2411 CheckIconForTypeResource(file, testType1, fIconL2); 2412 } 2413 // * bitmap color_space != B_CMAP8 => B_OK 2414 NextSubTest(); 2415 { 2416 BFile file(testFile1, B_READ_WRITE); 2417 BAppFileInfo appFileInfo; 2418 CHK(appFileInfo.SetTo(&file) == B_OK); 2419 // mini 2420 BBitmap icon(BRect(0, 0, 15, 15), B_RGB32); 2421 CHK(appFileInfo.GetIconForType(testType1, &icon, B_MINI_ICON) == B_OK); 2422 BBitmap icon2(BRect(0, 0, 15, 15), B_RGB32); 2423 // SetBits() can be used, since there's no row padding for 16x16. 2424 icon2.SetBits(fIconM2->Bits(), fIconM2->BitsLength(), 0, B_CMAP8); 2425 CHK(icon_equal(&icon, &icon2)); 2426 // large 2427 // R5: Crashes for some weird reason in GetIconForType(). 2428 #ifndef TEST_R5 2429 BBitmap icon3(BRect(0, 0, 31, 31), B_RGB32); 2430 CHK(appFileInfo.GetIconForType(testType1, &icon3, B_LARGE_ICON) 2431 == B_OK); 2432 BBitmap icon4(BRect(0, 0, 31, 31), B_RGB32); 2433 // SetBits() can be used, since there's no row padding for 32x32. 2434 icon4.SetBits(fIconL2->Bits(), fIconL2->BitsLength(), 0, B_CMAP8); 2435 CHK(icon_equal(&icon3, &icon4)); 2436 #endif 2437 } 2438 2439 // status_t SetIconForType(const char *type, const BBitmap *icon, 2440 // icon_size which) 2441 // * NULL icon => unsets icon, B_OK 2442 NextSubTest(); 2443 { 2444 BFile file(testFile1, B_READ_WRITE); 2445 BAppFileInfo appFileInfo; 2446 CHK(appFileInfo.SetTo(&file) == B_OK); 2447 // mini 2448 // set 2449 CHK(appFileInfo.SetIconForType(testType1, NULL, B_MINI_ICON) == B_OK); 2450 // get 2451 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2452 CHK(appFileInfo.GetIconForType(testType1, &icon, B_MINI_ICON) 2453 == B_ENTRY_NOT_FOUND); 2454 CheckNoIconForTypeAttr(file, testType1, B_MINI_ICON); 2455 SyncResources(appFileInfo); 2456 CheckNoIconForTypeResource(file, testType1, B_MINI_ICON); 2457 // large 2458 // set 2459 CHK(appFileInfo.SetIconForType(testType1, NULL, B_LARGE_ICON) == B_OK); 2460 // get 2461 BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8); 2462 CHK(appFileInfo.GetIconForType(testType1, &icon2, B_LARGE_ICON) 2463 == B_ENTRY_NOT_FOUND); 2464 CheckNoIconForTypeAttr(file, testType1, B_LARGE_ICON); 2465 SyncResources(appFileInfo); 2466 CheckNoIconForTypeResource(file, testType1, B_LARGE_ICON); 2467 } 2468 // * uninitialized => B_NO_INIT 2469 NextSubTest(); 2470 { 2471 BAppFileInfo appFileInfo; 2472 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2473 CHK(appFileInfo.SetIconForType(testType1, &icon, B_MINI_ICON) 2474 == B_NO_INIT); 2475 BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8); 2476 CHK(appFileInfo.SetIconForType(testType1, &icon2, B_LARGE_ICON) 2477 == B_NO_INIT); 2478 } 2479 // * icon dimensions != icon size => B_BAD_VALUE 2480 NextSubTest(); 2481 { 2482 BFile file(testFile1, B_READ_WRITE); 2483 BAppFileInfo appFileInfo; 2484 CHK(appFileInfo.SetTo(&file) == B_OK); 2485 BBitmap icon(BRect(0, 0, 31, 31), B_CMAP8); 2486 CHK(appFileInfo.SetIconForType(testType1, &icon, B_MINI_ICON) 2487 == B_BAD_VALUE); 2488 BBitmap icon2(BRect(0, 0, 15, 15), B_CMAP8); 2489 CHK(appFileInfo.SetIconForType(testType1, &icon2, B_LARGE_ICON) 2490 == B_BAD_VALUE); 2491 } 2492 // * NULL type => set standard icon 2493 NextSubTest(); 2494 { 2495 BFile file(testFile1, B_READ_WRITE); 2496 BAppFileInfo appFileInfo; 2497 CHK(appFileInfo.SetTo(&file) == B_OK); 2498 CHK(appFileInfo.SetIconForType(NULL, fIconM1, B_MINI_ICON) == B_OK); 2499 CHK(appFileInfo.SetIconForType(NULL, fIconL1, B_LARGE_ICON) == B_OK); 2500 // get mini icon via GetIcon() 2501 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2502 CHK(appFileInfo.GetIcon(&icon, B_MINI_ICON) == B_OK); 2503 CHK(icon_equal(fIconM1, &icon)); 2504 CheckIconAttr(file, fIconM1); 2505 SyncResources(appFileInfo); 2506 CheckIconResource(file, fIconM1); 2507 // get large via GetIcon() 2508 BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8); 2509 CHK(appFileInfo.GetIcon(&icon2, B_LARGE_ICON) == B_OK); 2510 CHK(icon_equal(fIconL1, &icon2)); 2511 CheckIconAttr(file, fIconL1); 2512 SyncResources(appFileInfo); 2513 CheckIconResource(file, fIconL1); 2514 // get mini icon via GetIconForType() 2515 BBitmap icon3(BRect(0, 0, 15, 15), B_CMAP8); 2516 CHK(appFileInfo.GetIconForType(NULL, &icon3, B_MINI_ICON) == B_OK); 2517 CHK(icon_equal(fIconM1, &icon3)); 2518 CheckIconAttr(file, fIconM1); 2519 SyncResources(appFileInfo); 2520 CheckIconResource(file, fIconM1); 2521 // get large via GetIconForType() 2522 BBitmap icon4(BRect(0, 0, 31, 31), B_CMAP8); 2523 CHK(appFileInfo.GetIconForType(NULL, &icon4, B_LARGE_ICON) == B_OK); 2524 CHK(icon_equal(fIconL1, &icon4)); 2525 CheckIconAttr(file, fIconL1); 2526 SyncResources(appFileInfo); 2527 CheckIconResource(file, fIconL1); 2528 } 2529 // * set icons for two types 2530 NextSubTest(); 2531 { 2532 BFile file(testFile1, B_READ_WRITE); 2533 BAppFileInfo appFileInfo; 2534 CHK(appFileInfo.SetTo(&file) == B_OK); 2535 // set icons for both types 2536 CHK(appFileInfo.SetIconForType(testType1, fIconM1, B_MINI_ICON) 2537 == B_OK); 2538 CHK(appFileInfo.SetIconForType(testType1, fIconL1, B_LARGE_ICON) 2539 == B_OK); 2540 CHK(appFileInfo.SetIconForType(testType2, fIconM2, B_MINI_ICON) 2541 == B_OK); 2542 CHK(appFileInfo.SetIconForType(testType2, fIconL2, B_LARGE_ICON) 2543 == B_OK); 2544 // check first type 2545 // get mini 2546 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2547 CHK(appFileInfo.GetIconForType(testType1, &icon, B_MINI_ICON) 2548 == B_OK); 2549 CHK(icon_equal(fIconM1, &icon)); 2550 CheckIconForTypeAttr(file, testType1, fIconM1); 2551 SyncResources(appFileInfo); 2552 CheckIconForTypeResource(file, testType1, fIconM1); 2553 // get large 2554 BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8); 2555 CHK(appFileInfo.GetIconForType(testType1, &icon2, B_LARGE_ICON) 2556 == B_OK); 2557 CHK(icon_equal(fIconL1, &icon2)); 2558 CheckIconForTypeAttr(file, testType1, fIconL1); 2559 SyncResources(appFileInfo); 2560 CheckIconForTypeResource(file, testType1, fIconL1); 2561 // check second type 2562 // get mini 2563 BBitmap icon3(BRect(0, 0, 15, 15), B_CMAP8); 2564 CHK(appFileInfo.GetIconForType(testType2, &icon3, B_MINI_ICON) 2565 == B_OK); 2566 CHK(icon_equal(fIconM2, &icon3)); 2567 CheckIconForTypeAttr(file, testType2, fIconM2); 2568 SyncResources(appFileInfo); 2569 CheckIconForTypeResource(file, testType2, fIconM2, 2570 kMiniIconForTypeResourceID + 1); 2571 // get large 2572 BBitmap icon4(BRect(0, 0, 31, 31), B_CMAP8); 2573 CHK(appFileInfo.GetIconForType(testType2, &icon4, B_LARGE_ICON) 2574 == B_OK); 2575 CHK(icon_equal(fIconL2, &icon4)); 2576 CheckIconForTypeAttr(file, testType2, fIconL2); 2577 SyncResources(appFileInfo); 2578 CheckIconForTypeResource(file, testType2, fIconL2, 2579 kLargeIconForTypeResourceID + 1); 2580 // unset both icons 2581 CHK(appFileInfo.SetIconForType(testType1, NULL, B_MINI_ICON) == B_OK); 2582 CHK(appFileInfo.SetIconForType(testType1, NULL, B_LARGE_ICON) == B_OK); 2583 CHK(appFileInfo.SetIconForType(testType2, NULL, B_MINI_ICON) == B_OK); 2584 CHK(appFileInfo.SetIconForType(testType2, NULL, B_LARGE_ICON) == B_OK); 2585 } 2586 // * invalid type => B_OK 2587 NextSubTest(); 2588 { 2589 BFile file(testFile1, B_READ_WRITE); 2590 BAppFileInfo appFileInfo; 2591 CHK(appFileInfo.SetTo(&file) == B_OK); 2592 CHK(appFileInfo.SetIconForType(invalidTestType, fIconM1, B_MINI_ICON) 2593 == B_BAD_VALUE); 2594 CHK(appFileInfo.SetIconForType(invalidTestType, fIconL1, B_LARGE_ICON) 2595 == B_BAD_VALUE); 2596 // get mini 2597 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2598 CHK(appFileInfo.GetIconForType(invalidTestType, &icon, B_MINI_ICON) 2599 == B_BAD_VALUE); 2600 CheckNoIconForTypeAttr(file, invalidTestType, B_LARGE_ICON); 2601 CheckNoIconForTypeResource(file, invalidTestType, B_LARGE_ICON); 2602 // get large 2603 BBitmap icon3(BRect(0, 0, 31, 31), B_CMAP8); 2604 CHK(appFileInfo.GetIconForType(invalidTestType, &icon3, B_LARGE_ICON) 2605 == B_BAD_VALUE); 2606 CheckNoIconForTypeAttr(file, invalidTestType, B_MINI_ICON); 2607 CheckNoIconForTypeResource(file, invalidTestType, B_MINI_ICON); 2608 } 2609 // * too long type => B_BAD_VALUE 2610 NextSubTest(); 2611 { 2612 BFile file(testFile1, B_READ_WRITE); 2613 BAppFileInfo appFileInfo; 2614 CHK(appFileInfo.SetTo(&file) == B_OK); 2615 CHK(appFileInfo.SetIconForType(tooLongTestType, fIconM1, B_MINI_ICON) 2616 == B_BAD_VALUE); 2617 CHK(appFileInfo.SetIconForType(tooLongTestType, fIconL1, B_LARGE_ICON) 2618 == B_BAD_VALUE); 2619 } 2620 // * file has app signature, set an icon => the icon is also set on the 2621 // MIME type 2622 NextSubTest(); 2623 { 2624 BFile file(testFile1, B_READ_WRITE); 2625 BAppFileInfo appFileInfo; 2626 CHK(appFileInfo.SetTo(&file) == B_OK); 2627 // uninstalled signature 2628 BMimeType mimeType(testAppSignature1); 2629 CHK(mimeType.IsInstalled() == false); 2630 CHK(appFileInfo.SetSignature(testAppSignature1) == B_OK); 2631 CHK(appFileInfo.SetIconForType(testType1, fIconM1, B_MINI_ICON) 2632 == B_OK); 2633 CHK(appFileInfo.SetIconForType(testType1, fIconL1, B_LARGE_ICON) 2634 == B_OK); 2635 CHK(mimeType.IsInstalled() == true); 2636 CHK(BMimeType(testType1).IsInstalled() == false); 2637 // get mini 2638 BBitmap icon(BRect(0, 0, 15, 15), B_CMAP8); 2639 CHK(mimeType.GetIconForType(testType1, &icon, B_MINI_ICON) 2640 == B_OK); 2641 CHK(icon_equal(fIconM1, &icon)); 2642 // get large 2643 BBitmap icon2(BRect(0, 0, 31, 31), B_CMAP8); 2644 CHK(mimeType.GetIconForType(testType1, &icon2, B_LARGE_ICON) 2645 == B_OK); 2646 CHK(icon_equal(fIconL1, &icon2)); 2647 // installed signature 2648 CHK(appFileInfo.SetIconForType(testType1, fIconM2, B_MINI_ICON) 2649 == B_OK); 2650 CHK(appFileInfo.SetIconForType(testType1, fIconL2, B_LARGE_ICON) 2651 == B_OK); 2652 // get mini 2653 BBitmap icon3(BRect(0, 0, 15, 15), B_CMAP8); 2654 CHK(mimeType.GetIconForType(testType1, &icon3, B_MINI_ICON) 2655 == B_OK); 2656 CHK(icon_equal(fIconM2, &icon3)); 2657 // get large 2658 BBitmap icon4(BRect(0, 0, 31, 31), B_CMAP8); 2659 CHK(mimeType.GetIconForType(testType1, &icon4, B_LARGE_ICON) 2660 == B_OK); 2661 CHK(icon_equal(fIconL2, &icon4)); 2662 } 2663 } 2664 2665 2666 // InfoLocationTester 2667 template<typename Value, typename Setter, typename Getter, typename Checker> 2668 static 2669 void 2670 InfoLocationTester(const Value &testValue1, const Value &testValue2, 2671 const Value &testValue3) 2672 { 2673 BFile file(testFile1, B_READ_WRITE); 2674 BAppFileInfo appFileInfo; 2675 CHK(appFileInfo.SetTo(&file) == B_OK); 2676 CHK(appFileInfo.InitCheck() == B_OK); 2677 CHK(appFileInfo.IsUsingAttributes() == true); 2678 CHK(appFileInfo.IsUsingResources() == true); 2679 // set value 2680 CHK(Setter::Set(appFileInfo, testValue1) == B_OK); 2681 CHK(appFileInfo.IsUsingAttributes() == true); 2682 CHK(appFileInfo.IsUsingResources() == true); 2683 // force resources synchronization 2684 SyncResources(appFileInfo); 2685 // get value 2686 Value value; 2687 CHK(Getter::Get(appFileInfo, value) == B_OK); 2688 CHK(value == testValue1); 2689 // check attribute/resource 2690 Checker::CheckAttribute(file, testValue1); 2691 Checker::CheckResource(file, testValue1); 2692 // set on B_USE_ATTRIBUTES 2693 appFileInfo.SetInfoLocation(B_USE_ATTRIBUTES); 2694 CHK(appFileInfo.IsUsingAttributes() == true); 2695 CHK(appFileInfo.IsUsingResources() == false); 2696 // set value 2697 CHK(Setter::Set(appFileInfo, testValue2) == B_OK); 2698 // force resources synchronization 2699 SyncResources(appFileInfo); 2700 // get value 2701 Value value1; 2702 CHK(Getter::Get(appFileInfo, value1) == B_OK); 2703 CHK(value1 == testValue2); 2704 // check attribute/resource -- resource should be old 2705 Checker::CheckAttribute(file, testValue2); 2706 Checker::CheckResource(file, testValue1); 2707 // set on B_USE_BOTH_LOCATIONS 2708 appFileInfo.SetInfoLocation(B_USE_BOTH_LOCATIONS); 2709 CHK(appFileInfo.IsUsingAttributes() == true); 2710 CHK(appFileInfo.IsUsingResources() == true); 2711 // get value -- the attribute is preferred 2712 Value value2; 2713 CHK(Getter::Get(appFileInfo, value2) == B_OK); 2714 CHK(value2 == testValue2); 2715 // set on B_USE_RESOURCES 2716 appFileInfo.SetInfoLocation(B_USE_RESOURCES); 2717 CHK(appFileInfo.IsUsingAttributes() == false); 2718 CHK(appFileInfo.IsUsingResources() == true); 2719 // set value 2720 CHK(Setter::Set(appFileInfo, testValue3) == B_OK); 2721 // force resources synchronization 2722 SyncResources(appFileInfo); 2723 // get value 2724 Value value3; 2725 CHK(Getter::Get(appFileInfo, value3) == B_OK); 2726 CHK(value3 == testValue3); 2727 // check attribute/resource -- attribute should be old 2728 Checker::CheckAttribute(file, testValue2); 2729 Checker::CheckResource(file, testValue3); 2730 } 2731 2732 // InfoLocationTest 2733 void 2734 AppFileInfoTest::InfoLocationTest() 2735 { 2736 // tests: 2737 // * void SetInfoLocation(info_location location); 2738 // * bool IsUsingAttributes() const; 2739 // * bool IsUsingResources() const; 2740 2741 // type 2742 NextSubTest(); 2743 InfoLocationTester<TypeValue, TypeSetter, TypeGetter, TypeChecker>( 2744 TypeValue(testType1), TypeValue(testType2), TypeValue(testType3)); 2745 2746 // signature 2747 NextSubTest(); 2748 InfoLocationTester<SignatureValue, SignatureSetter, SignatureGetter, 2749 SignatureChecker>( 2750 SignatureValue(testAppSignature1), SignatureValue(testAppSignature2), 2751 SignatureValue(testAppSignature3)); 2752 2753 // app flags 2754 NextSubTest(); 2755 InfoLocationTester<AppFlagsValue, AppFlagsSetter, AppFlagsGetter, 2756 AppFlagsChecker>( 2757 AppFlagsValue(B_SINGLE_LAUNCH | B_ARGV_ONLY), 2758 AppFlagsValue(B_EXCLUSIVE_LAUNCH | B_BACKGROUND_APP), 2759 AppFlagsValue(B_MULTIPLE_LAUNCH)); 2760 2761 // supported types 2762 NextSubTest(); 2763 // The file needs to have a signature and the signature must be known 2764 // to the MIME database. Otherwise SetSupportedType() fails. 2765 { 2766 BFile file(testFile1, B_READ_WRITE); 2767 BAppFileInfo appFileInfo; 2768 CHK(appFileInfo.SetTo(&file) == B_OK); 2769 CHK(appFileInfo.SetSignature(testAppSignature1) == B_OK); 2770 BMimeType type(testAppSignature1); 2771 if (!type.IsInstalled()) 2772 CHK(type.Install() == B_OK); 2773 } 2774 const char *supportedTypes1[] = { testType1 }; 2775 const char *supportedTypes2[] = { testType2, testType3 }; 2776 const char *supportedTypes3[] = { testType3, testType2, testType1 }; 2777 InfoLocationTester<SupportedTypesValue, SupportedTypesSetter, 2778 SupportedTypesGetter, SupportedTypesChecker>( 2779 SupportedTypesValue(supportedTypes1, 1), 2780 SupportedTypesValue(supportedTypes2, 2), 2781 SupportedTypesValue(supportedTypes3, 3)); 2782 2783 // icon 2784 NextSubTest(); 2785 InfoLocationTester<IconValue, IconSetter, IconGetter, IconChecker>( 2786 IconValue(fIconM1, fIconL1), 2787 IconValue(fIconM2, fIconL2), 2788 IconValue(fIconM3, fIconL3)); 2789 2790 // version info 2791 NextSubTest(); 2792 version_info versionInfo1 = { 1, 1, 1, 1, 1, "short1", "long1" }; 2793 version_info versionInfo2 = { 2, 2, 2, 2, 2, "short2", "long2" }; 2794 version_info versionInfo3 = { 3, 3, 3, 3, 3, "short3", "long3" }; 2795 InfoLocationTester<VersionInfoValue, VersionInfoSetter, VersionInfoGetter, 2796 VersionInfoChecker>( 2797 VersionInfoValue(versionInfo1, versionInfo1), 2798 VersionInfoValue(versionInfo2, versionInfo2), 2799 VersionInfoValue(versionInfo3, versionInfo3)); 2800 2801 // icon for type 2802 NextSubTest(); 2803 InfoLocationTester<IconForTypeValue, IconForTypeSetter, IconForTypeGetter, 2804 IconForTypeChecker>( 2805 IconForTypeValue(fIconM1, fIconL1), 2806 IconForTypeValue(fIconM2, fIconL2), 2807 IconForTypeValue(fIconM3, fIconL3)); 2808 } 2809 2810