/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * 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.
 */

package {
    default_team: "trendy_team_context_hub",
    // See: http://go/android-license-faq
    // A large-scale-change added 'default_applicable_licenses' to import
    // all of the 'license_kinds' from "system_chre_license"
    // to get the below license kinds:
    //   SPDX-license-identifier-Apache-2.0
    default_applicable_licenses: ["system_chre_license"],
}

cc_defaults {
    name: "chre_chpp_flags",
    cflags: [
        "-DCHPP_CHECKSUM_ENABLED",
        "-DCHPP_DEBUG_ASSERT_ENABLED",
        "-DCHPP_ENABLE_WORK_MONITOR",
        "-DCHPP_EXPECTED_SERVICE_COUNT=3",
        "-DCHPP_MAX_REGISTERED_CLIENTS=16",
        "-DCHPP_MAX_REGISTERED_SERVICES=16",

        "-DCHPP_CLIENT_ENABLED_DISCOVERY",
        "-DCHPP_CLIENT_ENABLED_GNSS",
        "-DCHPP_CLIENT_ENABLED_LOOPBACK",
        "-DCHPP_CLIENT_ENABLED_TIMESYNC",
        "-DCHPP_CLIENT_ENABLED_TRANSPORT_LOOPBACK",
        "-DCHPP_CLIENT_ENABLED_WIFI",
        "-DCHPP_CLIENT_ENABLED_WWAN",
        "-DCHPP_SERVICE_ENABLED_GNSS",
        "-DCHPP_SERVICE_ENABLED_TRANSPORT_LOOPBACK",
        "-DCHPP_SERVICE_ENABLED_WIFI",
        "-DCHPP_SERVICE_ENABLED_WWAN",

        "-DCHPP_GNSS_DEFAULT_CAPABILITIES=0x7",
        "-DCHPP_WIFI_DEFAULT_CAPABILITIES=0xf",
        "-DCHPP_WWAN_DEFAULT_CAPABILITIES=0x1",
    ],
    visibility: ["//visibility:override"],
}

filegroup {
    name: "chre_chpp_core_files",
    srcs: [
        "app.c",
        "clients.c",
        "common/event_log.c",
        "platform/linux/memory.c",
        "platform/linux/notifier.c",
        "platform/pal_api.c",
        "platform/shared/crc.c",
        "services.c",
        "services/discovery.c",
        "services/loopback.c",
        "services/nonhandle.c",
        "services/timesync.c",
        "transport.c",
    ],
}

// Everything needed to run CHPP on Linux, except for the link layer.
// Note that this is cc_defaults and not a lib because modules that inherit
// these defaults may need to change compilation flags for sources here.
cc_defaults {
    name: "chre_chpp_core_without_link",
    vendor: true,
    cflags: [
        // Required for pthread_setname_np()
        "-D_GNU_SOURCE",
        // clock_gettime() requires _POSIX_C_SOURCE >= 199309L
        "-D_POSIX_C_SOURCE=199309L",
        "-Wall",
        "-Wcast-align",
        "-Wcast-qual",
        "-Wconversion",
        "-Werror",
        "-Wextra",
        "-Wno-strict-aliasing",
        "-Wpointer-arith",
        "-Wshadow",
        "-Wswitch",
        // Enable assert (i.e. CHPP_ASSERT, ...)
        "-UNDEBUG",
    ],
    conlyflags: [
        "-Wmissing-prototypes",
        "-Wsign-compare",
        "-Wstrict-prototypes",
        "-std=c11",
    ],
    srcs: [
        ":chre_chpp_core_files",
    ],
    header_libs: [
        "chre_api",
        "chre_pal",
    ],
    export_header_lib_headers: [
        "chre_api",
        "chre_pal",
    ],
    static_libs: ["chre_pal_linux"],
    host_supported: true,
}

filegroup {
    name: "chre_chpp_clients_and_services_files",
    srcs: [
        "clients/discovery.c",
        "clients/gnss.c",
        "clients/loopback.c",
        "clients/timesync.c",
        "clients/wifi.c",
        "clients/wwan.c",
        "common/event_log.c",
        "common/gnss_convert.c",
        "common/wifi_convert.c",
        "common/wifi_utils.c",
        "common/wwan_convert.c",
        "platform/linux/services/platform_gnss.c",
        "services/gnss.c",
        "services/wifi.c",
        "services/wwan.c",
    ],
}

// Meant to be combined with chre_chpp_core_without_link to add in the full set
// of optional clients and services.
cc_defaults {
    name: "chre_chpp_clients_and_services",
    srcs: [
        ":chre_chpp_clients_and_services_files",
    ],
}

filegroup {
    name: "chre_chpp_linux_files",
    srcs: [
        "platform/linux/link.c",
    ],
}

cc_library_static {
    name: "chre_chpp_linux",
    defaults: [
        "chre_chpp_clients_and_services",
        "chre_chpp_core_without_link",
        "chre_chpp_flags",
    ],
    srcs: [
        ":chre_chpp_linux_files",
    ],
    export_include_dirs: [
        "include",
        "platform/linux/include",
    ],
}

filegroup {
    name: "chre_chpp_linux_tests_utility_files",
    srcs: [
        "test/transport_util.cpp",
    ],
}

filegroup {
    name: "chre_chpp_linux_tests_files",
    srcs: [
        "test/app_discovery_test.cpp",
        "test/app_notification_test.cpp",
        "test/app_req_resp_test.cpp",
        "test/app_test.cpp",
        "test/app_test_base.cpp",
        "test/app_timeout_test.cpp",
        "test/event_log_test.cpp",
        "test/gnss_test.cpp",
        "test/transport_test.cpp",
    ],
}

cc_test_host {
    name: "chre_chpp_linux_tests",
    // TODO(b/232537107): Evaluate if isolated can be turned on
    isolated: false,
    defaults: [
        "chre_chpp_flags",
    ],
    srcs: [
        ":chre_chpp_linux_tests_files",
        ":chre_chpp_linux_tests_utility_files",
    ],
    static_libs: [
        "chre_chpp_linux",
        "chre_pal_linux",
    ],
    sanitize: {
        address: true,
    },
}

cc_test_host {
    name: "chre_chpp_convert_tests",
    cflags: [
        "-Wcast-align",
        "-Wsign-compare",
    ],
    header_libs: [
        "chre_test_common",
    ],
    srcs: [
        "test/wifi_convert_test.cpp",
        "test/wwan_convert_test.cpp",
    ],
    static_libs: ["chre_chpp_linux"],
}

cc_test_host {
    name: "chre_chpp_fake_link_sync_tests",
    defaults: ["chre_chpp_core_without_link"],
    cflags: [
        "-DCHPP_CLIENT_ENABLED_DISCOVERY",
        "-DCHPP_CLIENT_ENABLED_WIFI",
        "-DCHPP_DEBUG_ASSERT_ENABLED",
        "-DCHPP_ENABLE_WORK_MONITOR",
        "-DCHPP_WIFI_DEFAULT_CAPABILITIES=0xf",
        // Speed up tests by setting timeouts to 50 ms.
        // Note: the value shouldn't be too low to avoid timeouts on slow test servers.
        "-DCHPP_TRANSPORT_RX_TIMEOUT_NS=50000000",
        "-DCHPP_TRANSPORT_TX_TIMEOUT_NS=50000000",
        // App layer timeout should be higher than transport; at least MAX_RESET * MAX_RETX * TX_TIMEOUT.
        "-DCHPP_CLIENT_ENABLED_VENDOR",
        "-DCHPP_REQUEST_TIMEOUT_DEFAULT=1000000000",
        "-DCHPP_TRANSPORT_MAX_RESET=2",
        "-DCHPP_TRANSPORT_MAX_RETX=2",
    ],
    local_include_dirs: [
        "include",

        // Note: this needs to come before platform/linux/include
        "test/include/fake_link",

        "platform/linux/include",
    ],
    srcs: [
        "clients/discovery.c",
        "clients/wifi.c",
        "common/wifi_convert.c",
        "common/wifi_utils.c",
        "test/fake_link.cpp",
        "test/fake_link_client.cpp",
        "test/fake_link_sync_test.cpp",
        "test/packet_util.cpp",
    ],
    header_libs: [
        "libbase_headers",
    ],
}
