Chromium Code Reviews| Index: chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc |
| diff --git a/chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc b/chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc |
| index 799785d041f8b0d60cd5549b7e6ff501ba7902d3..ceba5e6a99c98de0ea237f7d838a4828c62397a5 100644 |
| --- a/chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc |
| +++ b/chrome/browser/chromeos/net/network_portal_detector_impl_unittest.cc |
| @@ -2,9 +2,15 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +#include <algorithm> |
| +#include <vector> |
| + |
| #include "base/compiler_specific.h" |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| +#include "base/metrics/histogram_base.h" |
| +#include "base/metrics/histogram_samples.h" |
| +#include "base/metrics/statistics_recorder.h" |
| #include "base/run_loop.h" |
| #include "chrome/browser/captive_portal/captive_portal_detector.h" |
| #include "chrome/browser/captive_portal/testing_utils.h" |
| @@ -30,6 +36,14 @@ namespace chromeos { |
| namespace { |
| +// Service paths for stub network devices. |
| +const char kStubEthernet[] = "stub_ethernet"; |
| +const char kStubWireless1[] = "stub_wifi1"; |
| +const char kStubWireless2[] = "stub_wifi2"; |
| +const char kStubCellular[] = "stub_cellular"; |
| + |
| +const char kResultHistogram[] = "CaptivePortal.OOBE.DetectionResult"; |
|
Nikita (slow)
2014/01/09 13:48:56
nit: Please move this histogram name to header.
ygorshenin1
2014/01/09 14:59:35
Done.
|
| + |
| void ErrorCallbackFunction(const std::string& error_name, |
| const std::string& error_message) { |
| LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message; |
| @@ -44,13 +58,67 @@ class MockObserver : public NetworkPortalDetector::Observer { |
| const NetworkPortalDetector::CaptivePortalState& state)); |
| }; |
| -} // namespace |
| +class ResultHistogramChecker { |
|
Nikita (slow)
2014/01/09 13:48:56
nit: I wonder how histogram reporting is checked o
|
| + public: |
| + ResultHistogramChecker(base::HistogramSamples* base) |
| + : base_(base), |
| + count_(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_COUNT) { |
| + } |
| + virtual ~ResultHistogramChecker() {} |
| -// Service paths for stub network devices. |
| -const char* kStubEthernet = "stub_ethernet"; |
| -const char* kStubWireless1 = "stub_wifi1"; |
| -const char* kStubWireless2 = "stub_wifi2"; |
| -const char* kStubCellular = "stub_cellular"; |
| + ResultHistogramChecker* Expect( |
| + NetworkPortalDetector::CaptivePortalStatus status, |
| + int count) { |
| + count_[status] = count; |
| + return this; |
| + } |
| + |
| + bool Check() const { |
| + base::HistogramBase* histogram = base::StatisticsRecorder::FindHistogram( |
| + kResultHistogram); |
| + bool empty = false; |
| + if (static_cast<size_t>(std::count(count_.begin(), count_.end(), 0)) == |
| + count_.size()) { |
| + empty = true; |
| + } |
| + |
| + if (!histogram) { |
| + if (empty) |
| + return true; |
| + LOG(ERROR) << "Can't get histogram for " << kResultHistogram; |
| + return false; |
| + } |
| + scoped_ptr<base::HistogramSamples> samples = histogram->SnapshotSamples(); |
| + if (!samples.get()) { |
| + if (empty) |
| + return true; |
| + LOG(ERROR) << "Can't get samples for "<< kResultHistogram; |
| + return false; |
| + } |
| + bool ok = true; |
| + for (size_t i = 0; i < count_.size(); ++i) { |
| + const int base = base_ ? base_->GetCount(i) : 0; |
| + const int actual = samples->GetCount(i) - base; |
| + const NetworkPortalDetector::CaptivePortalStatus status = |
| + static_cast<NetworkPortalDetector::CaptivePortalStatus>(i); |
| + if (actual != count_[i]) { |
| + LOG(ERROR) << "Expected: " << count_[i] << ", " |
| + << "actual: " << actual << " for " |
| + << NetworkPortalDetector::CaptivePortalStatusString(status); |
| + ok = false; |
| + } |
| + } |
| + return ok; |
| + } |
| + |
| + private: |
| + base::HistogramSamples* base_; |
| + std::vector<int> count_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ResultHistogramChecker); |
| +}; |
| + |
| +} // namespace |
| class NetworkPortalDetectorImplTest |
| : public testing::Test, |
| @@ -58,6 +126,7 @@ class NetworkPortalDetectorImplTest |
| protected: |
| virtual void SetUp() { |
| DBusThreadManager::InitializeWithStub(); |
| + base::StatisticsRecorder::Initialize(); |
| SetupNetworkHandler(); |
| profile_.reset(new TestingProfile()); |
| @@ -69,6 +138,11 @@ class NetworkPortalDetectorImplTest |
| // Prevents flakiness due to message loop delays. |
| set_time_ticks(base::TimeTicks::Now()); |
| + |
| + if (base::HistogramBase* histogram = |
| + base::StatisticsRecorder::FindHistogram(kResultHistogram)) { |
| + original_samples_.reset(histogram->SnapshotSamples().release()); |
| + } |
| } |
| virtual void TearDown() { |
| @@ -206,6 +280,11 @@ class NetworkPortalDetectorImplTest |
| base::RunLoop().RunUntilIdle(); |
| } |
| + scoped_ptr<ResultHistogramChecker> MakeResultHistogramChecker() { |
| + return scoped_ptr<ResultHistogramChecker>( |
| + new ResultHistogramChecker(original_samples_.get())).Pass(); |
| + } |
| + |
| private: |
| void SetupDefaultShillState() { |
| base::RunLoop().RunUntilIdle(); |
| @@ -240,6 +319,7 @@ class NetworkPortalDetectorImplTest |
| content::TestBrowserThreadBundle thread_bundle_; |
| scoped_ptr<TestingProfile> profile_; |
| scoped_ptr<NetworkPortalDetectorImpl> network_portal_detector_; |
| + scoped_ptr<base::HistogramSamples> original_samples_; |
| }; |
| TEST_F(NetworkPortalDetectorImplTest, NoPortal) { |
| @@ -256,6 +336,9 @@ TEST_F(NetworkPortalDetectorImplTest, NoPortal) { |
| ASSERT_TRUE(is_state_idle()); |
| CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, |
| kStubWireless1); |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, Portal) { |
| @@ -290,6 +373,10 @@ TEST_F(NetworkPortalDetectorImplTest, Portal) { |
| ASSERT_TRUE(is_state_idle()); |
| CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 302, |
| kStubEthernet); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 3) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, Online2Offline) { |
| @@ -329,6 +416,10 @@ TEST_F(NetworkPortalDetectorImplTest, Online2Offline) { |
| } |
| network_portal_detector()->RemoveObserver(&observer); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, TwoNetworks) { |
| @@ -351,6 +442,11 @@ TEST_F(NetworkPortalDetectorImplTest, TwoNetworks) { |
| kStubEthernet); |
| CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, |
| kStubWireless1); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, NetworkChanged) { |
| @@ -379,6 +475,10 @@ TEST_F(NetworkPortalDetectorImplTest, NetworkChanged) { |
| // network, it's state must be unknown. |
| CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, |
| kStubWireless1); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, NetworkStateNotChanged) { |
| @@ -395,6 +495,10 @@ TEST_F(NetworkPortalDetectorImplTest, NetworkStateNotChanged) { |
| SetConnected(kStubWireless1); |
| ASSERT_TRUE(is_state_idle()); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, NetworkStateChanged) { |
| @@ -427,6 +531,11 @@ TEST_F(NetworkPortalDetectorImplTest, NetworkStateChanged) { |
| ASSERT_TRUE(is_state_idle()); |
| CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, |
| kStubWireless1); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 2) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, PortalDetectionTimeout) { |
| @@ -446,6 +555,8 @@ TEST_F(NetworkPortalDetectorImplTest, PortalDetectionTimeout) { |
| ASSERT_TRUE(is_state_portal_detection_pending()); |
| ASSERT_EQ(1, attempt_count()); |
| ASSERT_EQ(base::TimeDelta::FromSeconds(3), next_attempt_delay()); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker()->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, PortalDetectionRetryAfter) { |
| @@ -464,6 +575,8 @@ TEST_F(NetworkPortalDetectorImplTest, PortalDetectionRetryAfter) { |
| ASSERT_TRUE(is_state_portal_detection_pending()); |
| ASSERT_EQ(1, attempt_count()); |
| ASSERT_EQ(base::TimeDelta::FromSeconds(101), next_attempt_delay()); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker()->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, PortalDetectorRetryAfterIsSmall) { |
| @@ -483,6 +596,8 @@ TEST_F(NetworkPortalDetectorImplTest, PortalDetectorRetryAfterIsSmall) { |
| ASSERT_TRUE(is_state_portal_detection_pending()); |
| ASSERT_EQ(1, attempt_count()); |
| ASSERT_EQ(base::TimeDelta::FromSeconds(3), next_attempt_delay()); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker()->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, FirstAttemptFailed) { |
| @@ -509,6 +624,10 @@ TEST_F(NetworkPortalDetectorImplTest, FirstAttemptFailed) { |
| ASSERT_EQ(2, attempt_count()); |
| CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, |
| kStubWireless1); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, AllAttemptsFailed) { |
| @@ -543,6 +662,10 @@ TEST_F(NetworkPortalDetectorImplTest, AllAttemptsFailed) { |
| ASSERT_EQ(3, attempt_count()); |
| CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 503, |
| kStubWireless1); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 1) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, ProxyAuthRequired) { |
| @@ -556,6 +679,12 @@ TEST_F(NetworkPortalDetectorImplTest, ProxyAuthRequired) { |
| CheckPortalState( |
| NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED, 407, |
| kStubWireless1); |
| + |
| + ASSERT_TRUE( |
| + MakeResultHistogramChecker() |
| + ->Expect( |
| + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED, 1) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, NoResponseButBehindPortal) { |
| @@ -592,6 +721,10 @@ TEST_F(NetworkPortalDetectorImplTest, NoResponseButBehindPortal) { |
| CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, |
| net::URLFetcher::RESPONSE_CODE_INVALID, |
| kStubWireless1); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, DisableLazyDetectionWhilePendingRequest) { |
| @@ -603,6 +736,8 @@ TEST_F(NetworkPortalDetectorImplTest, DisableLazyDetectionWhilePendingRequest) { |
| // To run CaptivePortalDetector::DetectCaptivePortal(). |
| base::MessageLoop::current()->RunUntilIdle(); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker()->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, LazyDetectionForOnlineNetwork) { |
| @@ -644,6 +779,10 @@ TEST_F(NetworkPortalDetectorImplTest, LazyDetectionForOnlineNetwork) { |
| CheckPortalState( |
| NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, |
| kStubWireless1); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, LazyDetectionForPortalNetwork) { |
| @@ -694,6 +833,10 @@ TEST_F(NetworkPortalDetectorImplTest, LazyDetectionForPortalNetwork) { |
| ASSERT_TRUE(is_state_idle()); |
| CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, |
| kStubWireless1); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, DetectionTimeoutIsCancelled) { |
| @@ -711,6 +854,8 @@ TEST_F(NetworkPortalDetectorImplTest, DetectionTimeoutIsCancelled) { |
| ASSERT_TRUE(detection_timeout_is_cancelled()); |
| CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, |
| kStubWireless1); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker()->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, TestDetectionRestart) { |
| @@ -740,6 +885,11 @@ TEST_F(NetworkPortalDetectorImplTest, TestDetectionRestart) { |
| CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, |
| kStubWireless1); |
| ASSERT_TRUE(is_state_idle()); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker()-> |
| + Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1)-> |
| + Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 1)-> |
| + Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, RequestTimeouts) { |
| @@ -797,6 +947,11 @@ TEST_F(NetworkPortalDetectorImplTest, RequestTimeouts) { |
| disable_lazy_detection(); |
| CheckRequestTimeoutAndCompleteAttempt(3, 15, net::OK, 204); |
| ASSERT_TRUE(is_state_idle()); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 1) |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) |
| + ->Check()); |
| } |
| TEST_F(NetworkPortalDetectorImplTest, StartDetectionIfIdle) { |
| @@ -828,6 +983,11 @@ TEST_F(NetworkPortalDetectorImplTest, StartDetectionIfIdle) { |
| base::RunLoop().RunUntilIdle(); |
| CheckRequestTimeoutAndCompleteAttempt(1, 5, net::OK, 204); |
| ASSERT_TRUE(is_state_idle()); |
| + |
| + ASSERT_TRUE(MakeResultHistogramChecker() |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 1) |
| + ->Expect(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 1) |
| + ->Check()); |
| } |
| } // namespace chromeos |