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

import("//build/config/jumbo.gni")
import("//testing/test.gni")

jumbo_static_library("rappor") {
  sources = [
    "bloom_filter.cc",
    "bloom_filter.h",
    "byte_vector_utils.cc",
    "byte_vector_utils.h",
    "log_uploader.cc",
    "log_uploader.h",
    "log_uploader_interface.h",
    "rappor_metric.cc",
    "rappor_metric.h",
    "rappor_parameters.cc",
    "rappor_pref_names.cc",
    "rappor_pref_names.h",
    "rappor_prefs.cc",
    "rappor_prefs.h",
    "rappor_service_impl.cc",
    "rappor_service_impl.h",
    "rappor_utils.cc",
    "reports.cc",
    "reports.h",
    "sample.cc",
    "sampler.cc",
    "sampler.h",
  ]

  public_deps = [
    "//components/rappor/proto",
    "//components/rappor/public",
  ]

  deps = [
    "//base",
    "//components/metrics",
    "//components/prefs",
    "//components/variations",
    "//crypto",
    "//net",
    "//services/network/public/cpp:cpp",
    "//third_party/smhasher:cityhash",
  ]
}

jumbo_static_library("rappor_recorder") {
  sources = [
    "rappor_recorder_impl.cc",
    "rappor_recorder_impl.h",
  ]

  public_deps = [
    "//base",
    "//components/rappor/public/mojom",
  ]

  deps = [
    ":rappor",
    "//mojo/public/cpp/bindings",
  ]
}

jumbo_static_library("test_support") {
  testonly = true
  sources = [
    "test_log_uploader.cc",
    "test_log_uploader.h",
    "test_rappor_service.cc",
    "test_rappor_service.h",
  ]

  public_deps = [
    ":rappor",
  ]
  deps = [
    "//base",
    "//components/prefs:test_support",
  ]
}

jumbo_source_set("unit_tests") {
  testonly = true
  sources = [
    "bloom_filter_unittest.cc",
    "byte_vector_utils_unittest.cc",
    "log_uploader_unittest.cc",
    "rappor_metric_unittest.cc",
    "rappor_prefs_unittest.cc",
    "rappor_service_unittest.cc",
    "rappor_utils_unittest.cc",
    "reports_unittest.cc",
    "sampler_unittest.cc",
  ]

  deps = [
    ":rappor",
    ":test_support",
    "//base",
    "//base/test:test_support",
    "//components/metrics",
    "//components/prefs:test_support",
    "//net:test_support",
    "//services/network:test_support",
    "//services/network/public/cpp:cpp",
    "//testing/gtest",
    "//url",
  ]
}

# Convenience testing target
test("rappor_unittests") {
  sources = [
    "//components/test/run_all_unittests.cc",
  ]
  deps = [
    ":unit_tests",
    "//components/test:test_support",
  ]
}
