// Copyright (c) 2011 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 <gtest/gtest.h>

#include "chrome/renderer/plugins/plugin_uma.h"

class PluginUMATest : public testing::Test {
 public:
  static void ExpectPluginType(
      PluginUMAReporter::PluginType expected_plugin_type,
      const std::string& plugin_mime_type,
      const GURL& plugin_src) {
    EXPECT_EQ(expected_plugin_type,
              PluginUMAReporter::GetInstance()->GetPluginType(plugin_mime_type,
                                                              plugin_src));
  }
};

TEST_F(PluginUMATest, WindowsMediaPlayer) {
  ExpectPluginType(PluginUMAReporter::WINDOWS_MEDIA_PLAYER,
                   "application/x-mplayer2",
                   GURL("file://some_file.mov"));
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
                   "application/x-mplayer2-some_sufix",
                   GURL("file://some_file.mov"));
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
                   "some-prefix-application/x-mplayer2",
                   GURL("file://some_file.mov"));
}

TEST_F(PluginUMATest, Silverlight) {
  ExpectPluginType(PluginUMAReporter::SILVERLIGHT,
                   "application/x-silverlight",
                   GURL("aaaa"));
  ExpectPluginType(PluginUMAReporter::SILVERLIGHT,
                   "application/x-silverlight-some-sufix",
                   GURL("aaaa"));
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
                   "some-prefix-application/x-silverlight",
                   GURL("aaaa"));
}

TEST_F(PluginUMATest, RealPlayer) {
  ExpectPluginType(
      PluginUMAReporter::REALPLAYER, "audio/x-pn-realaudio", GURL("some url"));
  ExpectPluginType(PluginUMAReporter::REALPLAYER,
                   "audio/x-pn-realaudio-some-sufix",
                   GURL("some url"));
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
                   "some-prefix-audio/x-pn-realaudio",
                   GURL("some url"));
}

TEST_F(PluginUMATest, Java) {
  ExpectPluginType(
      PluginUMAReporter::JAVA, "application/x-java-applet", GURL("some url"));
  ExpectPluginType(PluginUMAReporter::JAVA,
                   "application/x-java-applet-some-sufix",
                   GURL("some url"));
  ExpectPluginType(PluginUMAReporter::JAVA,
                   "some-prefix-application/x-java-applet-sufix",
                   GURL("some url"));
}

TEST_F(PluginUMATest, QuickTime) {
  ExpectPluginType(
      PluginUMAReporter::QUICKTIME, "video/quicktime", GURL("some url"));
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
                   "video/quicktime-sufix",
                   GURL("some url"));
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
                   "prefix-video/quicktime",
                   GURL("some url"));
}

TEST_F(PluginUMATest, BrowserPlugin) {
  ExpectPluginType(PluginUMAReporter::BROWSER_PLUGIN,
                   "application/browser-plugin",
                   GURL("some url"));
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
                   "application/browser-plugin-sufix",
                   GURL("some url"));
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
                   "prefix-application/browser-plugin",
                   GURL("some url"));
}

TEST_F(PluginUMATest, ShockwaveFlash) {
  ExpectPluginType(PluginUMAReporter::SHOCKWAVE_FLASH,
                   "application/x-shockwave-flash",
                   GURL("some url"));
  ExpectPluginType(PluginUMAReporter::SHOCKWAVE_FLASH,
                   "application/futuresplash",
                   GURL("some url"));
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
                   "application/x-futuresplash",
                   GURL("some url"));
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
                   "application/shockwave-flash",
                   GURL("some url"));
}

TEST_F(PluginUMATest, WidevineCdm) {
#if defined(ENABLE_PEPPER_CDMS)
  ExpectPluginType(PluginUMAReporter::WIDEVINE_CDM,
#else
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
#endif
                   "application/x-ppapi-widevine-cdm",
                   GURL("some url"));
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
                   "application/x-ppapi-widevine-cdm-sufix",
                   GURL("some url"));
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
                   "prefix-application/x-ppapi-widevine-cdm",
                   GURL("some url"));
}

TEST_F(PluginUMATest, BySrcExtension) {
  ExpectPluginType(
      PluginUMAReporter::QUICKTIME, std::string(), GURL("file://file.mov"));

  // When plugin's mime type is given, we don't check extension.
  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_MIMETYPE,
                   "unknown-plugin",
                   GURL("http://file.mov"));

  ExpectPluginType(PluginUMAReporter::WINDOWS_MEDIA_PLAYER,
                   std::string(),
                   GURL("file://file.asx"));
  ExpectPluginType(
      PluginUMAReporter::REALPLAYER, std::string(), GURL("file://file.rm"));
  ExpectPluginType(PluginUMAReporter::QUICKTIME,
                   std::string(),
                   GURL("http://aaa/file.mov?x=aaaa&y=b#c"));
  ExpectPluginType(PluginUMAReporter::QUICKTIME,
                   std::string(),
                   GURL("http://file.mov?x=aaaa&y=b#c"));
  ExpectPluginType(PluginUMAReporter::SHOCKWAVE_FLASH,
                   std::string(),
                   GURL("http://file.swf?x=aaaa&y=b#c"));
  ExpectPluginType(PluginUMAReporter::SHOCKWAVE_FLASH,
                   std::string(),
                   GURL("http://file.spl?x=aaaa&y=b#c"));

  ExpectPluginType(PluginUMAReporter::UNSUPPORTED_EXTENSION,
                   std::string(),
                   GURL("http://file.unknown_extension"));
  ExpectPluginType(
      PluginUMAReporter::UNSUPPORTED_EXTENSION, std::string(), GURL("http://"));
  ExpectPluginType(
      PluginUMAReporter::UNSUPPORTED_EXTENSION, std::string(), GURL("mov"));
}

TEST_F(PluginUMATest, CaseSensitivity) {
  ExpectPluginType(
      PluginUMAReporter::QUICKTIME, "video/QUICKTIME", GURL("http://file.aaa"));
  ExpectPluginType(
      PluginUMAReporter::QUICKTIME, std::string(), GURL("http://file.MoV"));
}
