//
// Copyright (C) 2015 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.
//

// AIDL interface between libupdate_engine and framework.jar
package {
    default_applicable_licenses: ["system_update_engine_license"],
}

// Added automatically by a large-scale-change
// See: http://go/android-license-faq
license {
    name: "system_update_engine_license",
    visibility: [":__subpackages__"],
    license_kinds: [
        "SPDX-license-identifier-Apache-2.0",
    ],
    license_text: [
        "NOTICE",
    ],
}

filegroup {
    name: "libupdate_engine_aidl",
    srcs: [
        "binder_bindings/android/os/IUpdateEngine.aidl",
        "binder_bindings/android/os/IUpdateEngineCallback.aidl",
    ],
    path: "binder_bindings",
}

cc_defaults {
    name: "ue_defaults",

    cflags: [
        "-DBASE_VER=576279",
        "-DUSE_HWID_OVERRIDE=0",
        "-D_FILE_OFFSET_BITS=64",
        "-D_POSIX_C_SOURCE=199309L",
        "-Wa,--noexecstack",
        "-Wall",
        "-Werror",
        "-Wextra",
        "-Wformat=2",
        "-Wno-psabi",
        "-Wno-unused-parameter",
        "-ffunction-sections",
        "-fstack-protector-strong",
        "-fvisibility=hidden",
        "-g3",
    ],
    cppflags: [
        "-Wnon-virtual-dtor",
        "-fno-strict-aliasing",
    ],
    include_dirs: ["system"],
    local_include_dirs: ["client_library/include"],
    header_libs: ["libgtest_prod_headers"],
    shared_libs: [
        "libbrillo-stream",
        "libbrillo",
        "libchrome",
    ],
    ldflags: ["-Wl,--gc-sections"],

    target: {
        android: {
            cflags: [
                "-DUSE_FEC=1",
            ],
            shared_libs: [
                "libbase",
            ],
        },
        host: {
            cflags: [
                "-DUSE_FEC=0",
            ],
        },
        darwin: {
            enabled: false,
        },
    },
}

// libcow_operation_convert (type: library)
// ========================================================
cc_library_static {
    name: "libpayload_extent_utils",
    defaults: [
        "ue_defaults",
    ],
    host_supported: true,
    recovery_available: true,
    srcs: [
        "payload_generator/extent_utils.cc",
    ],
    static_libs: [
        "update_metadata-protos",
    ],
}

cc_library {
    name: "libcow_operation_convert",
    host_supported: true,
    recovery_available: true,
    defaults: [
        "ue_defaults",
        "update_metadata-protos_exports",
    ],
    srcs: [
        "common/cow_operation_convert.cc",
    ],
    static_libs: [
        "libsnapshot_cow",
        "update_metadata-protos",
        "libpayload_extent_ranges",
        "libpayload_extent_utils",
        "libbrotli",
        "libz",
    ],
}

// update_metadata-protos (type: static_library)
// ========================================================
// Protobufs.
cc_defaults {
    name: "update_metadata-protos_exports",

    shared_libs: ["libprotobuf-cpp-lite"],
}

cc_defaults {
    name: "update_metadata-protos-defaults",
    host_supported: true,
    ramdisk_available: true,
    recovery_available: true,

    srcs: ["update_engine/update_metadata.proto"],
    cflags: [
        "-Wall",
        "-Werror",
    ],
    proto: {
        canonical_path_from_root: false,
        export_proto_headers: true,
    },
}

cc_library_static {
    name: "update_metadata-protos",
    defaults: ["update_metadata-protos-defaults"],
    proto: {
        type: "lite",
    },
}

cc_library_static {
    name: "update_metadata-protos-full",
    defaults: ["update_metadata-protos-defaults"],
}

python_library_host {
    name: "update_metadata-protos-python",
    srcs: ["update_metadata.proto"],
    proto: {
        canonical_path_from_root: false,
    },
}

// libpayload_consumer (type: static_library)
// ========================================================
// The payload application component and common dependencies.
cc_defaults {
    name: "libpayload_consumer_exports_defaults",
    defaults: ["update_metadata-protos_exports"],

    static_libs: [
        "libxz",
        "libbz",
        "libbspatch",
        "libbrotli",
        "libfec_rs",
        "libpuffpatch",
        "libverity_tree",
        "libsnapshot_cow",
        "libbrotli",
        "libz",
        "libpayload_extent_ranges",
        "libpayload_extent_utils",
        "libcow_operation_convert",
        "lz4diff-protos",
        "liblz4patch",
        "libzstd",
    ],
    shared_libs: [
        "libbase",
        "libcrypto",
        "libfec",
        "liblz4",
        "libziparchive",
    ],
}

cc_defaults {
    name: "libpayload_consumer_exports",
    defaults: [
        "libpayload_consumer_exports_defaults",
    ],
    static_libs: ["update_metadata-protos"],
}

cc_defaults {
    name: "libpayload_consumer_exports_proto-full",
    defaults: [
        "libpayload_consumer_exports_defaults",
    ],
    static_libs: ["update_metadata-protos-full"],
}

cc_defaults {
    name: "libpayload_consumer_defaults",
    host_supported: true,
    recovery_available: true,

    srcs: [
        "aosp/platform_constants_android.cc",
        "common/action_processor.cc",
        "common/boot_control_stub.cc",
        "common/clock.cc",
        "common/constants.cc",
        "common/cpu_limiter.cc",
        "common/dynamic_partition_control_stub.cc",
        "common/error_code_utils.cc",
        "common/file_fetcher.cc",
        "common/hash_calculator.cc",
        "common/http_common.cc",
        "common/http_fetcher.cc",
        "common/hwid_override.cc",
        "common/multi_range_http_fetcher.cc",
        "common/prefs.cc",
        "common/subprocess.cc",
        "common/terminator.cc",
        "common/utils.cc",
        "payload_consumer/bzip_extent_writer.cc",
        "payload_consumer/cached_file_descriptor.cc",
        "payload_consumer/certificate_parser_android.cc",
        "payload_consumer/cow_writer_file_descriptor.cc",
        "payload_consumer/delta_performer.cc",
        "payload_consumer/extent_reader.cc",
        "payload_consumer/extent_writer.cc",
        "payload_consumer/file_descriptor.cc",
        "payload_consumer/file_descriptor_utils.cc",
        "payload_consumer/file_writer.cc",
        "payload_consumer/filesystem_verifier_action.cc",
        "payload_consumer/install_operation_executor.cc",
        "payload_consumer/install_plan.cc",
        "payload_consumer/mount_history.cc",
        "payload_consumer/payload_constants.cc",
        "payload_consumer/payload_metadata.cc",
        "payload_consumer/payload_verifier.cc",
        "payload_consumer/partition_writer.cc",
        "payload_consumer/partition_writer_factory_android.cc",
        "payload_consumer/vabc_partition_writer.cc",
        "payload_consumer/xor_extent_writer.cc",
        "payload_consumer/block_extent_writer.cc",
        "payload_consumer/snapshot_extent_writer.cc",
        "payload_consumer/postinstall_runner_action.cc",
        "payload_consumer/verified_source_fd.cc",
        "payload_consumer/verity_writer_android.cc",
        "payload_consumer/xz_extent_writer.cc",
        "payload_consumer/fec_file_descriptor.cc",
        "payload_consumer/partition_update_generator_android.cc",
        "update_status_utils.cc",
    ],
}

cc_library_static {
    name: "libpayload_consumer",
    defaults: [
        "ue_defaults",
        "libpayload_consumer_exports",
        "libpayload_consumer_defaults",
    ],
}

cc_library_static {
    name: "libpayload_consumer_proto-full",
    defaults: [
        "ue_defaults",
        "libpayload_consumer_exports_proto-full",
        "libpayload_consumer_defaults",
    ],
}

cc_library_static {
    name: "libstatslog_ue",
    generated_sources: ["statslog_ue.cpp"],
    generated_headers: ["statslog_ue.h"],
    export_generated_headers: ["statslog_ue.h"],
    shared_libs: [
        "libstatssocket",
    ],
}

genrule {
    name: "statslog_ue.h",
    tools: ["stats-log-api-gen"],
    cmd: "$(location stats-log-api-gen) --header $(genDir)/statslog_ue.h --module update_engine --namespace chromeos_update_engine,statsd",
    out: [
        "statslog_ue.h",
    ],
}

genrule {
    name: "statslog_ue.cpp",
    tools: ["stats-log-api-gen"],
    cmd: "$(location stats-log-api-gen) --cpp $(genDir)/statslog_ue.cpp --module update_engine --namespace chromeos_update_engine,statsd --importHeader statslog_ue.h",
    out: [
        "statslog_ue.cpp",
    ],
}

// libupdate_engine_boot_control (type: static_library)
// ========================================================
// A BootControl class implementation using Android's HIDL boot_control HAL.
cc_defaults {
    name: "libupdate_engine_boot_control_exports_defaults",
    defaults: ["update_metadata-protos_exports"],

    static_libs: [
        "libcutils",
        "libfs_mgr_binder",
        "libgsi",
        "libsnapshot_static",
        "libstatslog_ue",
        "libz",
    ],
    shared_libs: [
        "libbootloader_message",
        "libhidlbase",
        "liblp",
        "libutils",
        "android.hardware.boot@1.0",
        "android.hardware.boot@1.1",
        "android.hardware.boot@1.2",
        "android.hardware.boot-V1-ndk",
        "libboot_control_client",
    ],
    header_libs: [
        "avb_headers",
    ],
    target: {
        recovery: {
            static_libs: [
                "libfs_mgr",
                "libsnapshot_nobinder",
            ],
            exclude_static_libs: [
                "libfs_mgr_binder",
                "libsnapshot_static",
                "libstatslog_ue",
            ],
        },
    },
}

cc_defaults {
    name: "libupdate_engine_boot_control_exports",
    defaults: [
        "libupdate_engine_boot_control_exports_defaults",
    ],
    static_libs: [
        "libpayload_consumer",
        "update_metadata-protos",
    ],
}

cc_defaults {
    name: "libupdate_engine_boot_control_exports_proto-full",
    defaults: [
        "libupdate_engine_boot_control_exports_defaults",
    ],
    static_libs: [
        "libpayload_consumer_proto-full",
        "update_metadata-protos-full",
    ],
}

cc_defaults {
    name: "libupdate_engine_boot_control_defaults",
    defaults: [
        "ue_defaults",
    ],
    recovery_available: true,

    srcs: [
        "aosp/boot_control_android.cc",
        "aosp/cleanup_previous_update_action.cc",
        "aosp/dynamic_partition_control_android.cc",
        "aosp/dynamic_partition_utils.cc",
    ],
}

cc_library_static {
    name: "libupdate_engine_boot_control",
    defaults: [
        "libupdate_engine_boot_control_defaults",
        "libupdate_engine_boot_control_exports",
        "libpayload_consumer_exports",
    ],
}

cc_library_static {
    name: "libupdate_engine_boot_control_nostats",
    cflags: ["-DUE_DISABLE_STATS"],
    defaults: [
        "libupdate_engine_boot_control_defaults",
        "libupdate_engine_boot_control_exports",
        "libpayload_consumer_exports",
    ],
}

cc_library_static {
    name: "libupdate_engine_boot_control_proto-full",
    defaults: [
        "libupdate_engine_boot_control_defaults",
        "libupdate_engine_boot_control_exports_proto-full",
        "libpayload_consumer_exports_proto-full",
    ],
}

// libupdate_engine_android (type: static_library)
// ========================================================
// The main daemon static_library used in Android (non-Brillo). This only has a
// loop to apply payloads provided by the upper layer via a Binder interface.
cc_defaults {
    name: "libupdate_engine_android_exports_defaults",
    defaults: [
        "ue_defaults",
    ],

    static_libs: [
        "libavb",
        "libavb_user",
        "libgkiprops",
        "libstatslog_ue",
        "libPlatformProperties",
    ],
    shared_libs: [
        "apex_aidl_interface-cpp",
        "libandroid_net",
        "libbase",
        "libbinder",
        "libbinderwrapper",
        "libbootloader_message",
        "libbrillo-binder",
        "libcurl",
        "libcutils",
        "libupdate_engine_stable-V3-cpp",
        "liblog",
        "libssl",
        "libstatssocket",
        "libutils",
    ],
    whole_static_libs: [
        "libcom.android.sysprop.apex",
    ],
}

cc_defaults {
    name: "libupdate_engine_android_exports",
    defaults: [
        "libupdate_engine_android_exports_defaults",
        "libupdate_engine_boot_control_exports",
        "libpayload_consumer_exports",
    ],
    static_libs: [
        "libpayload_consumer",
        "libupdate_engine_boot_control",
    ],
}

cc_defaults {
    name: "libupdate_engine_android_exports_proto-full",
    defaults: [
        "libupdate_engine_android_exports_defaults",
        "libupdate_engine_boot_control_exports_proto-full",
        "libpayload_consumer_exports_proto-full",
    ],
    static_libs: [
        "libpayload_consumer_proto-full",
        "libupdate_engine_boot_control_proto-full",
    ],
}

aidl_interface {
    name: "libupdate_engine_aidl_interface",
    srcs: [
        ":libupdate_engine_aidl",
    ],
    backend: {
        cpp: {
            enabled: false,
        },
        java: {
            enabled: false,
        },
        ndk: {
            enabled: false,
        },
        rust: {
            enabled: true,
        },
    },
    frozen: false,
    unstable: true,
}

cc_defaults {
    name: "libupdate_engine_android_defaults",
    defaults: [
        "ue_defaults",
    ],

    aidl: {
        local_include_dirs: ["binder_bindings"],
        export_aidl_headers: true,
    },

    srcs: [
        ":libupdate_engine_aidl",
        "common/system_state.cc",
        "aosp/apex_handler_android.cc",
        "aosp/binder_service_android.cc",
        "aosp/binder_service_stable_android.cc",
        "aosp/daemon_android.cc",
        "aosp/daemon_state_android.cc",
        "aosp/hardware_android.cc",
        "aosp/logging_android.cc",
        "aosp/network_selector_android.cc",
        "aosp/update_attempter_android.cc",
        "certificate_checker.cc",
        "download_action.cc",
        "libcurl_http_fetcher.cc",
        "metrics_utils.cc",
        "update_boot_flags_action.cc",
    ],
}

cc_library_static {
    name: "libupdate_engine_android",
    defaults: [
        "libupdate_engine_android_defaults",
        "libupdate_engine_android_exports",
    ],
}

cc_library_static {
    name: "libupdate_engine_android_proto-full",
    defaults: [
        "libupdate_engine_android_defaults",
        "libupdate_engine_android_exports_proto-full",
    ],
}

// update_engine (type: executable)
// ========================================================
// update_engine daemon.
cc_binary {
    name: "update_engine",
    defaults: [
        "ue_defaults",
        "libupdate_engine_android_exports",
    ],

    static_libs: [
        "libupdate_engine_android",
        "libgflags",
    ],
    required: [
        "cacerts",
        "otacerts",
    ],

    srcs: [
        "main.cc",
        "aosp/metrics_reporter_android.cc",
    ],
    init_rc: ["update_engine.rc"],
}

// update_engine_nostats (type: executable)
// ========================================================
// update_engine daemon version without the stats integration.
cc_binary {
    name: "update_engine_nostats",
    defaults: [
        "ue_defaults",
        "libupdate_engine_android_exports",
    ],

    static_libs: [
        "libupdate_engine_android",
        "libgflags",
        "libupdate_engine_boot_control_nostats",
    ],
    required: [
        "cacerts",
        "otacerts",
    ],

    exclude_static_libs: [
        "libstatslog_ue",
        "libupdate_engine_boot_control",
    ],

    exclude_shared_libs: [
        "libstatssocket",
    ],

    cflags: ["-DUE_DISABLE_STATS"],
    srcs: [
        "main.cc",
        "common/metrics_reporter_stub.cc",
    ],
    init_rc: ["update_engine_nostats.rc"],
}

// update_engine_sideload (type: executable)
// ========================================================
// A binary executable equivalent to update_engine daemon that installs an update
// from a local file directly instead of running in the background. Used in
// recovery image.
cc_binary {
    name: "update_engine_sideload",
    defaults: [
        "ue_defaults",
        "update_metadata-protos_exports",
        "libupdate_engine_boot_control_exports",
        "libpayload_consumer_exports",
    ],
    recovery: true,

    cflags: [
        "-D_UE_SIDELOAD",
        "-DUE_DISABLE_STATS",
    ],
    header_libs: ["libgtest_prod_headers"],

    srcs: [
        "aosp/hardware_android.cc",
        "aosp/logging_android.cc",
        "aosp/sideload_main.cc",
        "aosp/update_attempter_android.cc",
        "common/metrics_reporter_stub.cc",
        "common/network_selector_stub.cc",
        "common/system_state.cc",
        "download_action.cc",
        "metrics_utils.cc",
        "update_boot_flags_action.cc",
        "update_status_utils.cc",
    ],

    // Use commonly used shared libraries. libprotobuf-cpp-lite.so is filtered out,
    // as it doesn't look beneficial to be installed separately due to its size. Note
    // that we explicitly request their recovery variants, so that the expected files
    // will be used and installed.
    shared_libs: [
        "libbase",
        "liblog",
        "liblz4",
        "libprotobuf-cpp-lite",
    ],
    static_libs: [
        "libpayload_consumer",
        "libupdate_engine_boot_control",
        "update_metadata-protos",

        // We add the static versions of the shared libraries that are not installed to
        // recovery image due to size concerns. Need to include all the static library
        // dependencies of these static libraries.
        "libgkiprops",
        "libevent",
        "libmodpb64",
        "libbrillo-stream",
        "libbrillo",
        "libchrome",
    ],
    target: {
        recovery: {
            exclude_shared_libs: [
                "libbrillo-stream",
                "libbrillo",
                "libchrome",
            ],
        },
    },

    required: [
        "otacerts.recovery",
    ],
}

// update_engine_client (type: executable)
// ========================================================
// update_engine console client.
cc_binary {
    name: "update_engine_client",
    defaults: ["ue_defaults"],

    shared_libs: [
        "libbinder",
        "libbinderwrapper",
        "libbrillo-binder",
        "libutils",
    ],

    aidl: {
        local_include_dirs: ["binder_bindings"],
    },

    srcs: [
        ":libupdate_engine_aidl",
        "aosp/update_engine_client_android.cc",
        "common/error_code_utils.cc",
        "update_status_utils.cc",
    ],
}

// libpayload_generator (type: static_library)
// ========================================================
// server-side code. This is used for delta_generator and unittests but not
// for any client code.
cc_defaults {
    name: "libpayload_generator_exports",
    defaults: [
        "libpayload_consumer_exports",
        "update_metadata-protos_exports",
        "erofs-utils_export_defaults",
    ],

    header_libs: [
        "bootimg_headers",
    ],
    static_libs: [
        "libavb",
        "libbrotli",
        "libbsdiff",
        "libdivsufsort",
        "libdivsufsort64",
        "liblzma",
        "libpayload_consumer",
        "libpuffdiff",
        "libzucchini",
        "libverity_tree",
        "update_metadata-protos",
        "libpayload_extent_utils",
        "libcow_size_estimator",
        "liberofs",
        "libselinux",
        "lz4diff-protos",
        "liblz4diff",
        "libzstd",
    ],
    shared_libs: [
        "libbase",
        "libext2fs",
        // LZ4 has to be a shared lib, as we want to override it with
        // LD_LIBRARY_PRELOAD later
        "liblz4",
    ],
}

cc_library_static {
    name: "libpayload_extent_ranges",
    defaults: [
        "ue_defaults",
    ],
    host_supported: true,
    recovery_available: true,
    srcs: [
        "payload_generator/extent_ranges.cc",
    ],
    static_libs: [
        "update_metadata-protos",
    ],
}

cc_library_static {
    name: "libcow_size_estimator",
    defaults: [
        "ue_defaults",
        "update_metadata-protos_exports",
    ],
    host_supported: true,
    recovery_available: true,
    srcs: [
        "payload_generator/cow_size_estimator.cc",
    ],
    static_libs: [
        "update_metadata-protos",
        "libbase",
        "libsnapshot_cow",
        "libcow_operation_convert",
    ],
}

cc_defaults {
    name: "liblz4diff_defaults",
    static_libs: [
        "lz4diff-protos",
        "update_metadata-protos",
        "libssl",
        "libbsdiff",
        "libpuffdiff",
    ],
    shared_libs: [
        "liblz4",
    ],
}

cc_library_static {
    name: "liblz4diff",
    host_supported: true,
    defaults: [
        "ue_defaults",
        "liblz4diff_defaults",
    ],
    srcs: [
        "lz4diff/lz4diff.cc",
        "lz4diff/lz4diff_compress.cc",
    ],
}

cc_library_static {
    name: "liblz4patch",
    host_supported: true,
    recovery_available: true,
    defaults: ["ue_defaults"],
    static_libs: [
        "lz4diff-protos",
        "update_metadata-protos",
        "libssl",
        "libbspatch",
        "libpuffpatch",
    ],
    shared_libs: [
        "liblz4",
    ],
    srcs: [
        "lz4diff/lz4patch.cc",
        "lz4diff/lz4diff_compress.cc",
    ],
}

cc_binary_host {
    name: "lz4diff",
    defaults: [
        "ue_defaults",
        "libpayload_generator_exports",
    ],
    static_libs: [
        "libpayload_generator",
        "liblz4diff",
        "liblz4patch",
    ],
    srcs: [
        "lz4diff/lz4diff_main.cc",
    ],
}

cc_library_static {
    name: "libpayload_generator",
    defaults: [
        "ue_defaults",
        "libpayload_generator_exports",
    ],
    host_supported: true,

    srcs: [
        "common/system_state.cc",
        "download_action.cc",
        "payload_generator/ab_generator.cc",
        "payload_generator/annotated_operation.cc",
        "payload_generator/blob_file_writer.cc",
        "payload_generator/block_mapping.cc",
        "payload_generator/boot_img_filesystem.cc",
        "payload_generator/bzip.cc",
        "payload_generator/deflate_utils.cc",
        "payload_generator/delta_diff_generator.cc",
        "payload_generator/delta_diff_utils.cc",
        "payload_generator/ext2_filesystem.cc",
        "payload_generator/erofs_filesystem.cc",
        "payload_generator/extent_ranges.cc",
        "payload_generator/full_update_generator.cc",
        "payload_generator/mapfile_filesystem.cc",
        "payload_generator/merge_sequence_generator.cc",
        "payload_generator/payload_file.cc",
        "payload_generator/payload_generation_config_android.cc",
        "payload_generator/payload_generation_config.cc",
        "payload_generator/payload_properties.cc",
        "payload_generator/payload_signer.cc",
        "payload_generator/raw_filesystem.cc",
        "payload_generator/squashfs_filesystem.cc",
        "payload_generator/xz_android.cc",
    ],
}

// delta_generator (type: executable)
// ========================================================
// server-side delta generator.
cc_binary_host {
    name: "delta_generator",
    defaults: [
        "ue_defaults",
        "libpayload_generator_exports",
        "libpayload_consumer_exports",
    ],

    static_libs: [
        "libavb_host_sysdeps",
        "libpayload_consumer",
        "libpayload_generator",
        "libgflags",
    ],

    srcs: ["payload_generator/generate_delta_main.cc"],
}

cc_test {
    host_supported: true,
    name: "ue_unittest_delta_generator",
    defaults: [
        "ue_defaults",
        "libpayload_generator_exports",
        "libpayload_consumer_exports",
    ],

    static_libs: [
        "libpayload_consumer",
        "libpayload_generator",
        "libgflags",
    ],

    srcs: ["payload_generator/generate_delta_main.cc"],

    gtest: false,
    stem: "delta_generator",
}

// test_http_server (type: executable)
// ========================================================
// Test HTTP Server.
cc_test {
    name: "test_http_server",
    defaults: ["ue_defaults"],
    srcs: [
        "common/http_common.cc",
        "test_http_server.cc",
    ],

    gtest: false,
}

// test_subprocess (type: executable)
// ========================================================
// Test helper subprocess program.
cc_test {
    name: "test_subprocess",
    defaults: ["ue_defaults"],
    srcs: ["test_subprocess.cc"],

    gtest: false,
}

// Public keys for unittests.
// ========================================================
genrule {
    name: "ue_unittest_keys",
    cmd: "openssl rsa -in $(location unittest_key.pem) -pubout -out $(location unittest_key.pub.pem) &&" +
        "openssl rsa -in $(location unittest_key2.pem) -pubout -out $(location unittest_key2.pub.pem) &&" +
        "openssl rsa -in $(location unittest_key_RSA4096.pem) -pubout -out $(location unittest_key_RSA4096.pub.pem) &&" +
        "openssl pkey -in $(location unittest_key_EC.pem) -pubout -out $(location unittest_key_EC.pub.pem)",
    srcs: [
        "unittest_key.pem",
        "unittest_key2.pem",
        "unittest_key_RSA4096.pem",
        "unittest_key_EC.pem",
    ],
    out: [
        "unittest_key.pub.pem",
        "unittest_key2.pub.pem",
        "unittest_key_RSA4096.pub.pem",
        "unittest_key_EC.pub.pem",
    ],
}

// Sample images for unittests.
// ========================================================
// Extract sample image from the compressed sample_images.tar.bz2 file used by
// the unittests.
genrule {
    name: "ue_unittest_disk_imgs",
    cmd: "tar -jxf $(in) -C $(genDir)/gen disk_ext2_1k.img disk_ext2_4k.img disk_ext2_4k_empty.img disk_ext2_unittest.img",
    srcs: ["sample_images/sample_images.tar.bz2"],
    out: [
        "gen/disk_ext2_1k.img",
        "gen/disk_ext2_4k.img",
        "gen/disk_ext2_4k_empty.img",
        "gen/disk_ext2_unittest.img",
    ],
}

genrule {
    name: "ue_unittest_erofs_imgs",
    cmd: "$(in) $(location mkfs.erofs) $(location gen/erofs_empty.img) && " +
        "$(in) $(location mkfs.erofs) $(location gen/erofs.img) $(location delta_generator) && " +
        "$(in) $(location mkfs.erofs) $(location gen/erofs_new.img) $(location delta_generator) lz4hc,7",
    srcs: ["sample_images/generate_test_erofs_images.sh"],
    out: [
        "gen/erofs.img",
        "gen/erofs_new.img",
        "gen/erofs_empty.img",
    ],
    tools: [
        "mkfs.erofs",
        "delta_generator",
    ],
}

filegroup {
    name: "update_engine_host_unittest_timeout_srcs",
    srcs: [
        "common/action_processor_unittest.cc",
        "common/file_fetcher_unittest.cc",
        "payload_generator/delta_diff_utils_unittest.cc",
    ],
}

filegroup {
    name: "update_engine_host_unittest_srcs",
    srcs: [
        "common/action_pipe_unittest.cc",
        "common/action_processor_unittest.cc",
        "common/action_unittest.cc",
        "common/cow_operation_convert_unittest.cc",
        "common/cpu_limiter_unittest.cc",
        "common/fake_prefs.cc",
        "common/file_fetcher_unittest.cc",
        "common/hash_calculator_unittest.cc",
        "common/hwid_override_unittest.cc",
        "common/metrics_reporter_stub.cc",
        "common/mock_http_fetcher.cc",
        "common/prefs_unittest.cc",
        "common/terminator_unittest.cc",
        "common/test_utils.cc",
        "lz4diff/lz4diff_compress_unittest.cc",
        "lz4diff/lz4diff_unittest.cc",
        "payload_generator/ab_generator_unittest.cc",
        "payload_generator/blob_file_writer_unittest.cc",
        "payload_generator/block_mapping_unittest.cc",
        "payload_generator/boot_img_filesystem_unittest.cc",
        "payload_generator/deflate_utils_unittest.cc",
        "payload_generator/delta_diff_utils_unittest.cc",
        "payload_generator/erofs_filesystem_unittest.cc",
        "payload_generator/ext2_filesystem_unittest.cc",
        "payload_generator/extent_ranges_unittest.cc",
        "payload_generator/extent_utils_unittest.cc",
        "payload_generator/fake_filesystem.cc",
        "payload_generator/full_update_generator_unittest.cc",
        "payload_generator/mapfile_filesystem_unittest.cc",
        "payload_generator/merge_sequence_generator_unittest.cc",
        "payload_generator/payload_file_unittest.cc",
        "payload_generator/payload_generation_config_android_unittest.cc",
        "payload_generator/payload_generation_config_unittest.cc",
        "payload_generator/payload_properties_unittest.cc",
        "payload_generator/payload_signer_unittest.cc",
        "payload_generator/squashfs_filesystem_unittest.cc",
        "payload_generator/zip_unittest.cc",
        "payload_consumer/verity_writer_android_unittest.cc",
        "payload_consumer/xz_extent_writer_unittest.cc",
        "testrunner.cc",
    ],
}

cc_test_host {
    name: "update_engine_host_unittests",
    defaults: [
        "ue_defaults",
        "libpayload_generator_exports",
    ],
    strip: {
        none: true,
    },
    cflags: [
        "-g3",
    ],
    tidy_timeout_srcs: [":update_engine_host_unittest_timeout_srcs"],
    srcs: [":update_engine_host_unittest_srcs"],
    data: [
        ":ue_unittest_delta_generator",
        ":ue_unittest_disk_imgs",
        ":ue_unittest_erofs_imgs",
        ":ue_unittest_keys",
        "otacerts.zip",
        "unittest_key.pem",
        "unittest_key2.pem",
        "unittest_key_RSA4096.pem",
        "unittest_key_EC.pem",
        "update_engine.conf",
        "testdata/cycle_nodes_product.bin",
        "testdata/cycle_nodes_product_no_xor.bin",
    ],
    static_libs: [
        "libgmock",
        "libpayload_generator",
    ],
}

// update_engine_unittests (type: executable)
// ========================================================
// Main unittest file.
cc_test {
    name: "update_engine_http_unittests",
    defaults: [
        "ue_defaults",
        "liblz4diff_defaults",
        "update_metadata-protos_exports",
    ],
    require_root: true,
    static_libs: [
        "libbase",
        "libbrillo-test-helpers",
        "libchrome_test_helpers",
        "libcurl",
        "libcutils",
        "libdm",
        "libgmock",
        "libz",
        "libzstd",
    ],
    shared_libs: [
        "libssl",
        "libcrypto",
        "libziparchive",
        "liblog",
    ],

    data: [
        ":test_http_server",
        ":test_subprocess",
        ":ue_unittest_keys",
        "otacerts.zip",
        "unittest_key.pem",
        "unittest_key2.pem",
        "unittest_key_RSA4096.pem",
        "unittest_key_EC.pem",
    ],

    // We cannot use the default generated AndroidTest.xml because of the use of helper modules
    // (i.e. test_http_server, test_subprocess, ue_unittest_delta_generator).
    // test_config: "test_config.xml",
    test_suites: ["device-tests"],

    srcs: [
        "aosp/platform_constants_android.cc",
        "certificate_checker.cc",
        "common/action_processor.cc",
        "common/boot_control_stub.cc",
        "common/error_code_utils.cc",
        "common/file_fetcher.cc",
        "common/hash_calculator.cc",
        "common/http_fetcher.cc",
        "common/multi_range_http_fetcher.cc",
        "common/http_common.cc",
        "common/subprocess.cc",
        "common/test_utils.cc",
        "common/utils.cc",
        "libcurl_http_fetcher.cc",
        "payload_consumer/certificate_parser_android.cc",
        "payload_consumer/payload_verifier.cc",
        "payload_generator/payload_signer.cc",
        "update_status_utils.cc",
        "certificate_checker_unittest.cc",
        "common/http_fetcher_unittest.cc",
        "common/mock_http_fetcher.cc",
        "common/subprocess_unittest.cc",
        "libcurl_http_fetcher_unittest.cc",
        "payload_consumer/certificate_parser_android_unittest.cc",
        "update_status_utils_unittest.cc",
    ],
}

// update_engine_unittests (type: executable)
// ========================================================
// Main unittest file.
cc_test {
    name: "update_engine_unittests",
    defaults: [
        "ue_defaults",
        "libpayload_generator_exports",
        "libupdate_engine_android_exports",
    ],

    static_libs: [
        "libpayload_generator",
        "libbrillo-test-helpers",
        "libgmock",
        "libchrome_test_helpers",
        "libupdate_engine_android",
        "libdm",
    ],

    header_libs: [
        "libstorage_literals_headers",
    ],

    data: [
        ":ue_unittest_delta_generator",
        ":ue_unittest_disk_imgs",
        ":ue_unittest_erofs_imgs",
        ":ue_unittest_keys",
        "otacerts.zip",
        "unittest_key.pem",
        "unittest_key2.pem",
        "unittest_key_RSA4096.pem",
        "unittest_key_EC.pem",
        "update_engine.conf",
        "testdata/cycle_nodes_product.bin",
        "testdata/cycle_nodes_product_no_xor.bin",
    ],

    // We cannot use the default generated AndroidTest.xml because of the use of helper modules
    // (i.e. test_http_server, test_subprocess, ue_unittest_delta_generator).
    test_config: "test_config.xml",
    test_suites: ["device-tests"],

    tidy_timeout_srcs: [
        ":update_engine_host_unittest_timeout_srcs",
        "aosp/dynamic_partition_control_android_unittest.cc",
        "common/http_fetcher_unittest.cc",
        "payload_consumer/delta_performer_integration_test.cc",
        "payload_consumer/delta_performer_unittest.cc",
    ],
    srcs: [
        ":update_engine_host_unittest_srcs",
        "aosp/apex_handler_android_unittest.cc",
        "aosp/cleanup_previous_update_action_unittest.cc",
        "aosp/dynamic_partition_control_android_unittest.cc",
        "aosp/update_attempter_android_integration_test.cc",
        "aosp/update_attempter_android_unittest.cc",
        "common/utils_unittest.cc",
        "download_action_android_unittest.cc",
        "payload_consumer/block_extent_writer_unittest.cc",
        "payload_consumer/bzip_extent_writer_unittest.cc",
        "payload_consumer/cached_file_descriptor_unittest.cc",
        "payload_consumer/cow_writer_file_descriptor_unittest.cc",
        "payload_consumer/delta_performer_integration_test.cc",
        "payload_consumer/delta_performer_unittest.cc",
        "payload_consumer/extent_reader_unittest.cc",
        "payload_consumer/extent_writer_unittest.cc",
        "payload_consumer/extent_map_unittest.cc",
        "payload_consumer/fake_file_descriptor.cc",
        "payload_consumer/file_descriptor_utils_unittest.cc",
        "payload_consumer/file_writer_unittest.cc",
        "payload_consumer/filesystem_verifier_action_unittest.cc",
        "payload_consumer/install_plan_unittest.cc",
        "payload_consumer/install_operation_executor_unittest.cc",
        "payload_consumer/partition_update_generator_android_unittest.cc",
        "payload_consumer/partition_writer_unittest.cc",
        "payload_consumer/postinstall_runner_action_unittest.cc",
        "payload_consumer/snapshot_extent_writer_unittest.cc",
        "payload_consumer/vabc_partition_writer_unittest.cc",
        "payload_consumer/xor_extent_writer_unittest.cc",
    ],
}

// update_engine_unittests (type: executable)
// ========================================================
// Main unittest file.
cc_test {
    name: "update_engine_recovery_unittests",
    defaults: [
        "ue_defaults",
        "update_metadata-protos_exports",
    ],
    cflags: [
        "-D__ANDROID_RECOVERY__",
    ],

    static_libs: [
        "libbrillo-test-helpers",
        "libbase",
        "liblog",
        "libgmock",
        "libchrome_test_helpers",
        "libupdate_engine_android",
        "update_metadata-protos",
        "libsnapshot_cow",
        "libdm",
    ],

    header_libs: [
        "libstorage_literals_headers",
    ],
    test_suites: ["device-tests"],
    srcs: [
        "payload_consumer/postinstall_runner_action_recovery_unittest.cc",
        "payload_consumer/postinstall_runner_action.cc",
        "common/subprocess.cc",
        "common/test_utils.cc",
        "common/utils.cc",
        "common/dynamic_partition_control_stub.cc",
        "common/action_processor.cc",
        "common/error_code_utils.cc",
    ],
}

// Brillo update payload generation script
// ========================================================
sh_binary {
    name: "brillo_update_payload",
    device_supported: false,
    host_supported: true,

    src: "scripts/brillo_update_payload",
    required: [
        "delta_generator",
        "shflags",
        "simg2img",
    ],

    target: {
        darwin: {
            enabled: false,
        },
    },
}

// update_engine header library
cc_library_headers {
    name: "libupdate_engine_headers",

    // This header library is available to core and product modules.
    product_available: true,

    export_include_dirs: ["."],
    apex_available: [
        "com.android.gki.*",
        "//apex_available:platform",
    ],
    host_supported: true,
    recovery_available: true,
    ramdisk_available: true,
    vendor_ramdisk_available: true,

    target: {
        darwin: {
            enabled: false,
        },
    },
}

cc_binary_host {
    name: "cow_converter",
    defaults: [
        "ue_defaults",
        "libpayload_consumer_exports",
    ],
    srcs: [
        "aosp/cow_converter.cc",
    ],
    static_libs: [
        "liblog",
        "libbrotli",
        "libbase",
        "libcow_operation_convert",
        "libcow_size_estimator",
        "libgflags",
        "libpayload_consumer",
        "libpayload_extent_ranges",
        "libpayload_extent_utils",
        "libsnapshot_cow",
        "libz",
        "update_metadata-protos",
    ],
}

cc_library_static {
    name: "lz4diff-protos",
    host_supported: true,
    ramdisk_available: true,
    recovery_available: true,

    srcs: ["lz4diff/lz4diff.proto"],
    cflags: [
        "-Wall",
        "-Werror",
    ],
    proto: {
        canonical_path_from_root: false,
        export_proto_headers: true,
    },
}

cc_binary_host {
    name: "ota_extractor",
    defaults: [
        "ue_defaults",
        "libpayload_consumer_exports",
    ],
    srcs: [
        "aosp/ota_extractor.cc",
    ],
    static_libs: [
        "liblog",
        "libbrotli",
        "libbase",
        "libpayload_consumer",
        "libpayload_extent_ranges",
        "libpayload_extent_utils",
        "libz",
        "libgflags",
        "update_metadata-protos",
    ],
}

cc_binary_host {
    name: "map_file_generator",
    defaults: [
        "ue_defaults",
        "libpayload_generator_exports",
    ],
    srcs: [
        "aosp/map_file_generator.cc",
    ],
    static_libs: [
        "liblog",
        "libbase",
        "libpayload_generator",
        "libpayload_extent_ranges",
        "libpayload_extent_utils",
        "libgflags",
        "libsparse",
        "update_metadata-protos",
    ],
    required: [
        "unsquashfs",
    ],
}

cc_fuzz {
    name: "update_engine_service_fuzzer",
    defaults: [
        "ue_defaults",
        "libupdate_engine_android_exports",
        "service_fuzzer_defaults",
        "fuzzer_disable_leaks",
    ],
    static_libs: [
        "libupdate_engine_android",
        "libgflags",
    ],
    srcs: [
        "fuzzers/update_engine_service_fuzzer.cpp",
        "aosp/metrics_reporter_android.cc",
    ],
    fuzz_config: {
        triage_assignee: "waghpawan@google.com",
        cc: [
            "elsk@google.com",
            "zhangkelvin@google.com",
        ],
    },
}
