// Copyright 2015 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 "third_party/blink/renderer/core/html/parser/html_resource_preloader.h"

#include <memory>
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/core/html/parser/preload_request.h"
#include "third_party/blink/renderer/core/testing/page_test_base.h"

namespace blink {

struct HTMLResourcePreconnectTestCase {
  const char* base_url;
  const char* url;
  bool is_cors;
  bool is_https;
};

class PreloaderNetworkHintsMock : public NetworkHintsInterface {
 public:
  PreloaderNetworkHintsMock() : did_preconnect_(false) {}

  void DnsPrefetchHost(const String& host) const override {}
  void PreconnectHost(
      const KURL& host,
      const CrossOriginAttributeValue cross_origin) const override {
    did_preconnect_ = true;
    is_https_ = host.ProtocolIs("https");
    is_cross_origin_ = (cross_origin == kCrossOriginAttributeAnonymous);
  }

  bool DidPreconnect() { return did_preconnect_; }
  bool IsHTTPS() { return is_https_; }
  bool IsCrossOrigin() { return is_cross_origin_; }

 private:
  mutable bool did_preconnect_;
  mutable bool is_https_;
  mutable bool is_cross_origin_;
};

class HTMLResourcePreloaderTest : public PageTestBase {
 protected:
  void SetUp() override { PageTestBase::SetUp(IntSize()); }

  void Test(HTMLResourcePreconnectTestCase test_case) {
    // TODO(yoav): Need a mock loader here to verify things are happenning
    // beyond preconnect.
    PreloaderNetworkHintsMock network_hints;
    auto preload_request = PreloadRequest::CreateIfNeeded(
        String(), TextPosition(), test_case.url, KURL(test_case.base_url),
        ResourceType::kImage, network::mojom::ReferrerPolicy(),
        PreloadRequest::kDocumentIsReferrer, ResourceFetcher::kImageNotImageSet,
        FetchParameters::ResourceWidth(), ClientHintsPreferences(),
        PreloadRequest::kRequestTypePreconnect);
    DCHECK(preload_request);
    if (test_case.is_cors)
      preload_request->SetCrossOrigin(kCrossOriginAttributeAnonymous);
    HTMLResourcePreloader* preloader =
        HTMLResourcePreloader::Create(GetDocument());
    preloader->Preload(std::move(preload_request), network_hints);
    ASSERT_TRUE(network_hints.DidPreconnect());
    ASSERT_EQ(test_case.is_cors, network_hints.IsCrossOrigin());
    ASSERT_EQ(test_case.is_https, network_hints.IsHTTPS());
  }
};

TEST_F(HTMLResourcePreloaderTest, testPreconnect) {
  HTMLResourcePreconnectTestCase test_cases[] = {
      {"http://example.test", "http://example.com", false, false},
      {"http://example.test", "http://example.com", true, false},
      {"http://example.test", "https://example.com", true, true},
      {"http://example.test", "https://example.com", false, true},
      {"http://example.test", "//example.com", false, false},
      {"http://example.test", "//example.com", true, false},
      {"https://example.test", "//example.com", false, true},
      {"https://example.test", "//example.com", true, true},
  };

  for (const auto& test_case : test_cases)
    Test(test_case);
}

}  // namespace blink
