// 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 "core/frame/csp/MediaListDirective.h"

#include "core/frame/csp/ContentSecurityPolicy.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace blink {

class MediaListDirectiveTest : public ::testing::Test {
 public:
  MediaListDirectiveTest() : csp(ContentSecurityPolicy::create()) {}

 protected:
  Persistent<ContentSecurityPolicy> csp;
};

TEST_F(MediaListDirectiveTest, GetIntersect) {
  MediaListDirective A(
      "plugin-types",
      "application/x-shockwave-flash application/pdf text/plain", csp.get());
  MediaListDirective emptyA("plugin-types", "", csp.get());

  struct TestCase {
    const char* policyB;
    const std::vector<const char*> expected;
  } cases[] = {
      {"", std::vector<const char*>()},
      {"text/", std::vector<const char*>()},
      {"text/*", std::vector<const char*>()},
      {"*/plain", std::vector<const char*>()},
      {"text/plain */plain", {"text/plain"}},
      {"text/plain application/*", {"text/plain"}},
      {"text/plain", {"text/plain"}},
      {"application/pdf", {"application/pdf"}},
      {"application/x-shockwave-flash", {"application/x-shockwave-flash"}},
      {"application/x-shockwave-flash text/plain",
       {"application/x-shockwave-flash", "text/plain"}},
      {"application/pdf text/plain", {"text/plain", "application/pdf"}},
      {"application/x-shockwave-flash application/pdf text/plain",
       {"application/x-shockwave-flash", "application/pdf", "text/plain"}},
  };

  for (const auto& test : cases) {
    MediaListDirective B("plugin-types", test.policyB, csp.get());

    HashSet<String> result = A.getIntersect(B.m_pluginTypes);
    EXPECT_EQ(result.size(), test.expected.size());

    for (const auto& type : test.expected)
      EXPECT_TRUE(result.contains(type));

    // If we change the order of `A` and `B`, intersection should not change.
    result = B.getIntersect(A.m_pluginTypes);
    EXPECT_EQ(result.size(), test.expected.size());

    for (const auto& type : test.expected)
      EXPECT_TRUE(result.contains(type));

    // When `A` is empty, there should not be any intersection.
    result = emptyA.getIntersect(B.m_pluginTypes);
    EXPECT_FALSE(result.size());
  }
}

TEST_F(MediaListDirectiveTest, Subsumes) {
  MediaListDirective A(
      "plugin-types",
      "application/x-shockwave-flash application/pdf text/plain text/*",
      csp.get());

  struct TestCase {
    const std::vector<const char*> policiesB;
    bool subsumed;
    bool subsumedByEmptyA;
  } cases[] = {
      // `A` subsumes `policiesB`.
      {{""}, true, true},
      {{"text/"}, true, true},
      {{"text/*"}, true, false},
      {{"application/*"}, false, false},
      {{"application/"}, true, true},
      {{"*/plain"}, false, false},
      {{"application"}, true, true},
      {{"text/plain"}, true, false},
      {{"application/pdf"}, true, false},
      {{"application/x-shockwave-flash"}, true, false},
      {{"application/x-shockwave-flash text/plain"}, true, false},
      {{"application/pdf text/plain"}, true, false},
      {{"application/x-shockwave-flash text/plain application/pdf"},
       true,
       false},
      {{"application/x-shockwave-flash text "}, true, false},
      {{"text/* application/x-shockwave-flash"}, true, false},
      {{"application/ application/x-shockwave-flash"}, true, false},
      {{"*/plain application/x-shockwave-flash"}, false, false},
      {{"text/ application/x-shockwave-flash"}, true, false},
      {{"application application/x-shockwave-flash"}, true, false},
      {{"application/x-shockwave-flash text/plain "
        "application/x-blink-test-plugin",
        "application/x-shockwave-flash text/plain"},
       true,
       false},
      {{"application/x-shockwave-flash text/plain "
        "application/x-blink-test-plugin",
        "text/plain"},
       true,
       false},
      {{"application/x-blink-test-plugin", "text/plain"}, true, true},
      {{"application/x-shockwave-flash",
        "text/plain application/x-shockwave-flash"},
       true,
       false},
      {{"application/x-shockwave-flash text/plain",
        "application/x-blink-test-plugin", "text/plain"},
       true,
       true},
      // `A` does not subsumes `policiesB`.
      {std::vector<const char*>(), false, false},
      {{"application/x-blink-test-plugin"}, false, false},
      {{"application/x-shockwave-flash text/plain "
        "application/x-blink-test-plugin"},
       false,
       false},
      {{"application/x-shockwave-flash text application/x-blink-test-plugin"},
       false,
       false},
      {{"application/x-invalid-type text application/"}, false, false},
      {{"application/x-blink-test-plugin text application/",
        "application/x-blink-test-plugin"},
       false,
       false},
  };

  MediaListDirective emptyA("plugin-types", "", csp.get());

  for (const auto& test : cases) {
    HeapVector<Member<MediaListDirective>> policiesB;
    for (const auto& policy : test.policiesB) {
      policiesB.append(
          new MediaListDirective("plugin-types", policy, csp.get()));
    }

    EXPECT_EQ(A.subsumes(policiesB), test.subsumed);
    EXPECT_EQ(emptyA.subsumes(policiesB), test.subsumedByEmptyA);
  }
}

}  // namespace blink
