| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <stdint.h> | 5 #include <stdint.h> |
| 6 #include <tuple> | 6 #include <tuple> |
| 7 | 7 |
| 8 #include "base/files/scoped_temp_dir.h" | 8 #include "base/files/scoped_temp_dir.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 scoped_refptr<ServiceWorkerRegistration> new_registration_by_pattern = | 372 scoped_refptr<ServiceWorkerRegistration> new_registration_by_pattern = |
| 373 FindRegistrationForPattern(pattern); | 373 FindRegistrationForPattern(pattern); |
| 374 | 374 |
| 375 ASSERT_EQ(new_registration, old_registration); | 375 ASSERT_EQ(new_registration, old_registration); |
| 376 } | 376 } |
| 377 | 377 |
| 378 class FailToStartWorkerTestHelper : public EmbeddedWorkerTestHelper { | 378 class FailToStartWorkerTestHelper : public EmbeddedWorkerTestHelper { |
| 379 public: | 379 public: |
| 380 FailToStartWorkerTestHelper() : EmbeddedWorkerTestHelper(base::FilePath()) {} | 380 FailToStartWorkerTestHelper() : EmbeddedWorkerTestHelper(base::FilePath()) {} |
| 381 | 381 |
| 382 void OnStartWorker( | 382 void OnStartWorker(int embedded_worker_id, |
| 383 int embedded_worker_id, | 383 int64_t service_worker_version_id, |
| 384 int64_t service_worker_version_id, | 384 const GURL& scope, |
| 385 const GURL& scope, | 385 const GURL& script_url, |
| 386 const GURL& script_url, | 386 bool pause_after_download, |
| 387 bool pause_after_download, | 387 mojom::ServiceWorkerEventDispatcherRequest request, |
| 388 mojom::ServiceWorkerEventDispatcherRequest request) override { | 388 mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo |
| 389 EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); | 389 instance_host) override { |
| 390 registry()->OnWorkerStopped(worker->process_id(), embedded_worker_id); | 390 mojom::EmbeddedWorkerInstanceHostAssociatedPtr instance_host_ptr; |
| 391 instance_host_ptr.Bind(std::move(instance_host)); |
| 392 instance_host_ptr->OnStopped(); |
| 393 base::RunLoop().RunUntilIdle(); |
| 391 } | 394 } |
| 392 }; | 395 }; |
| 393 | 396 |
| 394 TEST_F(ServiceWorkerJobTest, Register_FailToStartWorker) { | 397 TEST_F(ServiceWorkerJobTest, Register_FailToStartWorker) { |
| 395 helper_.reset(new FailToStartWorkerTestHelper); | 398 helper_.reset(new FailToStartWorkerTestHelper); |
| 396 | 399 |
| 397 scoped_refptr<ServiceWorkerRegistration> registration = | 400 scoped_refptr<ServiceWorkerRegistration> registration = |
| 398 RunRegisterJob(GURL("http://www.example.com/"), | 401 RunRegisterJob(GURL("http://www.example.com/"), |
| 399 GURL("http://www.example.com/service_worker.js"), | 402 GURL("http://www.example.com/service_worker.js"), |
| 400 SERVICE_WORKER_ERROR_START_WORKER_FAILED); | 403 SERVICE_WORKER_ERROR_START_WORKER_FAILED); |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 EXPECT_TRUE(called); | 836 EXPECT_TRUE(called); |
| 834 EXPECT_TRUE(registration.get()); | 837 EXPECT_TRUE(registration.get()); |
| 835 EXPECT_TRUE(registration->active_version()); | 838 EXPECT_TRUE(registration->active_version()); |
| 836 EXPECT_FALSE(registration->installing_version()); | 839 EXPECT_FALSE(registration->installing_version()); |
| 837 EXPECT_FALSE(registration->waiting_version()); | 840 EXPECT_FALSE(registration->waiting_version()); |
| 838 registration_ = registration; | 841 registration_ = registration; |
| 839 return registration; | 842 return registration; |
| 840 } | 843 } |
| 841 | 844 |
| 842 // EmbeddedWorkerTestHelper overrides | 845 // EmbeddedWorkerTestHelper overrides |
| 843 void OnStartWorker( | 846 void OnStartWorker(int embedded_worker_id, |
| 844 int embedded_worker_id, | 847 int64_t version_id, |
| 845 int64_t version_id, | 848 const GURL& scope, |
| 846 const GURL& scope, | 849 const GURL& script, |
| 847 const GURL& script, | 850 bool pause_after_download, |
| 848 bool pause_after_download, | 851 mojom::ServiceWorkerEventDispatcherRequest request, |
| 849 mojom::ServiceWorkerEventDispatcherRequest request) override { | 852 mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo |
| 853 instance_host) override { |
| 850 const std::string kMockScriptBody = "mock_script"; | 854 const std::string kMockScriptBody = "mock_script"; |
| 851 const uint64_t kMockScriptSize = 19284; | 855 const uint64_t kMockScriptSize = 19284; |
| 852 ServiceWorkerVersion* version = context()->GetLiveVersion(version_id); | 856 ServiceWorkerVersion* version = context()->GetLiveVersion(version_id); |
| 853 ServiceWorkerRegistration* registration = | 857 ServiceWorkerRegistration* registration = |
| 854 context()->GetLiveRegistration(version->registration_id()); | 858 context()->GetLiveRegistration(version->registration_id()); |
| 855 bool is_update = registration->active_version() && | 859 bool is_update = registration->active_version() && |
| 856 version != registration->active_version(); | 860 version != registration->active_version(); |
| 857 | 861 |
| 858 ASSERT_TRUE(version); | 862 ASSERT_TRUE(version); |
| 859 version->AddListener(this); | 863 version->AddListener(this); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 877 version->SetMainScriptHttpResponseInfo( | 881 version->SetMainScriptHttpResponseInfo( |
| 878 EmbeddedWorkerTestHelper::CreateHttpResponseInfo()); | 882 EmbeddedWorkerTestHelper::CreateHttpResponseInfo()); |
| 879 } else { | 883 } else { |
| 880 if (script.GetOrigin() == kNoChangeOrigin) { | 884 if (script.GetOrigin() == kNoChangeOrigin) { |
| 881 // Simulate fetching the updated script and finding it's identical to | 885 // Simulate fetching the updated script and finding it's identical to |
| 882 // the incumbent. | 886 // the incumbent. |
| 883 version->script_cache_map()->NotifyFinishedCaching( | 887 version->script_cache_map()->NotifyFinishedCaching( |
| 884 script, kMockScriptSize, net::ERR_FILE_EXISTS, std::string()); | 888 script, kMockScriptSize, net::ERR_FILE_EXISTS, std::string()); |
| 885 version->SetMainScriptHttpResponseInfo( | 889 version->SetMainScriptHttpResponseInfo( |
| 886 EmbeddedWorkerTestHelper::CreateHttpResponseInfo()); | 890 EmbeddedWorkerTestHelper::CreateHttpResponseInfo()); |
| 887 SimulateWorkerScriptLoaded(embedded_worker_id); | 891 |
| 892 mojom::EmbeddedWorkerInstanceHostAssociatedPtr instance_host_ptr; |
| 893 instance_host_ptr.Bind(std::move(instance_host)); |
| 894 instance_host_ptr->OnScriptLoaded(); |
| 895 base::RunLoop().RunUntilIdle(); |
| 888 return; | 896 return; |
| 889 } | 897 } |
| 890 | 898 |
| 891 // Spoof caching the script for the new version. | 899 // Spoof caching the script for the new version. |
| 892 WriteStringResponse(storage(), resource_id, "mock_different_script"); | 900 WriteStringResponse(storage(), resource_id, "mock_different_script"); |
| 893 version->script_cache_map()->NotifyFinishedCaching( | 901 version->script_cache_map()->NotifyFinishedCaching( |
| 894 script, kMockScriptSize, net::OK, std::string()); | 902 script, kMockScriptSize, net::OK, std::string()); |
| 895 version->SetMainScriptHttpResponseInfo( | 903 version->SetMainScriptHttpResponseInfo( |
| 896 EmbeddedWorkerTestHelper::CreateHttpResponseInfo()); | 904 EmbeddedWorkerTestHelper::CreateHttpResponseInfo()); |
| 897 } | 905 } |
| 898 | 906 |
| 899 EmbeddedWorkerTestHelper::OnStartWorker(embedded_worker_id, version_id, | 907 EmbeddedWorkerTestHelper::OnStartWorker( |
| 900 scope, script, pause_after_download, | 908 embedded_worker_id, version_id, scope, script, pause_after_download, |
| 901 std::move(request)); | 909 std::move(request), std::move(instance_host)); |
| 902 } | 910 } |
| 903 | 911 |
| 904 void OnResumeAfterDownload(int embedded_worker_id) override { | 912 void OnResumeAfterDownload(int embedded_worker_id) override { |
| 905 if (!force_start_worker_failure_) { | 913 if (!force_start_worker_failure_) { |
| 906 EmbeddedWorkerTestHelper::OnResumeAfterDownload(embedded_worker_id); | 914 EmbeddedWorkerTestHelper::OnResumeAfterDownload(embedded_worker_id); |
| 907 } else { | 915 } else { |
| 908 SimulateWorkerThreadStarted(GetNextThreadId(), embedded_worker_id); | 916 SimulateWorkerThreadStarted(GetNextThreadId(), embedded_worker_id, |
| 917 GetNextProviderId()); |
| 909 SimulateWorkerScriptEvaluated(embedded_worker_id, false); | 918 SimulateWorkerScriptEvaluated(embedded_worker_id, false); |
| 910 } | 919 } |
| 911 } | 920 } |
| 912 | 921 |
| 913 // ServiceWorkerRegistration::Listener overrides | 922 // ServiceWorkerRegistration::Listener overrides |
| 914 void OnVersionAttributesChanged( | 923 void OnVersionAttributesChanged( |
| 915 ServiceWorkerRegistration* registration, | 924 ServiceWorkerRegistration* registration, |
| 916 ChangedVersionAttributesMask changed_mask, | 925 ChangedVersionAttributesMask changed_mask, |
| 917 const ServiceWorkerRegistrationInfo& info) override { | 926 const ServiceWorkerRegistrationInfo& info) override { |
| 918 AttributeChangeLogEntry entry; | 927 AttributeChangeLogEntry entry; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 946 bool force_start_worker_failure_ = false; | 955 bool force_start_worker_failure_ = false; |
| 947 }; | 956 }; |
| 948 | 957 |
| 949 // Helper class for update tests that evicts the active version when the update | 958 // Helper class for update tests that evicts the active version when the update |
| 950 // worker is about to be started. | 959 // worker is about to be started. |
| 951 class EvictIncumbentVersionHelper : public UpdateJobTestHelper { | 960 class EvictIncumbentVersionHelper : public UpdateJobTestHelper { |
| 952 public: | 961 public: |
| 953 EvictIncumbentVersionHelper() {} | 962 EvictIncumbentVersionHelper() {} |
| 954 ~EvictIncumbentVersionHelper() override {} | 963 ~EvictIncumbentVersionHelper() override {} |
| 955 | 964 |
| 956 void OnStartWorker( | 965 void OnStartWorker(int embedded_worker_id, |
| 957 int embedded_worker_id, | 966 int64_t version_id, |
| 958 int64_t version_id, | 967 const GURL& scope, |
| 959 const GURL& scope, | 968 const GURL& script, |
| 960 const GURL& script, | 969 bool pause_after_download, |
| 961 bool pause_after_download, | 970 mojom::ServiceWorkerEventDispatcherRequest request, |
| 962 mojom::ServiceWorkerEventDispatcherRequest request) override { | 971 mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo |
| 972 instance_host) override { |
| 963 ServiceWorkerVersion* version = context()->GetLiveVersion(version_id); | 973 ServiceWorkerVersion* version = context()->GetLiveVersion(version_id); |
| 964 ServiceWorkerRegistration* registration = | 974 ServiceWorkerRegistration* registration = |
| 965 context()->GetLiveRegistration(version->registration_id()); | 975 context()->GetLiveRegistration(version->registration_id()); |
| 966 bool is_update = registration->active_version() && | 976 bool is_update = registration->active_version() && |
| 967 version != registration->active_version(); | 977 version != registration->active_version(); |
| 968 if (is_update) { | 978 if (is_update) { |
| 969 // Evict the incumbent worker. | 979 // Evict the incumbent worker. |
| 970 ASSERT_FALSE(registration->waiting_version()); | 980 ASSERT_FALSE(registration->waiting_version()); |
| 971 registration->DeleteVersion( | 981 registration->DeleteVersion( |
| 972 make_scoped_refptr(registration->active_version())); | 982 make_scoped_refptr(registration->active_version())); |
| 973 } | 983 } |
| 974 UpdateJobTestHelper::OnStartWorker(embedded_worker_id, version_id, scope, | 984 UpdateJobTestHelper::OnStartWorker( |
| 975 script, pause_after_download, | 985 embedded_worker_id, version_id, scope, script, pause_after_download, |
| 976 std::move(request)); | 986 std::move(request), std::move(instance_host)); |
| 977 } | 987 } |
| 978 | 988 |
| 979 void OnRegistrationFailed(ServiceWorkerRegistration* registration) override { | 989 void OnRegistrationFailed(ServiceWorkerRegistration* registration) override { |
| 980 registration_failed_ = true; | 990 registration_failed_ = true; |
| 981 } | 991 } |
| 982 | 992 |
| 983 bool registration_failed_ = false; | 993 bool registration_failed_ = false; |
| 984 }; | 994 }; |
| 985 | 995 |
| 986 } // namespace | 996 } // namespace |
| (...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1638 public: | 1648 public: |
| 1639 explicit CheckPauseAfterDownloadEmbeddedWorkerInstanceClient( | 1649 explicit CheckPauseAfterDownloadEmbeddedWorkerInstanceClient( |
| 1640 base::WeakPtr<EmbeddedWorkerTestHelper> helper) | 1650 base::WeakPtr<EmbeddedWorkerTestHelper> helper) |
| 1641 : EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient(helper) {} | 1651 : EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient(helper) {} |
| 1642 int num_of_startworker() const { return num_of_startworker_; } | 1652 int num_of_startworker() const { return num_of_startworker_; } |
| 1643 void set_next_pause_after_download(bool expectation) { | 1653 void set_next_pause_after_download(bool expectation) { |
| 1644 next_pause_after_download_ = expectation; | 1654 next_pause_after_download_ = expectation; |
| 1645 } | 1655 } |
| 1646 | 1656 |
| 1647 protected: | 1657 protected: |
| 1648 void StartWorker( | 1658 void StartWorker(const EmbeddedWorkerStartParams& params, |
| 1649 const EmbeddedWorkerStartParams& params, | 1659 mojom::ServiceWorkerEventDispatcherRequest request, |
| 1650 mojom::ServiceWorkerEventDispatcherRequest request) override { | 1660 mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo |
| 1661 instance_host) override { |
| 1651 ASSERT_TRUE(next_pause_after_download_.has_value()); | 1662 ASSERT_TRUE(next_pause_after_download_.has_value()); |
| 1652 EXPECT_EQ(next_pause_after_download_.value(), params.pause_after_download); | 1663 EXPECT_EQ(next_pause_after_download_.value(), params.pause_after_download); |
| 1653 num_of_startworker_++; | 1664 num_of_startworker_++; |
| 1654 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StartWorker( | 1665 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::StartWorker( |
| 1655 params, std::move(request)); | 1666 params, std::move(request), std::move(instance_host)); |
| 1656 } | 1667 } |
| 1657 | 1668 |
| 1658 private: | 1669 private: |
| 1659 base::Optional<bool> next_pause_after_download_; | 1670 base::Optional<bool> next_pause_after_download_; |
| 1660 int num_of_startworker_ = 0; | 1671 int num_of_startworker_ = 0; |
| 1661 DISALLOW_COPY_AND_ASSIGN(CheckPauseAfterDownloadEmbeddedWorkerInstanceClient); | 1672 DISALLOW_COPY_AND_ASSIGN(CheckPauseAfterDownloadEmbeddedWorkerInstanceClient); |
| 1662 }; | 1673 }; |
| 1663 | 1674 |
| 1664 TEST_F(ServiceWorkerJobTest, Update_PauseAfterDownload) { | 1675 TEST_F(ServiceWorkerJobTest, Update_PauseAfterDownload) { |
| 1665 UpdateJobTestHelper* update_helper = new UpdateJobTestHelper; | 1676 UpdateJobTestHelper* update_helper = new UpdateJobTestHelper; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1738 // should not be promoted to ACTIVATED because failure occur | 1749 // should not be promoted to ACTIVATED because failure occur |
| 1739 // during shutdown. | 1750 // during shutdown. |
| 1740 runner->RunUntilIdle(); | 1751 runner->RunUntilIdle(); |
| 1741 base::RunLoop().RunUntilIdle(); | 1752 base::RunLoop().RunUntilIdle(); |
| 1742 EXPECT_EQ(new_version.get(), registration->active_version()); | 1753 EXPECT_EQ(new_version.get(), registration->active_version()); |
| 1743 EXPECT_EQ(ServiceWorkerVersion::ACTIVATING, new_version->status()); | 1754 EXPECT_EQ(ServiceWorkerVersion::ACTIVATING, new_version->status()); |
| 1744 registration->RemoveListener(update_helper); | 1755 registration->RemoveListener(update_helper); |
| 1745 } | 1756 } |
| 1746 | 1757 |
| 1747 } // namespace content | 1758 } // namespace content |
| OLD | NEW |