// Copyright 2020 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <iostream>
#include <set>
#include <string>

#include "starboard/configuration.h"
#include "starboard/nplb/nplb_evergreen_compat_tests/checks.h"
#include "testing/gtest/include/gtest/gtest.h"

#if SB_IS(EVERGREEN_COMPATIBLE)

namespace starboard {
namespace nplb {
namespace nplb_evergreen_compat_tests {

namespace {

const char* kSabiJsonIdArmHardfp =
    "{\"alignment_char\":1,\"alignment_double\":8,\"alignment_float\":4,"
    "\"alignment_int\":4,\"alignment_llong\":8,\"alignment_long\":4,"
    "\"alignment_pointer\":4,\"alignment_short\":2,\"calling_convention\":"
    "\"eabi\",\"endianness\":\"little\",\"floating_point_abi\":\"hard\","
    "\"floating_point_fpu\":\"vfpv3\",\"sb_api_version\":12,\"signedness_of_"
    "char\":\"signed\",\"signedness_of_enum\":\"signed\",\"size_of_char\":1,"
    "\"size_of_double\":8,\"size_of_enum\":4,\"size_of_float\":4,\"size_of_"
    "int\":4,\"size_of_llong\":8,\"size_of_long\":4,\"size_of_pointer\":4,"
    "\"size_of_short\":2,\"target_arch\":\"arm\",\"target_arch_sub\":\"v7a\","
    "\"word_size\":32}";

const char* kSabiJsonIdArmSoftfp =
    "{\"alignment_char\":1,\"alignment_double\":8,\"alignment_float\":4,"
    "\"alignment_int\":4,\"alignment_llong\":8,\"alignment_long\":4,"
    "\"alignment_pointer\":4,\"alignment_short\":2,\"calling_convention\":"
    "\"eabi\",\"endianness\":\"little\",\"floating_point_abi\":\"softfp\","
    "\"floating_point_fpu\":\"vfpv3\",\"sb_api_version\":12,\"signedness_of_"
    "char\":\"signed\",\"signedness_of_enum\":\"signed\",\"size_of_char\":1,"
    "\"size_of_double\":8,\"size_of_enum\":4,\"size_of_float\":4,\"size_of_"
    "int\":4,\"size_of_llong\":8,\"size_of_long\":4,\"size_of_pointer\":4,"
    "\"size_of_short\":2,\"target_arch\":\"arm\",\"target_arch_sub\":\"v7a\","
    "\"word_size\":32}";

const char* kSabiJsonIdArm64 =
    "{\"alignment_char\":1,\"alignment_double\":8,\"alignment_float\":4,"
    "\"alignment_int\":4,\"alignment_llong\":8,\"alignment_long\":8,"
    "\"alignment_pointer\":8,\"alignment_short\":2,\"calling_convention\":"
    "\"aarch64\",\"endianness\":\"little\",\"floating_point_abi\":\"\","
    "\"floating_point_fpu\":\"\",\"sb_api_version\":12,\"signedness_of_char\":"
    "\"signed\",\"signedness_of_enum\":\"signed\",\"size_of_char\":1,\"size_of_"
    "double\":8,\"size_of_enum\":4,\"size_of_float\":4,\"size_of_int\":4,"
    "\"size_of_llong\":8,\"size_of_long\":8,\"size_of_pointer\":8,\"size_of_"
    "short\":2,\"target_arch\":\"arm64\",\"target_arch_sub\":\"v8a\",\"word_"
    "size\":64}";

const char* kSabiJsonIdX86 =
    "{\"alignment_char\":1,\"alignment_double\":8,\"alignment_float\":4,"
    "\"alignment_int\":4,\"alignment_llong\":8,\"alignment_long\":4,"
    "\"alignment_pointer\":4,\"alignment_short\":2,\"calling_convention\":"
    "\"sysv\",\"endianness\":\"little\",\"floating_point_abi\":\"\",\"floating_"
    "point_fpu\":\"\",\"sb_api_version\":12,\"signedness_of_char\":\"signed\","
    "\"signedness_of_enum\":\"signed\",\"size_of_char\":1,\"size_of_double\":8,"
    "\"size_of_enum\":4,\"size_of_float\":4,\"size_of_int\":4,\"size_of_"
    "llong\":8,\"size_of_long\":4,\"size_of_pointer\":4,\"size_of_short\":2,"
    "\"target_arch\":\"x86\",\"target_arch_sub\":\"\",\"word_size\":32}";

const char* kSabiJsonIdX64Sysv =
    "{\"alignment_char\":1,\"alignment_double\":8,\"alignment_float\":4,"
    "\"alignment_int\":4,\"alignment_llong\":8,\"alignment_long\":8,"
    "\"alignment_pointer\":8,\"alignment_short\":2,\"calling_convention\":"
    "\"sysv\",\"endianness\":\"little\",\"floating_point_abi\":\"\",\"floating_"
    "point_fpu\":\"\",\"sb_api_version\":12,\"signedness_of_char\":\"signed\","
    "\"signedness_of_enum\":\"signed\",\"size_of_char\":1,\"size_of_double\":8,"
    "\"size_of_enum\":4,\"size_of_float\":4,\"size_of_int\":4,\"size_of_"
    "llong\":8,\"size_of_long\":8,\"size_of_pointer\":8,\"size_of_short\":2,"
    "\"target_arch\":\"x64\",\"target_arch_sub\":\"\",\"word_size\":64}";

class SabiTest : public ::testing::Test {
 protected:
  SabiTest() {}
  ~SabiTest() {}
};

TEST_F(SabiTest, VerifySABI) {
  std::set<std::string> sabi_set;
  sabi_set.insert(kSabiJsonIdArmHardfp);
  sabi_set.insert(kSabiJsonIdArmSoftfp);
  sabi_set.insert(kSabiJsonIdArm64);
  sabi_set.insert(kSabiJsonIdX86);
  sabi_set.insert(kSabiJsonIdX64Sysv);

  ASSERT_NE(sabi_set.find(SB_SABI_JSON_ID), sabi_set.end())
      << "Unsupported SABI configuration. " << std::endl
      << "The platform should use one of the predefined SABI json files!"
      << std::endl
      << "Currently supported are: " << std::endl
      << "  starboard/sabi/arm/hardfp/sabi.json" << std::endl
      << "  starboard/sabi/arm/softfp/sabi.json" << std::endl
      << "  starboard/sabi/arm64/sabi.json" << std::endl
      << "  starboard/sabi/x86/sabi.json" << std::endl
      << "  starboard/sabi/x64/sysv/sabi.json" << std::endl;
}

}  // namespace
}  // namespace nplb_evergreen_compat_tests
}  // namespace nplb
}  // namespace starboard

#endif  // SB_IS(EVERGREEN_COMPATIBLE)
