// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/test/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "components/page_load_metrics/browser/page_load_metrics_observer.h"
#include "components/page_load_metrics/browser/page_load_tracker.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "weblayer/browser/page_load_metrics_initialize.h"
#include "weblayer/browser/profile_impl.h"
#include "weblayer/test/weblayer_browser_test.h"
#include "weblayer/test/weblayer_browser_test_utils.h"

namespace weblayer {

using PageLoadMetricsBrowserTest = WebLayerBrowserTest;

class PageLoadMetricsObserver
    : public page_load_metrics::PageLoadMetricsObserver {
 public:
  explicit PageLoadMetricsObserver(base::RepeatingClosure quit_closure)
      : quit_closure_(quit_closure) {}
  ~PageLoadMetricsObserver() override = default;

  // page_load_metrics::PageLoadMetricsObserver implementation:
  void OnFirstContentfulPaintInPage(
      const page_load_metrics::mojom::PageLoadTiming& timing) override {
    quit_closure_.Run();
  }

 private:
  base::RepeatingClosure quit_closure_;
};

IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, Heartbeat) {
  base::HistogramTester histogram_tester;
  ASSERT_TRUE(embedded_test_server()->Start());

  base::RunLoop run_loop;

  auto callback = base::BindLambdaForTesting(
      [&](page_load_metrics::PageLoadTracker* tracker) {
        tracker->AddObserver(
            std::make_unique<PageLoadMetricsObserver>(run_loop.QuitClosure()));

        // Don't need this anymore
        SetRegisterEmbedderObserversForTesting(nullptr);
      });
  SetRegisterEmbedderObserversForTesting(&callback);

  NavigateAndWaitForCompletion(
      embedded_test_server()->GetURL("/simple_page.html"), shell());

  run_loop.Run();

  histogram_tester.ExpectTotalCount(
      "PageLoad.PaintTiming.NavigationToFirstPaint", 1);
  histogram_tester.ExpectTotalCount(
      "PageLoad.PaintTiming.NavigationToFirstContentfulPaint", 1);
}

IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, UserCounter) {
  base::HistogramTester histogram_tester;
  ASSERT_TRUE(embedded_test_server()->Start());

  NavigateAndWaitForCompletion(embedded_test_server()->GetURL("/form.html"),
                               shell());
  NavigateAndWaitForCompletion(GURL("about:blank"), shell());  // Flush.

  histogram_tester.ExpectBucketCount("Blink.UseCounter.MainFrame.Features",
                                     blink::mojom::WebFeature::kPageVisits, 1);
  histogram_tester.ExpectBucketCount("Blink.UseCounter.Features",
                                     blink::mojom::WebFeature::kFormElement, 1);
}

}  // namespace weblayer
