// Copyright 2018 The Fuchsia 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 "src/developer/crashpad_agent/config.h"

#include <lib/syslog/cpp/logger.h>
#include <zircon/errors.h>

#include "third_party/googletest/googletest/include/gtest/gtest.h"

namespace fuchsia {
namespace crash {
namespace {

void CheckEmptyConfig(const Config& config) {
  EXPECT_EQ(config.local_crashpad_database_path, "");
  EXPECT_FALSE(config.enable_upload_to_crash_server);
  EXPECT_EQ(config.crash_server_url, nullptr);
}

TEST(ConfigTest, ParseConfig_ValidConfig_NoUpload) {
  Config config;
  ASSERT_EQ(ParseConfig("/pkg/data/valid_config_no_upload.json", &config),
            ZX_OK);
  EXPECT_EQ(config.local_crashpad_database_path, "/data/crashes");
  EXPECT_FALSE(config.enable_upload_to_crash_server);
  EXPECT_EQ(config.crash_server_url, nullptr);
}

TEST(ConfigTest, ParseConfig_ValidConfig_Upload) {
  Config config;
  ASSERT_EQ(ParseConfig("/pkg/data/valid_config_upload.json", &config), ZX_OK);
  EXPECT_EQ(config.local_crashpad_database_path, "/data/crashes");
  EXPECT_TRUE(config.enable_upload_to_crash_server);
  EXPECT_EQ(*config.crash_server_url, "http://localhost:1234");
}

TEST(ConfigTest, ParseConfig_ValidConfig_NoUploadServerUrlIgnored) {
  Config config;
  ASSERT_EQ(ParseConfig("/pkg/data/valid_config_no_upload_spurious_server.json",
                        &config),
            ZX_OK);
  EXPECT_EQ(config.local_crashpad_database_path, "/data/crashes");
  EXPECT_FALSE(config.enable_upload_to_crash_server);
  // Even though a URL is set in the config file, we check that it is not set in
  // the struct.
  EXPECT_EQ(config.crash_server_url, nullptr);
}

TEST(ConfigTest, ParseConfig_MissingConfig) {
  Config config;
  ASSERT_EQ(ParseConfig("undefined file", &config), ZX_ERR_IO);
  CheckEmptyConfig(config);
}

TEST(ConfigTest, ParseConfig_BadConfig_SpuriousField) {
  Config config;
  ASSERT_EQ(
      ParseConfig("/pkg/data/bad_schema_spurious_field_config.json", &config),
      ZX_ERR_INTERNAL);
  CheckEmptyConfig(config);
}

TEST(ConfigTest, ParseConfig_BadConfig_MissingRequiredField) {
  Config config;
  ASSERT_EQ(
      ParseConfig("/pkg/data/bad_schema_missing_required_field_config.json",
                  &config),
      ZX_ERR_INTERNAL);
  CheckEmptyConfig(config);
}

TEST(ConfigTest, ParseConfig_BadConfig_MissingServerUrlWithUploadEnabled) {
  Config config;
  ASSERT_EQ(
      ParseConfig("/pkg/data/bad_schema_missing_server_config.json", &config),
      ZX_ERR_INTERNAL);
  CheckEmptyConfig(config);
}

}  // namespace
}  // namespace crash
}  // namespace fuchsia

int main(int argc, char** argv) {
  testing::InitGoogleTest(&argc, argv);
  syslog::InitLogger({"crash", "test"});
  return RUN_ALL_TESTS();
}
