// Copyright (c) 2012 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/command_line.h"
#include "base/stl_util.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
#include "chrome/common/extensions/manifest_tests/chrome_manifest_test.h"
#include "extensions/common/error_utils.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest_constants.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace extensions {

namespace errors = manifest_errors;
namespace keys = manifest_keys;

class AppLaunchManifestTest : public ChromeManifestTest {
};

TEST_F(AppLaunchManifestTest, AppLaunchContainer) {
  scoped_refptr<Extension> extension;

  extension = LoadAndExpectSuccess("launch_tab.json");
  EXPECT_EQ(LAUNCH_CONTAINER_TAB,
            AppLaunchInfo::GetLaunchContainer(extension.get()));

  extension = LoadAndExpectSuccess("launch_panel.json");
  EXPECT_EQ(LAUNCH_CONTAINER_PANEL_DEPRECATED,
            AppLaunchInfo::GetLaunchContainer(extension.get()));

  extension = LoadAndExpectSuccess("launch_default.json");
  EXPECT_EQ(LAUNCH_CONTAINER_TAB,
            AppLaunchInfo::GetLaunchContainer(extension.get()));

  extension = LoadAndExpectSuccess("launch_width.json");
  EXPECT_EQ(640, AppLaunchInfo::GetLaunchWidth(extension.get()));

  extension = LoadAndExpectSuccess("launch_height.json");
  EXPECT_EQ(480, AppLaunchInfo::GetLaunchHeight(extension.get()));

  Testcase testcases[] = {
    Testcase("launch_window.json", errors::kInvalidLaunchContainer),
    Testcase("launch_container_invalid_type.json",
             errors::kInvalidLaunchContainer),
    Testcase("launch_container_invalid_value.json",
             errors::kInvalidLaunchContainer),
    Testcase("launch_container_without_launch_url.json",
             errors::kLaunchURLRequired),
    Testcase("launch_width_invalid.json",
             ErrorUtils::FormatErrorMessage(
                 errors::kInvalidLaunchValueContainer,
                 keys::kLaunchWidth)),
    Testcase("launch_width_negative.json",
             ErrorUtils::FormatErrorMessage(
                 errors::kInvalidLaunchValue,
                 keys::kLaunchWidth)),
    Testcase("launch_height_invalid.json",
             ErrorUtils::FormatErrorMessage(
                 errors::kInvalidLaunchValueContainer,
                 keys::kLaunchHeight)),
    Testcase("launch_height_negative.json",
             ErrorUtils::FormatErrorMessage(
                 errors::kInvalidLaunchValue,
                 keys::kLaunchHeight))
  };
  RunTestcases(testcases, base::size(testcases), EXPECT_TYPE_ERROR);
}

TEST_F(AppLaunchManifestTest, AppLaunchURL) {
  Testcase testcases[] = {
    Testcase("launch_path_and_url.json",
             errors::kLaunchPathAndURLAreExclusive),
    Testcase("launch_path_and_extent.json",
             errors::kLaunchPathAndExtentAreExclusive),
    Testcase("launch_path_invalid_type.json",
             ErrorUtils::FormatErrorMessage(
                 errors::kInvalidLaunchValue,
                 keys::kLaunchLocalPath)),
    Testcase("launch_path_invalid_value.json",
             ErrorUtils::FormatErrorMessage(
                 errors::kInvalidLaunchValue,
                 keys::kLaunchLocalPath)),
    Testcase("launch_path_invalid_localized.json",
             ErrorUtils::FormatErrorMessage(
                 errors::kInvalidLaunchValue,
                 keys::kLaunchLocalPath)),
    Testcase("launch_url_invalid_type_1.json",
             ErrorUtils::FormatErrorMessage(
                 errors::kInvalidLaunchValue,
                 keys::kLaunchWebURL)),
    Testcase("launch_url_invalid_type_2.json",
             ErrorUtils::FormatErrorMessage(
                 errors::kInvalidLaunchValue,
                 keys::kLaunchWebURL)),
    Testcase("launch_url_invalid_type_3.json",
             ErrorUtils::FormatErrorMessage(
                 errors::kInvalidLaunchValue,
                 keys::kLaunchWebURL)),
    Testcase("launch_url_invalid_localized.json",
             ErrorUtils::FormatErrorMessage(
                 errors::kInvalidLaunchValue,
                 keys::kLaunchWebURL))
  };
  RunTestcases(testcases, base::size(testcases), EXPECT_TYPE_ERROR);

  scoped_refptr<Extension> extension;
  extension = LoadAndExpectSuccess("launch_local_path.json");
  EXPECT_EQ(extension->url().spec() + "launch.html",
            AppLaunchInfo::GetFullLaunchURL(extension.get()).spec());

  extension = LoadAndExpectSuccess("launch_local_path_localized.json");
  EXPECT_EQ(extension->url().spec() + "launch.html",
            AppLaunchInfo::GetFullLaunchURL(extension.get()).spec());

  LoadAndExpectError("launch_web_url_relative.json",
                     ErrorUtils::FormatErrorMessage(
                         errors::kInvalidLaunchValue,
                         keys::kLaunchWebURL));

  extension = LoadAndExpectSuccess("launch_web_url_absolute.json");
  EXPECT_EQ(GURL("http://www.google.com/launch.html"),
            AppLaunchInfo::GetFullLaunchURL(extension.get()));
  extension = LoadAndExpectSuccess("launch_web_url_localized.json");
  EXPECT_EQ(GURL("http://www.google.com/launch.html"),
            AppLaunchInfo::GetFullLaunchURL(extension.get()));
}

}  // namespace extensions
