OLD | NEW |
1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <algorithm> | 5 #include <algorithm> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/file_path.h" | 8 #include "base/file_path.h" |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/json_reader.h" | 10 #include "base/json_reader.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 #include "chrome/common/notification_type.h" | 26 #include "chrome/common/notification_type.h" |
27 #include "chrome/test/testing_profile.h" | 27 #include "chrome/test/testing_profile.h" |
28 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
29 #include "testing/platform_test.h" | 29 #include "testing/platform_test.h" |
30 | 30 |
31 namespace { | 31 namespace { |
32 | 32 |
33 // Extension ids used during testing. | 33 // Extension ids used during testing. |
34 const char* const all_zero = "0000000000000000000000000000000000000000"; | 34 const char* const all_zero = "0000000000000000000000000000000000000000"; |
35 const char* const zero_n_one = "0000000000000000000000000000000000000001"; | 35 const char* const zero_n_one = "0000000000000000000000000000000000000001"; |
36 const char* const good0 = "00123456789abcdef0123456789abcdef0123456"; | 36 const char* const good0 = "fc6f6ba6693faf6773c13701019f2e7a12f0febe"; |
37 const char* const good1 = "10123456789abcdef0123456789abcdef0123456"; | 37 const char* const good1 = "e5ead92b2c6795c1d2b92df9c5cb37de5582471a"; |
38 const char* const good2 = "20123456789abcdef0123456789abcdef0123456"; | 38 const char* const good2 = "a37fed892f622823f4daaec4426a32fc7f6147dc"; |
39 const char* const good_crx = "00123456789abcdef0123456789abcdef0123456"; | 39 const char* const good_crx = "b3dd733cd71a98fa83f387455e12f5c5501c519e"; |
40 const char* const page_action = "8a5e4cb023c61b431e9b603a97c293429ce057c8"; | 40 const char* const page_action = "a4ca7d01469a010acb200568a0b8f4d9b3ac1f91"; |
41 const char* const theme_crx = "f0123456789abcdef0123456789abcdef0126456"; | 41 const char* const theme_crx = "80c45f5ae9e0f839d105c6a6d2461a036bc40a04"; |
42 const char* const theme2_crx = "f0123456789adddef0123456789abcdef0126456"; | 42 const char* const theme2_crx = "f9f6c52c01efdd5edd7c396b5f995a15fc7ad6d1"; |
43 | 43 |
44 struct ExtensionsOrder { | 44 struct ExtensionsOrder { |
45 bool operator()(const Extension* a, const Extension* b) { | 45 bool operator()(const Extension* a, const Extension* b) { |
46 return a->name() < b->name(); | 46 return a->name() < b->name(); |
47 } | 47 } |
48 }; | 48 }; |
49 | 49 |
50 static std::vector<std::string> GetErrors() { | 50 static std::vector<std::string> GetErrors() { |
51 const std::vector<std::string>* errors = | 51 const std::vector<std::string>* errors = |
52 ExtensionErrorReporter::GetInstance()->GetErrors(); | 52 ExtensionErrorReporter::GetInstance()->GetErrors(); |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 ASSERT_TRUE(service_->Init()); | 296 ASSERT_TRUE(service_->Init()); |
297 loop_.RunAllPending(); | 297 loop_.RunAllPending(); |
298 | 298 |
299 std::vector<std::string> errors = GetErrors(); | 299 std::vector<std::string> errors = GetErrors(); |
300 for (std::vector<std::string>::iterator err = errors.begin(); | 300 for (std::vector<std::string>::iterator err = errors.begin(); |
301 err != errors.end(); ++err) { | 301 err != errors.end(); ++err) { |
302 LOG(ERROR) << *err; | 302 LOG(ERROR) << *err; |
303 } | 303 } |
304 ASSERT_EQ(3u, loaded_.size()); | 304 ASSERT_EQ(3u, loaded_.size()); |
305 | 305 |
306 EXPECT_EQ(std::string(good_crx), loaded_[0]->id()); | 306 EXPECT_EQ(std::string(good0), loaded_[0]->id()); |
307 EXPECT_EQ(std::string("My extension 1"), | 307 EXPECT_EQ(std::string("My extension 1"), |
308 loaded_[0]->name()); | 308 loaded_[0]->name()); |
309 EXPECT_EQ(std::string("The first extension that I made."), | 309 EXPECT_EQ(std::string("The first extension that I made."), |
310 loaded_[0]->description()); | 310 loaded_[0]->description()); |
311 EXPECT_EQ(Extension::INTERNAL, loaded_[0]->location()); | 311 EXPECT_EQ(Extension::INTERNAL, loaded_[0]->location()); |
312 EXPECT_TRUE(service_->GetExtensionByID(loaded_[0]->id())); | 312 EXPECT_TRUE(service_->GetExtensionByID(loaded_[0]->id())); |
313 EXPECT_EQ(3u, service_->extensions()->size()); | 313 EXPECT_EQ(3u, service_->extensions()->size()); |
314 | 314 |
315 ValidatePrefKeyCount(3); | 315 ValidatePrefKeyCount(3); |
316 ValidatePref(good_crx, L"state", Extension::ENABLED); | 316 ValidatePref(good0, L"state", Extension::ENABLED); |
317 ValidatePref(good_crx, L"location", Extension::INTERNAL); | 317 ValidatePref(good0, L"location", Extension::INTERNAL); |
318 ValidatePref(good1, L"state", Extension::ENABLED); | 318 ValidatePref(good1, L"state", Extension::ENABLED); |
319 ValidatePref(good1, L"location", Extension::INTERNAL); | 319 ValidatePref(good1, L"location", Extension::INTERNAL); |
320 ValidatePref(good2, L"state", Extension::ENABLED); | 320 ValidatePref(good2, L"state", Extension::ENABLED); |
321 ValidatePref(good2, L"location", Extension::INTERNAL); | 321 ValidatePref(good2, L"location", Extension::INTERNAL); |
322 | 322 |
323 Extension* extension = loaded_[0]; | 323 Extension* extension = loaded_[0]; |
324 const UserScriptList& scripts = extension->content_scripts(); | 324 const UserScriptList& scripts = extension->content_scripts(); |
325 const std::vector<std::string>& toolstrips = extension->toolstrips(); | 325 const std::vector<std::string>& toolstrips = extension->toolstrips(); |
326 ASSERT_EQ(2u, scripts.size()); | 326 ASSERT_EQ(2u, scripts.size()); |
327 EXPECT_EQ(2u, scripts[0].url_patterns().size()); | 327 EXPECT_EQ(2u, scripts[0].url_patterns().size()); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 ValidatePref(good_crx, L"state", Extension::ENABLED); | 459 ValidatePref(good_crx, L"state", Extension::ENABLED); |
460 ValidatePref(good_crx, L"location", Extension::INTERNAL); | 460 ValidatePref(good_crx, L"location", Extension::INTERNAL); |
461 | 461 |
462 // An extension with page actions. | 462 // An extension with page actions. |
463 path = extensions_path.AppendASCII("page_action.crx"); | 463 path = extensions_path.AppendASCII("page_action.crx"); |
464 InstallExtension(path, true); | 464 InstallExtension(path, true); |
465 ValidatePrefKeyCount(++pref_count); | 465 ValidatePrefKeyCount(++pref_count); |
466 ValidatePref(page_action, L"state", Extension::ENABLED); | 466 ValidatePref(page_action, L"state", Extension::ENABLED); |
467 ValidatePref(page_action, L"location", Extension::INTERNAL); | 467 ValidatePref(page_action, L"location", Extension::INTERNAL); |
468 | 468 |
| 469 // Bad signature. |
| 470 path = extensions_path.AppendASCII("bad_signature.crx"); |
| 471 InstallExtension(path, false); |
| 472 |
469 // 0-length extension file. | 473 // 0-length extension file. |
470 path = extensions_path.AppendASCII("not_an_extension.crx"); | 474 path = extensions_path.AppendASCII("not_an_extension.crx"); |
471 InstallExtension(path, false); | 475 InstallExtension(path, false); |
472 ValidatePrefKeyCount(pref_count); | 476 ValidatePrefKeyCount(pref_count); |
473 | 477 |
474 // Bad magic number. | 478 // Bad magic number. |
475 path = extensions_path.AppendASCII("bad_magic.crx"); | 479 path = extensions_path.AppendASCII("bad_magic.crx"); |
476 InstallExtension(path, false); | 480 InstallExtension(path, false); |
477 ValidatePrefKeyCount(pref_count); | 481 ValidatePrefKeyCount(pref_count); |
478 | 482 |
479 // Poorly formed JSON. | |
480 path = extensions_path.AppendASCII("bad_json.crx"); | |
481 InstallExtension(path, false); | |
482 ValidatePrefKeyCount(pref_count); | |
483 | |
484 // Incorrect zip hash. | |
485 path = extensions_path.AppendASCII("bad_hash.crx"); | |
486 InstallExtension(path, false); | |
487 ValidatePrefKeyCount(pref_count); | |
488 | |
489 // TODO(erikkay): add more tests for many of the failure cases. | 483 // TODO(erikkay): add more tests for many of the failure cases. |
490 // TODO(erikkay): add tests for upgrade cases. | 484 // TODO(erikkay): add tests for upgrade cases. |
491 } | 485 } |
492 | 486 |
493 #if defined(OS_WIN) // TODO(port) | 487 #if defined(OS_WIN) // TODO(port) |
494 // Test Packaging and installing an extension. | 488 // Test Packaging and installing an extension. |
495 // TODO(aa): add a test that uses an openssl-generate private key. | 489 // TODO(aa): add a test that uses an openssl-generate private key. |
496 // TODO(rafaelw): add more tests for failure cases. | 490 // TODO(rafaelw): add more tests for failure cases. |
497 TEST_F(ExtensionsServiceTest, PackExtension) { | 491 TEST_F(ExtensionsServiceTest, PackExtension) { |
498 SetExtensionsEnabled(true); | 492 SetExtensionsEnabled(true); |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 loop_.RunAllPending(); | 614 loop_.RunAllPending(); |
621 | 615 |
622 ASSERT_FALSE(installed_); | 616 ASSERT_FALSE(installed_); |
623 ASSERT_EQ(0u, loaded_.size()); | 617 ASSERT_EQ(0u, loaded_.size()); |
624 ASSERT_EQ(0u, GetErrors().size()); | 618 ASSERT_EQ(0u, GetErrors().size()); |
625 ValidatePrefKeyCount(1); | 619 ValidatePrefKeyCount(1); |
626 ValidatePref(good_crx, L"state", Extension::ENABLED); | 620 ValidatePref(good_crx, L"state", Extension::ENABLED); |
627 ValidatePref(good_crx, L"location", Extension::INTERNAL); | 621 ValidatePref(good_crx, L"location", Extension::INTERNAL); |
628 } | 622 } |
629 | 623 |
| 624 // Test upgrading a signed extension. |
| 625 TEST_F(ExtensionsServiceTest, UpgradeSignedGood) { |
| 626 FilePath extensions_path; |
| 627 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); |
| 628 extensions_path = extensions_path.AppendASCII("extensions"); |
| 629 |
| 630 FilePath path = extensions_path.AppendASCII("good.crx"); |
| 631 service_->InstallExtension(path); |
| 632 loop_.RunAllPending(); |
| 633 |
| 634 ASSERT_TRUE(installed_); |
| 635 ASSERT_EQ(1u, loaded_.size()); |
| 636 ASSERT_EQ(0u, GetErrors().size()); |
| 637 |
| 638 // Upgrade to version 2.0 |
| 639 path = extensions_path.AppendASCII("good2.crx"); |
| 640 service_->InstallExtension(path); |
| 641 loop_.RunAllPending(); |
| 642 |
| 643 ASSERT_TRUE(installed_); |
| 644 ASSERT_EQ(2u, loaded_.size()); |
| 645 ASSERT_EQ(0u, GetErrors().size()); |
| 646 } |
| 647 |
| 648 // Test upgrading a signed extension with a bad signature. |
| 649 TEST_F(ExtensionsServiceTest, UpgradeSignedBad) { |
| 650 FilePath extensions_path; |
| 651 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); |
| 652 extensions_path = extensions_path.AppendASCII("extensions"); |
| 653 |
| 654 FilePath path = extensions_path.AppendASCII("good.crx"); |
| 655 service_->InstallExtension(path); |
| 656 loop_.RunAllPending(); |
| 657 |
| 658 ASSERT_TRUE(installed_); |
| 659 ASSERT_EQ(1u, loaded_.size()); |
| 660 ASSERT_EQ(0u, GetErrors().size()); |
| 661 installed_ = NULL; |
| 662 |
| 663 // Try upgrading with a bad signature. This should fail during the unpack, |
| 664 // because the key will not match the signature. |
| 665 path = extensions_path.AppendASCII("good2_bad_signature.crx"); |
| 666 service_->InstallExtension(path); |
| 667 loop_.RunAllPending(); |
| 668 |
| 669 ASSERT_FALSE(installed_); |
| 670 ASSERT_EQ(1u, loaded_.size()); |
| 671 ASSERT_EQ(1u, GetErrors().size()); |
| 672 } |
| 673 |
630 // Tests uninstalling normal extensions | 674 // Tests uninstalling normal extensions |
631 TEST_F(ExtensionsServiceTest, UninstallExtension) { | 675 TEST_F(ExtensionsServiceTest, UninstallExtension) { |
632 FilePath extensions_path; | 676 FilePath extensions_path; |
633 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); | 677 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); |
634 extensions_path = extensions_path.AppendASCII("extensions"); | 678 extensions_path = extensions_path.AppendASCII("extensions"); |
635 | 679 |
636 // A simple extension that should install without error. | 680 // A simple extension that should install without error. |
637 FilePath path = extensions_path.AppendASCII("good.crx"); | 681 FilePath path = extensions_path.AppendASCII("good.crx"); |
638 InstallExtension(path, true); | 682 InstallExtension(path, true); |
639 | 683 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
717 EXPECT_EQ(id, unloaded_id_); | 761 EXPECT_EQ(id, unloaded_id_); |
718 | 762 |
719 ValidatePrefKeyCount(1); | 763 ValidatePrefKeyCount(1); |
720 ValidatePref(good0, L"state", Extension::DISABLED); | 764 ValidatePref(good0, L"state", Extension::DISABLED); |
721 ValidatePref(good0, L"location", Extension::INTERNAL); | 765 ValidatePref(good0, L"location", Extension::INTERNAL); |
722 } | 766 } |
723 | 767 |
724 // Tests that we generate IDs when they are not specified in the manifest for | 768 // Tests that we generate IDs when they are not specified in the manifest for |
725 // --load-extension. | 769 // --load-extension. |
726 TEST_F(ExtensionsServiceTest, GenerateID) { | 770 TEST_F(ExtensionsServiceTest, GenerateID) { |
| 771 Extension::ResetGeneratedIdCounter(); |
| 772 |
727 FilePath extensions_path; | 773 FilePath extensions_path; |
728 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); | 774 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extensions_path)); |
729 extensions_path = extensions_path.AppendASCII("extensions"); | 775 extensions_path = extensions_path.AppendASCII("extensions"); |
730 | 776 |
731 FilePath no_id_ext = extensions_path.AppendASCII("no_id"); | 777 FilePath no_id_ext = extensions_path.AppendASCII("no_id"); |
732 service_->LoadExtension(no_id_ext); | 778 service_->LoadExtension(no_id_ext); |
733 loop_.RunAllPending(); | 779 loop_.RunAllPending(); |
734 EXPECT_EQ(0u, GetErrors().size()); | 780 EXPECT_EQ(0u, GetErrors().size()); |
735 ASSERT_EQ(1u, loaded_.size()); | 781 ASSERT_EQ(1u, loaded_.size()); |
736 std::string id1 = loaded_[0]->id(); | 782 std::string id1 = loaded_[0]->id(); |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
961 ValidatePrefKeyCount(1); | 1007 ValidatePrefKeyCount(1); |
962 ValidatePref(good_crx, L"state", Extension::KILLBIT); | 1008 ValidatePref(good_crx, L"state", Extension::KILLBIT); |
963 ValidatePref(good_crx, L"location", Extension::EXTERNAL_PREF); | 1009 ValidatePref(good_crx, L"location", Extension::EXTERNAL_PREF); |
964 | 1010 |
965 // The extension should also be gone from disk. | 1011 // The extension should also be gone from disk. |
966 FilePath extension_path = install_path.DirName(); | 1012 FilePath extension_path = install_path.DirName(); |
967 extension_path = extension_path.AppendASCII(good_crx); | 1013 extension_path = extension_path.AppendASCII(good_crx); |
968 EXPECT_FALSE(file_util::PathExists(extension_path)) << | 1014 EXPECT_FALSE(file_util::PathExists(extension_path)) << |
969 extension_path.ToWStringHack(); | 1015 extension_path.ToWStringHack(); |
970 } | 1016 } |
OLD | NEW |