# Copyright 2021 The Pigweed Authors
#
# 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
#
#     https://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.

import("//build_overrides/pigweed.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_third_party/boringssl/boringssl.gni")
import("$dir_pw_unit_test/test.gni")

if (dir_pw_third_party_boringssl != "") {
  import("$dir_pw_third_party_boringssl/BUILD.generated.gni")

  config("boringssl_public_config") {
    include_dirs = [
      "$dir_pw_third_party_boringssl/src/include",
      "public",
    ]
    cflags = [
      "-Wno-cast-qual",
      "-Wno-ignored-qualifiers",
      "-w",
    ]

    # This can be removed once boringssl threading primitives are implemented,
    # i.e. using pw_sync, and when we have a posix style socket layer.
    defines =
        [ "OPENSSL_NO_THREADS_CORRUPT_MEMORY_AND_LEAK_SECRETS_IF_THREADED" ]
  }

  config("boringssl_internal_config") {
    defines = [
      # Enable virtual desctructor and compile-time check of pure virtual base class
      "BORINGSSL_ALLOW_CXX_RUNTIME",

      # Code size optimiaztion
      "OPENSSL_SMALL",

      # The ARM assembly code is only for cortex-A.
      "OPENSSL_NO_ASM",

      # Disable assert, which may additionally link in unwanted binaries via
      # argument evaluation.
      "NDEBUG",
    ]
    cflags = [
      "-Wno-unused-function",
      "-Wno-conversion",
      "-Wno-unused-parameter",
      "-Wno-char-subscripts",
    ]
    cflags_cc = [
      "-fpermissive",
      "-Wno-error",  # To get through the -Werror=permissive error
    ]
    include_dirs = [ "$dir_pw_third_party_boringssl" ]
  }

  # Remove sources that require file system and posix socket support
  excluded_sources = [
    "src/crypto/bio/connect.c",
    "src/crypto/bio/fd.c",
    "src/crypto/bio/socket.c",
    "src/crypto/bio/socket_helper.c",
  ]

  pw_source_set("boringssl") {
    sources = [ "crypto_sysrand.cc" ]
    foreach(source, crypto_sources - excluded_sources + ssl_sources) {
      sources += [ "$dir_pw_third_party_boringssl/$source" ]
    }
    public_configs = [ ":boringssl_public_config" ]
    configs = [ ":boringssl_internal_config" ]

    # Contains a faked "sysdeps/sys/socket.h"
    # Can be removed once posix socket layer in Pigweed is supported.
    include_dirs = [ "sysdeps" ]

    public_deps = [ "$dir_pw_tls_client:time" ]
  }

  # A test server for unit testing.
  config("public_includes") {
    include_dirs = [ "public" ]
  }

  pw_source_set("test_server") {
    sources = [ "test_server.cc" ]
    public_configs = [ ":public_includes" ]
    public = [ "public/boringssl/test/test_server.h" ]
    public_deps = [
      ":boringssl",
      "$dir_pw_bytes",
      "$dir_pw_log",
      "$dir_pw_stream",
    ]
  }

  pw_test("test_server_test") {
    public_deps = [
      ":test_data",
      ":test_server",
    ]
    sources = [ "test_server_test.cc" ]
  }
} else {
  group("boringssl") {
  }
}

pw_test_group("tests") {
  enable_if = dir_pw_third_party_boringssl != ""
  tests = [ ":test_server_test" ]
}

pw_python_action("generate_test_data") {
  header_output = "$target_gen_dir/$target_name/test_certs_and_keys.h"
  script = "py/boringssl/generate_test_data.py"
  python_deps = [ "py" ]
  outputs = [ header_output ]
  args = [ rebase_path(header_output) ]
}

config("test_data_includes") {
  test_header_out = get_target_outputs(":generate_test_data")
  include_dirs = [ get_path_info(test_header_out[0], "dir") ]
}

group("test_data") {
  public_deps = [ ":generate_test_data" ]
  public_configs = [ ":test_data_includes" ]
}
