// 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/linux/public/flutter_linux/fl_dart_project.h"

#include <gmodule.h>

#include <cstdlib>

#include "flutter/shell/platform/linux/fl_dart_project_private.h"
#include "gtest/gtest.h"

TEST(FlDartProjectTest, GetPaths) {
  g_autoptr(FlDartProject) project = fl_dart_project_new();
  g_autofree gchar* exe_path = g_file_read_link("/proc/self/exe", nullptr);
  ASSERT_TRUE(exe_path != nullptr);
  g_autofree gchar* dir = g_path_get_dirname(exe_path);
  g_autofree gchar* expected_aot_library_path =
      g_build_filename(dir, "lib", "libapp.so", nullptr);
  EXPECT_STREQ(fl_dart_project_get_aot_library_path(project),
               expected_aot_library_path);
  g_autofree gchar* expected_assets_path =
      g_build_filename(dir, "data", "flutter_assets", nullptr);
  EXPECT_STREQ(fl_dart_project_get_assets_path(project), expected_assets_path);
  g_autofree gchar* expected_icu_data_path =
      g_build_filename(dir, "data", "icudtl.dat", nullptr);
  EXPECT_STREQ(fl_dart_project_get_icu_data_path(project),
               expected_icu_data_path);
}

TEST(FlDartProjectTest, EnableMirrors) {
  g_autoptr(FlDartProject) project = fl_dart_project_new();
  G_GNUC_BEGIN_IGNORE_DEPRECATIONS
  EXPECT_FALSE(fl_dart_project_get_enable_mirrors(project));
  fl_dart_project_set_enable_mirrors(project, TRUE);
  EXPECT_TRUE(fl_dart_project_get_enable_mirrors(project));
  G_GNUC_END_IGNORE_DEPRECATIONS
}

TEST(FlDartProjectTest, DartEntrypointArgs) {
  g_autoptr(FlDartProject) project = fl_dart_project_new();

  char** retrieved_args =
      fl_dart_project_get_dart_entrypoint_arguments(project);

  EXPECT_EQ(retrieved_args, nullptr);

  GPtrArray* args_array = g_ptr_array_new();
  g_ptr_array_add(args_array, const_cast<char*>("arg_one"));
  g_ptr_array_add(args_array, const_cast<char*>("arg_two"));
  g_ptr_array_add(args_array, const_cast<char*>("arg_three"));
  g_ptr_array_add(args_array, nullptr);
  gchar** args = reinterpret_cast<gchar**>(g_ptr_array_free(args_array, false));

  fl_dart_project_set_dart_entrypoint_arguments(project, args);

  retrieved_args = fl_dart_project_get_dart_entrypoint_arguments(project);

  // FlDartProject should have done a deep copy of the args
  EXPECT_NE(retrieved_args, args);

  EXPECT_EQ(g_strv_length(retrieved_args), 3U);
}

TEST(FlDartProjectTest, SwitchesEmpty) {
  g_autoptr(FlDartProject) project = fl_dart_project_new();

  // Clear the main environment variable, since test order is not guaranteed.
  unsetenv("FLUTTER_ENGINE_SWITCHES");

  g_autoptr(GPtrArray) switches = fl_dart_project_get_switches(project);

  EXPECT_EQ(switches->len, 0U);
}

#ifndef FLUTTER_RELEASE
TEST(FlDartProjectTest, Switches) {
  g_autoptr(FlDartProject) project = fl_dart_project_new();

  setenv("FLUTTER_ENGINE_SWITCHES", "2", 1);
  setenv("FLUTTER_ENGINE_SWITCH_1", "abc", 1);
  setenv("FLUTTER_ENGINE_SWITCH_2", "foo=\"bar, baz\"", 1);

  g_autoptr(GPtrArray) switches = fl_dart_project_get_switches(project);
  EXPECT_EQ(switches->len, 2U);
  EXPECT_STREQ(static_cast<const char*>(g_ptr_array_index(switches, 0)),
               "--abc");
  EXPECT_STREQ(static_cast<const char*>(g_ptr_array_index(switches, 1)),
               "--foo=\"bar, baz\"");

  unsetenv("FLUTTER_ENGINE_SWITCHES");
  unsetenv("FLUTTER_ENGINE_SWITCH_1");
  unsetenv("FLUTTER_ENGINE_SWITCH_2");
}
#endif  // !FLUTTER_RELEASE
