# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build_overrides/build.gni")
import("osp/build/config/services.gni")

# All compilable non-test targets in the repository (both executables and
# source_sets).
group("gn_all") {
  deps = [
    "cast/common:certificate",
    "cast/common:channel",
    "cast/common:public",
    "cast/receiver:channel",
    "cast/sender:channel",
    "cast/streaming:receiver",
    "cast/streaming:sender",
    "discovery:dnssd",
    "discovery:mdns",
    "discovery:public",
    "platform",
    "third_party/abseil",
    "third_party/boringssl",
    "third_party/jsoncpp",
    "third_party/mozilla",
    "third_party/tinycbor",
    "tools/cddl($host_toolchain)",
    "util",
  ]

  # Mac OS X 10.15 is incompatible with the current version of QUIC.
  if (!is_mac) {
    deps += [
      "osp",
      "osp/msgs",
    ]

    if (use_chromium_quic) {
      deps += [
        "third_party/chromium_quic",
        "third_party/chromium_quic:quic_demo_server",
        "third_party/chromium_quic:quic_streaming_playback_controller",
      ]
    }

    if (use_chromium_quic) {
      deps += [ "osp:osp_demo" ]
    }
  }

  if (!build_with_chromium) {
    deps += [
      "cast/standalone_receiver:cast_receiver",
      "cast/standalone_sender:cast_sender",
      "third_party/protobuf:protoc($host_toolchain)",
      "third_party/zlib",
    ]
  } else {
    if (!is_mac) {
      deps += [ "cast/cast_core/api" ]
    }
  }
}

source_set("openscreen_unittests_all") {
  testonly = true
  public_deps = [
    "cast/common:unittests",
    "cast/receiver:unittests",
    "cast/sender:unittests",
    "cast/streaming:unittests",
    "cast/test:unittests",
    "platform:unittests",
    "third_party/abseil",
    "util:unittests",
  ]

  if (!build_with_chromium && is_posix) {
    public_deps += [
      "cast/test:make_crl_tests($host_toolchain)",

      # TODO(crbug.com/1132604): Discovery unittests fail in Chrome.
      "discovery:unittests",
    ]
  }

  if (!is_mac) {
    public_deps += [
      "osp:unittests",
      "osp/msgs:unittests",
    ]
  }
}

if (!build_with_chromium) {
  executable("openscreen_unittests") {
    testonly = true
    deps = [
      ":openscreen_unittests_all",
      "test:test_main",
    ]
  }
}

if (!build_with_chromium && is_posix) {
  source_set("e2e_tests_all") {
    testonly = true
    public_deps = [
      "cast/common:discovery_e2e_test",
      "cast/test:e2e_tests",
      "cast/test:make_crl_tests($host_toolchain)",
    ]
  }

  executable("e2e_tests") {
    testonly = true
    deps = [
      ":e2e_tests_all",
      "test:test_main",
    ]
  }
}

if (!build_with_chromium) {
  source_set("fuzzer_tests_all") {
    testonly = true
    deps = [
      "//cast/common:message_framer_fuzzer",
      "//cast/streaming:compound_rtcp_parser_fuzzer",
      "//cast/streaming:rtp_packet_parser_fuzzer",
      "//cast/streaming:sender_report_parser_fuzzer",
      "//discovery:mdns_fuzzer",
    ]
  }
}
