# Copyright 2014 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.

# Note that this build file assumes rlz_use_chrome_net which is a condition in
# the GYP file, but is always true for Chrome builds.

import("//testing/test.gni")

config("rlz_lib_config") {
  defines = [ "RLZ_NETWORK_IMPLEMENTATION_CHROME_NET" ]
}

source_set("rlz_utils") {
  sources = [
    "lib/assert.cc",
    "lib/assert.h",
    "lib/crc32.h",
    "lib/crc32_wrapper.cc",
    "lib/lib_values.cc",
    "lib/lib_values.h",
    "lib/net_response_check.cc",
    "lib/net_response_check.h",
    "lib/rlz_api.h",
    "lib/rlz_enums.h",
    "lib/string_utils.cc",
    "lib/string_utils.h",
  ]

  public_deps = [ "//base" ]

  deps = [ "//third_party/zlib" ]
}

if (!is_android) {
  source_set("rlz_lib_no_network") {
    sources = [
      "chromeos/lib/rlz_value_store_chromeos.cc",
      "chromeos/lib/rlz_value_store_chromeos.h",
      "ios/lib/machine_id_ios.cc",
      "lib/crc8.cc",
      "lib/crc8.h",
      "lib/machine_deal_win.h",
      "lib/machine_id.cc",
      "lib/machine_id.h",
      "lib/rlz_lib_clear.cc",
      "lib/rlz_lib_clear.h",
      "lib/rlz_value_store.h",
      "lib/supplementary_branding.cc",
      "lib/supplementary_branding.h",
      "lib/time_util.h",
      "mac/lib/machine_id_mac.cc",
      "mac/lib/rlz_value_store_mac.h",
      "mac/lib/rlz_value_store_mac.mm",
      "win/lib/lib_mutex.cc",
      "win/lib/lib_mutex.h",
      "win/lib/machine_deal.cc",
      "win/lib/machine_deal.h",
      "win/lib/machine_id_win.cc",
      "win/lib/process_info.cc",
      "win/lib/process_info.h",
      "win/lib/registry_util.cc",
      "win/lib/registry_util.h",
      "win/lib/rlz_lib_win.cc",
      "win/lib/rlz_value_store_registry.cc",
      "win/lib/rlz_value_store_registry.h",
    ]

    if (is_win) {
      sources += [ "lib/time_util_win.cc" ]
    } else {
      sources += [ "lib/time_util_base.cc" ]
    }

    deps = [
      ":rlz_utils",
      "//base",
    ]

    if (is_chromeos) {
      deps += [
        "//chromeos/dbus",
        "//chromeos/system",
      ]
    }

    if (is_mac) {
      libs = [
        "Foundation.framework",
        "IOKit.framework",
      ]
    }

    if (is_ios) {
      # These _mac files are also used on iOS.
      set_sources_assignment_filter([])
      sources += [
        "mac/lib/rlz_value_store_mac.h",
        "mac/lib/rlz_value_store_mac.mm",
      ]
      set_sources_assignment_filter(sources_assignment_filter)
    }

    if (is_posix) {
      sources += [
        "lib/recursive_cross_process_lock_posix.cc",
        "lib/recursive_cross_process_lock_posix.h",
      ]
    }
  }

  source_set("rlz_lib") {
    sources = [
      "lib/financial_ping.cc",
      "lib/financial_ping.h",
      "lib/rlz_lib.cc",
      "lib/rlz_lib.h",
    ]

    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

    public_deps = [
      ":rlz_lib_no_network",
      "//base",
    ]

    deps = [
      ":rlz_utils",
      "//base/third_party/dynamic_annotations",
      "//net",
      "//services/network/public/cpp:cpp",
      "//services/network/public/mojom",
      "//url",
    ]

    if (is_chromeos) {
      deps += [
        "//chromeos/dbus",
        "//chromeos/system",
      ]
    }

    public_configs = [ ":rlz_lib_config" ]
  }

  source_set("test_support") {
    testonly = true
    sources = [
      "test/rlz_test_helpers.cc",
      "test/rlz_test_helpers.h",
    ]
    public_deps = [
      "//base",
      "//base/test:test_support",
      "//testing/gtest",
    ]
    deps = [ ":rlz_lib" ]
    if (is_chromeos) {
      public_deps += [ "//chromeos/system" ]
    }
  }

  test("rlz_unittests") {
    sources = [
      "lib/crc32_unittest.cc",
      "lib/crc8_unittest.cc",
      "lib/financial_ping_test.cc",
      "lib/lib_values_unittest.cc",
      "lib/machine_id_unittest.cc",
      "lib/rlz_lib_test.cc",
      "lib/string_utils_unittest.cc",
      "test/rlz_unittest_main.cc",
      "win/lib/machine_deal_test.cc",
    ]

    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

    deps = [
      ":rlz_lib",
      ":rlz_utils",
      ":test_support",
      "//base",
      "//mojo/core/embedder",
      "//net:test_support",
      "//services/network:test_support",
      "//testing/gmock",
      "//testing/gtest",
      "//third_party/zlib",
    ]
    if (is_chromeos) {
      deps += [
        "//chromeos/dbus:test_support",
        "//chromeos/system",
      ]
    }
  }
}

if (!is_ios && !is_android) {
  executable("rlz_id") {
    sources = [ "examples/rlz_id.cc" ]
    deps = [
      ":rlz_lib",
      "//build/win:default_exe_manifest",
    ]
  }
}

if (is_win) {
  shared_library("rlz") {
    sources = [
      "win/dll/dll_main.cc",
      "win/dll/exports.cc",
    ]
    deps = [
      ":rlz_lib",
      ":rlz_utils",
      "//third_party/zlib",
    ]
  }
}
