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 "content/browser/service_worker/service_worker_version.h" | 5 #include "content/browser/service_worker/service_worker_version.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 #include <tuple> | 8 #include <tuple> |
9 | 9 |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
12 #include "base/run_loop.h" | 12 #include "base/run_loop.h" |
13 #include "base/test/histogram_tester.h" | |
13 #include "content/browser/service_worker/embedded_worker_registry.h" | 14 #include "content/browser/service_worker/embedded_worker_registry.h" |
14 #include "content/browser/service_worker/embedded_worker_status.h" | 15 #include "content/browser/service_worker/embedded_worker_status.h" |
15 #include "content/browser/service_worker/embedded_worker_test_helper.h" | 16 #include "content/browser/service_worker/embedded_worker_test_helper.h" |
16 #include "content/browser/service_worker/service_worker_context_core.h" | 17 #include "content/browser/service_worker/service_worker_context_core.h" |
17 #include "content/browser/service_worker/service_worker_registration.h" | 18 #include "content/browser/service_worker/service_worker_registration.h" |
18 #include "content/browser/service_worker/service_worker_test_utils.h" | 19 #include "content/browser/service_worker/service_worker_test_utils.h" |
19 #include "content/common/service_worker/service_worker_utils.h" | 20 #include "content/common/service_worker/service_worker_utils.h" |
20 #include "content/public/test/mock_render_process_host.h" | 21 #include "content/public/test/mock_render_process_host.h" |
21 #include "content/public/test/test_browser_thread_bundle.h" | 22 #include "content/public/test/test_browser_thread_bundle.h" |
22 #include "content/public/test/test_mojo_service.mojom.h" | 23 #include "content/public/test/test_mojo_service.mojom.h" |
(...skipping 1297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1320 version_->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN, | 1321 version_->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN, |
1321 CreateReceiverOnCurrentThread(&status)); | 1322 CreateReceiverOnCurrentThread(&status)); |
1322 base::RunLoop().RunUntilIdle(); | 1323 base::RunLoop().RunUntilIdle(); |
1323 EXPECT_EQ(SERVICE_WORKER_OK, status); | 1324 EXPECT_EQ(SERVICE_WORKER_OK, status); |
1324 EXPECT_EQ(helper_->mock_render_process_id(), | 1325 EXPECT_EQ(helper_->mock_render_process_id(), |
1325 version_->embedded_worker()->process_id()); | 1326 version_->embedded_worker()->process_id()); |
1326 version_->StopWorker(CreateReceiverOnCurrentThread(&status)); | 1327 version_->StopWorker(CreateReceiverOnCurrentThread(&status)); |
1327 base::RunLoop().RunUntilIdle(); | 1328 base::RunLoop().RunUntilIdle(); |
1328 } | 1329 } |
1329 | 1330 |
1331 TEST_F(ServiceWorkerFailToStartTest, RestartStalledWorker) { | |
1332 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; | |
1333 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; | |
nhiroki
2016/07/29 06:08:03
To emphasize this is a dummy error value, I use SE
horo
2016/07/29 08:59:04
Done.
| |
1334 version_->StartWorker(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, | |
1335 CreateReceiverOnCurrentThread(&status1)); | |
1336 base::RunLoop().RunUntilIdle(); | |
1337 // The default start mode is StartMode::STALL. So the callback of StartWorker | |
1338 // is not called yet. | |
1339 EXPECT_EQ(SERVICE_WORKER_ERROR_FAILED, status1); | |
1340 | |
1341 // Set StartMode::SUCCEED. So the next start worker will be successful. | |
1342 set_start_mode(MessageReceiverDisallowStart::StartMode::SUCCEED); | |
1343 | |
1344 // StartWorker message will be sent again because OnStopped is called before | |
1345 // OnStarted. | |
1346 version_->StopWorker(CreateReceiverOnCurrentThread(&status2)); | |
1347 base::RunLoop().RunUntilIdle(); | |
1348 | |
1349 EXPECT_EQ(SERVICE_WORKER_OK, status1); | |
1350 EXPECT_EQ(SERVICE_WORKER_OK, status2); | |
1351 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); | |
1352 } | |
1353 | |
1330 TEST_F(ServiceWorkerVersionTest, DispatchConcurrentEvent) { | 1354 TEST_F(ServiceWorkerVersionTest, DispatchConcurrentEvent) { |
1331 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value | 1355 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
1332 | 1356 |
1333 // Activate and start worker. | 1357 // Activate and start worker. |
1334 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 1358 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
1335 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, | 1359 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, |
1336 CreateReceiverOnCurrentThread(&status)); | 1360 CreateReceiverOnCurrentThread(&status)); |
1337 base::RunLoop().RunUntilIdle(); | 1361 base::RunLoop().RunUntilIdle(); |
1338 EXPECT_EQ(SERVICE_WORKER_OK, status); | 1362 EXPECT_EQ(SERVICE_WORKER_OK, status); |
1339 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); | 1363 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1538 EXPECT_EQ(request_id2, received_request_id2); | 1562 EXPECT_EQ(request_id2, received_request_id2); |
1539 EXPECT_EQ(reply2, received_data2); | 1563 EXPECT_EQ(reply2, received_data2); |
1540 | 1564 |
1541 // Should not have timed out, so error callback should not have been | 1565 // Should not have timed out, so error callback should not have been |
1542 // called and FinishRequest should return true. | 1566 // called and FinishRequest should return true. |
1543 EXPECT_EQ(SERVICE_WORKER_OK, status); | 1567 EXPECT_EQ(SERVICE_WORKER_OK, status); |
1544 EXPECT_TRUE(version_->FinishRequest(request_id1, true)); | 1568 EXPECT_TRUE(version_->FinishRequest(request_id1, true)); |
1545 EXPECT_TRUE(version_->FinishRequest(request_id2, true)); | 1569 EXPECT_TRUE(version_->FinishRequest(request_id2, true)); |
1546 } | 1570 } |
1547 | 1571 |
1572 class ServiceWorkerNavigationHintUMATest : public ServiceWorkerVersionTest { | |
1573 protected: | |
1574 ServiceWorkerNavigationHintUMATest() : ServiceWorkerVersionTest() {} | |
1575 | |
1576 void StartWorker(ServiceWorkerMetrics::EventType purpose) { | |
1577 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | |
1578 version_->StartWorker(purpose, CreateReceiverOnCurrentThread(&status)); | |
1579 base::RunLoop().RunUntilIdle(); | |
1580 EXPECT_EQ(SERVICE_WORKER_OK, status); | |
1581 } | |
1582 | |
1583 void StopWorker() { | |
1584 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | |
1585 version_->StopWorker(CreateReceiverOnCurrentThread(&status)); | |
1586 base::RunLoop().RunUntilIdle(); | |
1587 EXPECT_EQ(SERVICE_WORKER_OK, status); | |
1588 } | |
1589 | |
1590 void SimpleNavigationHintTest( | |
1591 ServiceWorkerMetrics::EventType purpose, | |
1592 const char* changed_historam_name, | |
1593 const std::vector<const char*>& unchanged_historam_names) { | |
1594 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | |
1595 StartWorker(purpose); | |
1596 StopWorker(); | |
1597 histogram_tester_.ExpectBucketCount(kNavigationHintPrecision, true, 0); | |
1598 histogram_tester_.ExpectBucketCount(kNavigationHintPrecision, false, 1); | |
1599 histogram_tester_.ExpectBucketCount(changed_historam_name, true, 0); | |
1600 histogram_tester_.ExpectBucketCount(changed_historam_name, false, 1); | |
1601 for (const auto& unchanged_historam_name : unchanged_historam_names) { | |
nhiroki
2016/07/29 06:08:03
|const char*| could be a bit more readable.
JFYI:
horo
2016/07/29 08:59:04
Done.
| |
1602 histogram_tester_.ExpectTotalCount(unchanged_historam_name, 0); | |
1603 } | |
nhiroki
2016/07/29 06:08:03
nit: Curly braces are not necessary for one line b
horo
2016/07/29 08:59:04
Done.
| |
1604 | |
1605 StartWorker(purpose); | |
1606 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::MESSAGE); | |
1607 StopWorker(); | |
1608 histogram_tester_.ExpectBucketCount(kNavigationHintPrecision, true, 0); | |
1609 histogram_tester_.ExpectBucketCount(kNavigationHintPrecision, false, 2); | |
1610 histogram_tester_.ExpectBucketCount(changed_historam_name, true, 0); | |
1611 histogram_tester_.ExpectBucketCount(changed_historam_name, false, 2); | |
1612 for (const auto& unchanged_historam_name : unchanged_historam_names) { | |
1613 histogram_tester_.ExpectTotalCount(unchanged_historam_name, 0); | |
1614 } | |
1615 | |
1616 StartWorker(purpose); | |
1617 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME); | |
1618 StopWorker(); | |
1619 histogram_tester_.ExpectBucketCount(kNavigationHintPrecision, true, 1); | |
1620 histogram_tester_.ExpectBucketCount(kNavigationHintPrecision, false, 2); | |
1621 histogram_tester_.ExpectBucketCount(changed_historam_name, true, 1); | |
1622 histogram_tester_.ExpectBucketCount(changed_historam_name, false, 2); | |
1623 for (const auto& unchanged_historam_name : unchanged_historam_names) { | |
1624 histogram_tester_.ExpectTotalCount(unchanged_historam_name, 0); | |
1625 } | |
1626 | |
1627 StartWorker(purpose); | |
1628 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::FETCH_SUB_FRAME); | |
1629 StopWorker(); | |
1630 histogram_tester_.ExpectBucketCount(kNavigationHintPrecision, true, 2); | |
1631 histogram_tester_.ExpectBucketCount(kNavigationHintPrecision, false, 2); | |
1632 histogram_tester_.ExpectBucketCount(changed_historam_name, true, 2); | |
1633 histogram_tester_.ExpectBucketCount(changed_historam_name, false, 2); | |
1634 for (const auto& unchanged_historam_name : unchanged_historam_names) { | |
1635 histogram_tester_.ExpectTotalCount(unchanged_historam_name, 0); | |
1636 } | |
1637 } | |
1638 | |
1639 static const char kNavigationHintPrecision[]; | |
1640 static const char kLinkMouseDown[]; | |
1641 static const char kLinkTapUnconfirmed[]; | |
1642 static const char kLinkTapDown[]; | |
1643 | |
1644 base::HistogramTester histogram_tester_; | |
1645 | |
1646 private: | |
1647 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerNavigationHintUMATest); | |
1648 }; | |
1649 | |
1650 const char ServiceWorkerNavigationHintUMATest::kNavigationHintPrecision[] = | |
1651 "ServiceWorker.NavigationHintPrecision"; | |
1652 const char ServiceWorkerNavigationHintUMATest::kLinkMouseDown[] = | |
1653 "ServiceWorker.NavigationHintPrecision.LINK_MOUSE_DOWN"; | |
1654 const char ServiceWorkerNavigationHintUMATest::kLinkTapUnconfirmed[] = | |
1655 "ServiceWorker.NavigationHintPrecision.LINK_TAP_UNCONFIRMED"; | |
1656 const char ServiceWorkerNavigationHintUMATest::kLinkTapDown[] = | |
1657 "ServiceWorker.NavigationHintPrecision.LINK_TAP_DOWN"; | |
1658 | |
1659 TEST_F(ServiceWorkerNavigationHintUMATest, LinkMouseDown) { | |
1660 SimpleNavigationHintTest( | |
1661 ServiceWorkerMetrics::EventType::NAVIGATION_HINT_LINK_MOUSE_DOWN, | |
1662 kLinkMouseDown, {kLinkTapUnconfirmed, kLinkTapDown}); | |
1663 } | |
1664 | |
1665 TEST_F(ServiceWorkerNavigationHintUMATest, LinkTapUnconfirmed) { | |
1666 SimpleNavigationHintTest( | |
1667 ServiceWorkerMetrics::EventType::NAVIGATION_HINT_LINK_TAP_UNCONFIRMED, | |
1668 kLinkTapUnconfirmed, {kLinkMouseDown, kLinkTapDown}); | |
1669 } | |
1670 | |
1671 TEST_F(ServiceWorkerNavigationHintUMATest, LinkTapDown) { | |
1672 SimpleNavigationHintTest( | |
1673 ServiceWorkerMetrics::EventType::NAVIGATION_HINT_LINK_TAP_DOWN, | |
1674 kLinkTapDown, {kLinkMouseDown, kLinkTapUnconfirmed}); | |
1675 } | |
1676 | |
1677 TEST_F(ServiceWorkerNavigationHintUMATest, ConcurrentStart) { | |
1678 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | |
1679 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; | |
1680 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; | |
1681 version_->StartWorker(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, | |
1682 CreateReceiverOnCurrentThread(&status1)); | |
1683 version_->StartWorker( | |
1684 ServiceWorkerMetrics::EventType::NAVIGATION_HINT_LINK_MOUSE_DOWN, | |
1685 CreateReceiverOnCurrentThread(&status2)); | |
1686 base::RunLoop().RunUntilIdle(); | |
1687 EXPECT_EQ(SERVICE_WORKER_OK, status1); | |
1688 EXPECT_EQ(SERVICE_WORKER_OK, status2); | |
1689 StopWorker(); | |
1690 // The first purpose of starting worker was not a navigation hint. | |
1691 histogram_tester_.ExpectTotalCount(kNavigationHintPrecision, 0); | |
1692 | |
1693 status1 = SERVICE_WORKER_ERROR_FAILED; | |
1694 status2 = SERVICE_WORKER_ERROR_FAILED; | |
1695 version_->StartWorker( | |
1696 ServiceWorkerMetrics::EventType::NAVIGATION_HINT_LINK_MOUSE_DOWN, | |
1697 CreateReceiverOnCurrentThread(&status2)); | |
1698 version_->StartWorker(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, | |
1699 CreateReceiverOnCurrentThread(&status1)); | |
1700 base::RunLoop().RunUntilIdle(); | |
1701 EXPECT_EQ(SERVICE_WORKER_OK, status1); | |
1702 EXPECT_EQ(SERVICE_WORKER_OK, status2); | |
1703 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME); | |
1704 StopWorker(); | |
1705 // The first purpose of starting worker was a navigation hint. | |
1706 histogram_tester_.ExpectTotalCount(kNavigationHintPrecision, 1); | |
1707 histogram_tester_.ExpectBucketCount(kNavigationHintPrecision, true, 1); | |
1708 histogram_tester_.ExpectBucketCount(kNavigationHintPrecision, false, 0); | |
1709 } | |
1710 | |
1711 TEST_F(ServiceWorkerNavigationHintUMATest, StartWhileStopping) { | |
1712 StartWorker(ServiceWorkerMetrics::EventType::NAVIGATION_HINT_LINK_MOUSE_DOWN); | |
1713 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | |
1714 version_->StopWorker(CreateReceiverOnCurrentThread(&status)); | |
1715 EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, version_->running_status()); | |
1716 histogram_tester_.ExpectTotalCount(kLinkMouseDown, 0); | |
1717 | |
1718 StartWorker(ServiceWorkerMetrics::EventType::NAVIGATION_HINT_LINK_TAP_DOWN); | |
1719 // The UMA for kLinkMouseDown must be recorded while restarting. | |
1720 histogram_tester_.ExpectTotalCount(kLinkMouseDown, 1); | |
1721 histogram_tester_.ExpectTotalCount(kLinkTapDown, 0); | |
1722 EXPECT_EQ(SERVICE_WORKER_OK, status); | |
1723 StopWorker(); | |
1724 // The UMA for kLinkMouseDown must be recorded when the worker stopped. | |
1725 histogram_tester_.ExpectTotalCount(kLinkMouseDown, 1); | |
1726 histogram_tester_.ExpectTotalCount(kLinkTapDown, 1); | |
1727 } | |
1728 | |
1548 } // namespace content | 1729 } // namespace content |
OLD | NEW |