// Copyright 2013 The Flutter 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 "flutter/shell/platform/common/cpp/engine_switches.h"

#include "gtest/gtest.h"

namespace flutter {

namespace {
// Sets |key=value| in the environment of this process.
void SetEnvironmentVariable(const char* key, const char* value) {
#ifdef _WIN32
  _putenv_s(key, value);
#else
  setenv(key, value, 1);
#endif
}

// Removes |key| from the environment of this process, if present.
void ClearEnvironmentVariable(const char* key) {
#ifdef _WIN32
  _putenv_s(key, "");
#else
  unsetenv(key);
#endif
}
}  // namespace

TEST(FlutterProjectBundle, SwitchesEmpty) {
  // Clear the main environment variable, since test order is not guaranteed.
  ClearEnvironmentVariable("FLUTTER_ENGINE_SWITCHES");

  EXPECT_EQ(GetSwitchesFromEnvironment().size(), 0U);
}

#ifdef FLUTTER_RELEASE
TEST(FlutterProjectBundle, SwitchesIgnoredInRelease) {
  SetEnvironmentVariable("FLUTTER_ENGINE_SWITCHES", "2");
  SetEnvironmentVariable("FLUTTER_ENGINE_SWITCH_1", "abc");
  SetEnvironmentVariable("FLUTTER_ENGINE_SWITCH_2", "foo=\"bar, baz\"");

  std::vector<std::string> switches = GetSwitchesFromEnvironment();
  EXPECT_EQ(switches.size(), 0U);
}
#endif  // FLUTTER_RELEASE

#ifndef FLUTTER_RELEASE
TEST(FlutterProjectBundle, Switches) {
  SetEnvironmentVariable("FLUTTER_ENGINE_SWITCHES", "2");
  SetEnvironmentVariable("FLUTTER_ENGINE_SWITCH_1", "abc");
  SetEnvironmentVariable("FLUTTER_ENGINE_SWITCH_2", "foo=\"bar, baz\"");

  std::vector<std::string> switches = GetSwitchesFromEnvironment();
  EXPECT_EQ(switches.size(), 2U);
  EXPECT_EQ(switches[0], "--abc");
  EXPECT_EQ(switches[1], "--foo=\"bar, baz\"");
}

TEST(FlutterProjectBundle, SwitchesExtraValues) {
  SetEnvironmentVariable("FLUTTER_ENGINE_SWITCHES", "1");
  SetEnvironmentVariable("FLUTTER_ENGINE_SWITCH_1", "abc");
  SetEnvironmentVariable("FLUTTER_ENGINE_SWITCH_2", "foo=\"bar, baz\"");

  std::vector<std::string> switches = GetSwitchesFromEnvironment();
  EXPECT_EQ(switches.size(), 1U);
  EXPECT_EQ(switches[0], "--abc");
}

TEST(FlutterProjectBundle, SwitchesMissingValues) {
  SetEnvironmentVariable("FLUTTER_ENGINE_SWITCHES", "4");
  SetEnvironmentVariable("FLUTTER_ENGINE_SWITCH_1", "abc");
  SetEnvironmentVariable("FLUTTER_ENGINE_SWITCH_2", "foo=\"bar, baz\"");
  ClearEnvironmentVariable("FLUTTER_ENGINE_SWITCH_3");
  SetEnvironmentVariable("FLUTTER_ENGINE_SWITCH_4", "oops");

  std::vector<std::string> switches = GetSwitchesFromEnvironment();
  EXPECT_EQ(switches.size(), 3U);
  EXPECT_EQ(switches[0], "--abc");
  EXPECT_EQ(switches[1], "--foo=\"bar, baz\"");
  // The missing switch should be skipped, leaving SWITCH_4 as the third
  // switch in the array.
  EXPECT_EQ(switches[2], "--oops");
}
#endif  // !FLUTTER_RELEASE

}  // namespace flutter
