Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(507)

Side by Side Diff: chrome/browser/android/data_usage/external_data_use_observer_unittest.cc

Issue 1491793002: Add histograms for ExternalDataUseObserver (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "chrome/browser/android/data_usage/external_data_use_observer.h" 5 #include "chrome/browser/android/data_usage/external_data_use_observer.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/metrics/field_trial.h" 12 #include "base/metrics/field_trial.h"
13 #include "base/run_loop.h" 13 #include "base/run_loop.h"
14 #include "base/single_thread_task_runner.h" 14 #include "base/single_thread_task_runner.h"
15 #include "base/strings/string_number_conversions.h" 15 #include "base/strings/string_number_conversions.h"
16 #include "base/test/histogram_tester.h"
16 #include "base/thread_task_runner_handle.h" 17 #include "base/thread_task_runner_handle.h"
17 #include "chrome/browser/android/data_usage/data_use_tab_model_test_utils.h" 18 #include "chrome/browser/android/data_usage/data_use_tab_model_test_utils.h"
18 #include "components/data_usage/core/data_use.h" 19 #include "components/data_usage/core/data_use.h"
19 #include "components/data_usage/core/data_use_aggregator.h" 20 #include "components/data_usage/core/data_use_aggregator.h"
20 #include "components/data_usage/core/data_use_amortizer.h" 21 #include "components/data_usage/core/data_use_amortizer.h"
21 #include "components/data_usage/core/data_use_annotator.h" 22 #include "components/data_usage/core/data_use_annotator.h"
22 #include "components/variations/variations_associated_data.h" 23 #include "components/variations/variations_associated_data.h"
23 #include "content/public/browser/browser_thread.h" 24 #include "content/public/browser/browser_thread.h"
24 #include "content/public/test/test_browser_thread_bundle.h" 25 #include "content/public/test/test_browser_thread_bundle.h"
25 #include "net/base/network_change_notifier.h" 26 #include "net/base/network_change_notifier.h"
(...skipping 18 matching lines...) Expand all
44 external_data_use_observer_.reset(new ExternalDataUseObserver( 45 external_data_use_observer_.reset(new ExternalDataUseObserver(
45 data_use_aggregator_.get(), io_task_runner_.get(), 46 data_use_aggregator_.get(), io_task_runner_.get(),
46 ui_task_runner_.get())); 47 ui_task_runner_.get()));
47 test_data_use_tab_model_ = new TestDataUseTabModel( 48 test_data_use_tab_model_ = new TestDataUseTabModel(
48 external_data_use_observer_.get(), ui_task_runner_.get()); 49 external_data_use_observer_.get(), ui_task_runner_.get());
49 external_data_use_observer_->data_use_tab_model_.reset( 50 external_data_use_observer_->data_use_tab_model_.reset(
50 test_data_use_tab_model_); 51 test_data_use_tab_model_);
51 } 52 }
52 53
53 scoped_ptr<ExternalDataUseObserver> Create() const { 54 scoped_ptr<ExternalDataUseObserver> Create() const {
54 return scoped_ptr<ExternalDataUseObserver>(new ExternalDataUseObserver( 55 scoped_ptr<ExternalDataUseObserver> observer(new ExternalDataUseObserver(
55 data_use_aggregator_.get(), io_task_runner_.get(), 56 data_use_aggregator_.get(), io_task_runner_.get(),
56 ui_task_runner_.get())); 57 ui_task_runner_.get()));
58 // |test_data_use_tab_model| is owned by |observer|.
59 TestDataUseTabModel* test_data_use_tab_model(
60 new TestDataUseTabModel(observer.get(), ui_task_runner_.get()));
61 observer->data_use_tab_model_.reset(test_data_use_tab_model);
62 return observer.Pass();
57 } 63 }
58 64
59 ExternalDataUseObserver* external_data_use_observer() const { 65 ExternalDataUseObserver* external_data_use_observer() const {
60 return external_data_use_observer_.get(); 66 return external_data_use_observer_.get();
61 } 67 }
62 68
63 TestDataUseTabModel* test_data_use_tab_model() const { 69 TestDataUseTabModel* test_data_use_tab_model() const {
64 return test_data_use_tab_model_; 70 return test_data_use_tab_model_;
65 } 71 }
66 72
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 labels.push_back("label_1"); 299 labels.push_back("label_1");
294 labels.push_back("label_4"); 300 labels.push_back("label_4");
295 labels.push_back("label_5"); 301 labels.push_back("label_5");
296 external_data_use_observer()->RegisterURLRegexes( 302 external_data_use_observer()->RegisterURLRegexes(
297 std::vector<std::string>(labels.size(), std::string()), 303 std::vector<std::string>(labels.size(), std::string()),
298 std::vector<std::string>(labels.size(), "http://foobar.com"), labels); 304 std::vector<std::string>(labels.size(), "http://foobar.com"), labels);
299 } 305 }
300 306
301 // Verifies that buffer size does not exceed the specified limit. 307 // Verifies that buffer size does not exceed the specified limit.
302 TEST_F(ExternalDataUseObserverTest, BufferSize) { 308 TEST_F(ExternalDataUseObserverTest, BufferSize) {
309 base::HistogramTester histogram_tester;
303 const char kLabel[] = "label"; 310 const char kLabel[] = "label";
304 311
305 std::vector<std::string> url_regexes; 312 std::vector<std::string> url_regexes;
306 url_regexes.push_back( 313 url_regexes.push_back(
307 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*"); 314 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
308 315
309 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread( 316 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread(
310 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, 317 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
311 std::vector<std::string>(url_regexes.size(), kLabel)); 318 std::vector<std::string>(url_regexes.size(), kLabel));
312 319
(...skipping 15 matching lines...) Expand all
328 // Verify that total buffered bytes is computed correctly. 335 // Verify that total buffered bytes is computed correctly.
329 EXPECT_EQ(static_cast<int64_t>(ExternalDataUseObserver::kMaxBufferSize * 336 EXPECT_EQ(static_cast<int64_t>(ExternalDataUseObserver::kMaxBufferSize *
330 (bytes_downloaded + bytes_uploaded)), 337 (bytes_downloaded + bytes_uploaded)),
331 external_data_use_observer()->total_bytes_buffered_); 338 external_data_use_observer()->total_bytes_buffered_);
332 EXPECT_EQ(ExternalDataUseObserver::kMaxBufferSize, 339 EXPECT_EQ(ExternalDataUseObserver::kMaxBufferSize,
333 buffered_data_reports().size()); 340 buffered_data_reports().size());
334 341
335 // Verify the label of the data use report. 342 // Verify the label of the data use report.
336 for (const auto& it : buffered_data_reports()) 343 for (const auto& it : buffered_data_reports())
337 EXPECT_EQ(kLabel, it.first.label); 344 EXPECT_EQ(kLabel, it.first.label);
345
346 // Verify that metrics were updated correctly for the lost reports.
347 histogram_tester.ExpectTotalCount(
348 "DataUsage.ReportSubmissionResult",
349 ExternalDataUseObserver::kMaxBufferSize - 1);
sclittle 2015/12/02 19:07:55 nit: If these are all the same sample (e.g. the sa
tbansal1 2015/12/03 03:19:45 Done.
350 histogram_tester.ExpectBucketCount(
351 "DataUsage.ReportSubmissionResult", 3,
352 ExternalDataUseObserver::kMaxBufferSize - 1);
353 histogram_tester.ExpectTotalCount(
354 "DataUsage.ReportSubmission.Lost.Bytes",
355 ExternalDataUseObserver::kMaxBufferSize - 1);
sclittle 2015/12/02 19:07:54 Can you also test the samples in this histogram?
tbansal1 2015/12/03 03:19:45 Done.
338 } 356 }
339 357
340 // Tests that buffered data use reports are merged correctly. 358 // Tests that buffered data use reports are merged correctly.
341 TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) { 359 TEST_F(ExternalDataUseObserverTest, ReportsMergedCorrectly) {
342 const char kLabel[] = "label"; 360 const char kLabel[] = "label";
343 361
344 std::vector<std::string> url_regexes; 362 std::vector<std::string> url_regexes;
345 url_regexes.push_back( 363 url_regexes.push_back(
346 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*"); 364 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
347 365
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 467
450 std::vector<std::string> app_package_names; 468 std::vector<std::string> app_package_names;
451 const char kAppFoo[] = "com.example.foo"; 469 const char kAppFoo[] = "com.example.foo";
452 const char kAppBar[] = "com.example.bar"; 470 const char kAppBar[] = "com.example.bar";
453 app_package_names.push_back(kAppFoo); 471 app_package_names.push_back(kAppFoo);
454 app_package_names.push_back(kAppBar); 472 app_package_names.push_back(kAppBar);
455 473
456 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread( 474 external_data_use_observer()->FetchMatchingRulesDoneOnIOThread(
457 app_package_names, url_regexes, labels); 475 app_package_names, url_regexes, labels);
458 EXPECT_EQ(0U, external_data_use_observer()->buffered_data_reports_.size()); 476 EXPECT_EQ(0U, external_data_use_observer()->buffered_data_reports_.size());
459 EXPECT_FALSE(external_data_use_observer()->submit_data_report_pending_); 477 EXPECT_TRUE(
478 external_data_use_observer()->last_data_report_submitted_.is_null());
460 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_); 479 EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_);
461 480
462 // Check |kLabelFoo| matching rule. 481 // Check |kLabelFoo| matching rule.
463 data_usage::DataUse data_foo_1( 482 data_usage::DataUse data_foo_1(
464 GURL("http://www.foo.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 483 GURL("http://www.foo.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0,
465 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_1", 484 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_1",
466 external_data_use_observer()->data_use_report_min_bytes_, 0); 485 external_data_use_observer()->data_use_report_min_bytes_, 0);
467 external_data_use_observer()->OnDataUse(data_foo_1); 486 external_data_use_observer()->OnDataUse(data_foo_1);
468 data_usage::DataUse data_foo_2( 487 data_usage::DataUse data_foo_2(
469 GURL("http://www.foo.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 488 GURL("http://www.foo.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0,
470 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_2", 489 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_2",
471 external_data_use_observer()->data_use_report_min_bytes_, 0); 490 external_data_use_observer()->data_use_report_min_bytes_, 0);
472 external_data_use_observer()->OnDataUse(data_foo_2); 491 external_data_use_observer()->OnDataUse(data_foo_2);
473 492
474 // The foo1 report should have been submitted. 493 // The foo1 report should have been submitted.
475 EXPECT_TRUE(external_data_use_observer()->submit_data_report_pending_); 494 EXPECT_FALSE(
495 external_data_use_observer()->last_data_report_submitted_.is_null());
476 496
477 // Only the foo2 report should be present. 497 // Only the foo2 report should be present.
478 EXPECT_EQ(1U, buffered_data_reports().size()); 498 EXPECT_EQ(1U, buffered_data_reports().size());
479 const ExternalDataUseObserver::DataUseReportKey key_foo_2( 499 const ExternalDataUseObserver::DataUseReportKey key_foo_2(
480 kLabelFoo, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_2"); 500 kLabelFoo, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_2");
481 EXPECT_NE(buffered_data_reports().end(), 501 EXPECT_NE(buffered_data_reports().end(),
482 buffered_data_reports().find(key_foo_2)); 502 buffered_data_reports().find(key_foo_2));
483 503
484 // Check |kLabelBar| matching rule. 504 // Check |kLabelBar| matching rule.
485 data_usage::DataUse data_bar( 505 data_usage::DataUse data_bar(
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 621
602 for (size_t i = 0; i < num_iterations; ++i) { 622 for (size_t i = 0; i < num_iterations; ++i) {
603 data_usage::DataUse data_use_foo( 623 data_usage::DataUse data_use_foo(
604 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0, 624 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0,
605 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", 1024, 0); 625 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", 1024, 0);
606 external_data_use_observer()->OnDataUse(data_use_foo); 626 external_data_use_observer()->OnDataUse(data_use_foo);
607 627
608 if (i != num_iterations - 1) { 628 if (i != num_iterations - 1) {
609 // Total buffered bytes is less than the minimum threshold. Data use 629 // Total buffered bytes is less than the minimum threshold. Data use
610 // report should not be send. 630 // report should not be send.
611 EXPECT_FALSE(external_data_use_observer()->submit_data_report_pending_); 631 EXPECT_TRUE(
632 external_data_use_observer()->last_data_report_submitted_.is_null());
612 EXPECT_EQ(static_cast<int64_t>(i + 1), 633 EXPECT_EQ(static_cast<int64_t>(i + 1),
613 external_data_use_observer()->total_bytes_buffered_ / 1024); 634 external_data_use_observer()->total_bytes_buffered_ / 1024);
635 EXPECT_EQ(0, external_data_use_observer()->pending_report_bytes_);
614 636
615 } else { 637 } else {
616 // Total bytes is at least the minimum threshold. This should trigger 638 // Total bytes is at least the minimum threshold. This should trigger
617 // submitting of the buffered data use report. 639 // submitting of the buffered data use report.
618 EXPECT_TRUE(external_data_use_observer()->submit_data_report_pending_); 640 EXPECT_FALSE(
641 external_data_use_observer()->last_data_report_submitted_.is_null());
619 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_); 642 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_);
620 } 643 }
621 } 644 }
622 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_); 645 EXPECT_EQ(0, external_data_use_observer()->total_bytes_buffered_);
646 EXPECT_EQ(static_cast<int64_t>(num_iterations),
647 external_data_use_observer()->pending_report_bytes_ / 1024);
648
649 base::HistogramTester histogram_tester;
650 external_data_use_observer()->OnReportDataUseDoneOnIOThread(true);
651
652 // Verify that metrics were updated correctly for the report that was
653 // successfully submitted.
654 histogram_tester.ExpectTotalCount("DataUsage.ReportSubmissionResult", 1);
655 histogram_tester.ExpectBucketCount("DataUsage.ReportSubmissionResult", 0, 1);
656 histogram_tester.ExpectTotalCount(
657 "DataUsage.ReportSubmission.Successful.Bytes", 1);
sclittle 2015/12/02 19:07:55 nit: Can you check the sample for this histogram a
tbansal1 2015/12/03 03:19:45 Done.
658
659 // Verify that metrics were updated correctly for the report that was not
660 // successfully submitted.
661 external_data_use_observer()->OnDataUse(data_usage::DataUse(
662 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0,
663 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", 1024 * 1024,
664 0));
665 external_data_use_observer()->OnReportDataUseDoneOnIOThread(false);
666 histogram_tester.ExpectTotalCount("DataUsage.ReportSubmissionResult", 2);
667 histogram_tester.ExpectBucketCount("DataUsage.ReportSubmissionResult", 1, 1);
668 histogram_tester.ExpectTotalCount("DataUsage.ReportSubmission.Failed.Bytes",
669 1);
623 } 670 }
624 671
625 // Tests if the parameters from the field trial are populated correctly. 672 // Tests if the parameters from the field trial are populated correctly.
626 TEST_F(ExternalDataUseObserverTest, Variations) { 673 TEST_F(ExternalDataUseObserverTest, Variations) {
627 EXPECT_EQ(base::TimeDelta::FromSeconds(60 * 15), 674 EXPECT_EQ(base::TimeDelta::FromSeconds(60 * 15),
628 external_data_use_observer()->fetch_matching_rules_duration_); 675 external_data_use_observer()->fetch_matching_rules_duration_);
629 EXPECT_EQ(100 * 1024, 676 EXPECT_EQ(100 * 1024,
630 external_data_use_observer()->data_use_report_min_bytes_); 677 external_data_use_observer()->data_use_report_min_bytes_);
631 678
632 variations::testing::ClearAllVariationParams(); 679 variations::testing::ClearAllVariationParams();
633 std::map<std::string, std::string> variation_params; 680 std::map<std::string, std::string> variation_params;
634 681
635 const int kFetchMatchingRulesDurationSeconds = 10000; 682 const int kFetchMatchingRulesDurationSeconds = 10000;
683 const int kDefaultMaxDataReportSubmitWaitSeconds = 20000;
636 const int64_t kDataUseReportMinBytes = 5000; 684 const int64_t kDataUseReportMinBytes = 5000;
637 variation_params["fetch_matching_rules_duration_seconds"] = 685 variation_params["fetch_matching_rules_duration_seconds"] =
638 base::Int64ToString(kFetchMatchingRulesDurationSeconds); 686 base::Int64ToString(kFetchMatchingRulesDurationSeconds);
687 variation_params["data_report_submit_timeout_seconds"] =
688 base::Int64ToString(kDefaultMaxDataReportSubmitWaitSeconds);
639 variation_params["data_use_report_min_bytes"] = 689 variation_params["data_use_report_min_bytes"] =
640 base::Int64ToString(kDataUseReportMinBytes); 690 base::Int64ToString(kDataUseReportMinBytes);
641 691
642 ASSERT_TRUE(variations::AssociateVariationParams( 692 ASSERT_TRUE(variations::AssociateVariationParams(
643 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled", 693 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled",
644 variation_params)); 694 variation_params));
645 695
646 base::FieldTrialList field_trial_list(nullptr); 696 base::FieldTrialList field_trial_list(nullptr);
647 697
648 base::FieldTrialList::CreateFieldTrial( 698 base::FieldTrialList::CreateFieldTrial(
649 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled"); 699 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled");
650 700
651 // Create another ExternalDataUseObserver object. This would fetch variation 701 // Create another ExternalDataUseObserver object. This would fetch variation
652 // params. 702 // params.
653 scoped_ptr<ExternalDataUseObserver> 703 scoped_ptr<ExternalDataUseObserver>
654 external_data_use_obsever_with_variations = Create(); 704 external_data_use_obsever_with_variations = Create();
655 EXPECT_EQ(base::TimeDelta::FromSeconds(kFetchMatchingRulesDurationSeconds), 705 EXPECT_EQ(base::TimeDelta::FromSeconds(kFetchMatchingRulesDurationSeconds),
656 external_data_use_obsever_with_variations 706 external_data_use_obsever_with_variations
657 ->fetch_matching_rules_duration_); 707 ->fetch_matching_rules_duration_);
658 EXPECT_EQ( 708 EXPECT_EQ(
709 base::TimeDelta::FromSeconds(kDefaultMaxDataReportSubmitWaitSeconds),
710 external_data_use_obsever_with_variations->data_report_submit_timeout_);
711 EXPECT_EQ(
659 kDataUseReportMinBytes, 712 kDataUseReportMinBytes,
660 external_data_use_obsever_with_variations->data_use_report_min_bytes_); 713 external_data_use_obsever_with_variations->data_use_report_min_bytes_);
661 } 714 }
662 715
716 // Tests if the metrics are recorded correctly.
717 TEST_F(ExternalDataUseObserverTest, DataUseReportTimedOut) {
718 variations::testing::ClearAllVariationParams();
719 std::map<std::string, std::string> variation_params;
720 variation_params["data_report_submit_timeout_seconds"] = "0";
721 variation_params["data_use_report_min_bytes"] = "0";
722
723 ASSERT_TRUE(variations::AssociateVariationParams(
724 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled",
725 variation_params));
726
727 base::FieldTrialList field_trial_list(nullptr);
728
729 base::FieldTrialList::CreateFieldTrial(
730 ExternalDataUseObserver::kExternalDataUseObserverFieldTrial, "Enabled");
731
732 // Create another ExternalDataUseObserver object. This would fetch variation
733 // params.
734 scoped_ptr<ExternalDataUseObserver>
735 external_data_use_obsever_with_variations = Create();
736
737 std::vector<std::string> url_regexes;
738 url_regexes.push_back(
739 "http://www[.]google[.]com/#q=.*|https://www[.]google[.]com/#q=.*");
740 external_data_use_obsever_with_variations->FetchMatchingRulesDoneOnIOThread(
741 std::vector<std::string>(url_regexes.size(), std::string()), url_regexes,
742 std::vector<std::string>(url_regexes.size(), "label"));
743
744 base::HistogramTester histogram_tester;
745 external_data_use_obsever_with_variations->data_use_tab_model()
746 ->OnNavigationEvent(0, DataUseTabModel::TRANSITION_OMNIBOX_SEARCH,
747 GURL("http://www.google.com/#q=abc"), std::string());
748 external_data_use_obsever_with_variations->OnDataUse(data_usage::DataUse(
749 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0,
750 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_foo", 1024 * 1024,
751 0));
752 external_data_use_obsever_with_variations->OnDataUse(data_usage::DataUse(
753 GURL("http://www.google.com/#q=abc"), base::TimeTicks::Now(), GURL(), 0,
754 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, "mccmnc_bar", 1024 * 1024,
755 0));
756 histogram_tester.ExpectTotalCount("DataUsage.ReportSubmissionResult", 1);
sclittle 2015/12/02 19:07:55 nit: you could get rid of the ExpectTotalCount her
tbansal1 2015/12/03 03:19:45 Done.
757 // First data use report should be marked as timed out.
758 histogram_tester.ExpectBucketCount("DataUsage.ReportSubmissionResult", 2, 1);
759 }
760
663 } // namespace android 761 } // namespace android
664 762
665 } // namespace chrome 763 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698