# 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("//testing/test.gni")

if (is_android) {
  import("//build/config/android/rules.gni")
}

static_library("variations") {
  sources = [
    "active_field_trials.cc",
    "active_field_trials.h",
    "android/variations_associated_data_android.cc",
    "android/variations_seed_bridge.cc",
    "android/variations_seed_bridge.h",
    "child_process_field_trial_syncer.cc",
    "child_process_field_trial_syncer.h",
    "client_filterable_state.cc",
    "client_filterable_state.h",
    "entropy_provider.cc",
    "entropy_provider.h",
    "hashing.cc",
    "hashing.h",
    "metrics.cc",
    "metrics.h",
    "platform_field_trials.h",
    "pref_names.cc",
    "pref_names.h",
    "processed_study.cc",
    "processed_study.h",
    "proto/client_variations.proto",
    "proto/study.proto",
    "proto/variations_seed.proto",
    "seed_response.cc",
    "seed_response.h",
    "study_filtering.cc",
    "study_filtering.h",
    "synthetic_trial_registry.cc",
    "synthetic_trial_registry.h",
    "synthetic_trials.cc",
    "synthetic_trials.h",
    "synthetic_trials_active_group_id_provider.cc",
    "synthetic_trials_active_group_id_provider.h",
    "variations_associated_data.cc",
    "variations_associated_data.h",
    "variations_crash_keys.cc",
    "variations_crash_keys.h",
    "variations_http_header_provider.cc",
    "variations_http_header_provider.h",
    "variations_id_collection.cc",
    "variations_id_collection.h",
    "variations_murmur_hash.cc",
    "variations_murmur_hash.h",
    "variations_request_scheduler.cc",
    "variations_request_scheduler.h",
    "variations_seed_processor.cc",
    "variations_seed_processor.h",
    "variations_seed_simulator.cc",
    "variations_seed_simulator.h",
    "variations_seed_store.cc",
    "variations_seed_store.h",
    "variations_switches.cc",
    "variations_switches.h",
    "variations_url_constants.cc",
    "variations_url_constants.h",
  ]

  if (is_android || is_ios) {
    sources += [
      "variations_request_scheduler_mobile.cc",
      "variations_request_scheduler_mobile.h",
    ]
  }

  deps = [
    "proto",
    "//base",
    "//components/crash/core/common:crash_key",
    "//components/prefs",
    "//crypto",
    "//third_party/protobuf:protobuf_lite",
    "//third_party/zlib/google:compression_utils",
  ]

  if (is_android) {
    deps += [ ":jni" ]
  }
}

if (is_android) {
  generate_jni("jni") {
    sources = [
      "android/java/src/org/chromium/components/variations/VariationsAssociatedData.java",
      "android/java/src/org/chromium/components/variations/firstrun/VariationsSeedBridge.java",
    ]
    jni_package = "variations"
  }

  android_library("load_seed_result_enum_java") {
    deps = [
      "//base:base_java",
    ]
    srcjar_deps = [ ":load_seed_result_enum_srcjar" ]
  }

  java_cpp_enum("load_seed_result_enum_srcjar") {
    sources = [
      "metrics.h",
    ]
  }
}

static_library("test_support") {
  testonly = true
  sources = [
    "variations_params_manager.cc",
    "variations_params_manager.h",
  ]

  public_deps = [
    ":variations",
  ]

  deps = [
    "field_trial_config:field_trial_config",
    "//base/test:test_support",
  ]
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "active_field_trials_unittest.cc",
    "child_process_field_trial_syncer_unittest.cc",
    "entropy_provider_unittest.cc",
    "hashing_unittest.cc",
    "net/variations_command_line_unittest.cc",
    "net/variations_http_headers_unittest.cc",
    "simulate_for_crosstalk_unittest.cc",
    "study_filtering_unittest.cc",
    "synthetic_trial_registry_unittest.cc",
    "variations_associated_data_unittest.cc",
    "variations_crash_keys_unittest.cc",
    "variations_http_header_provider_unittest.cc",
    "variations_id_collection_unittest.cc",
    "variations_murmur_hash_unittest.cc",
    "variations_request_scheduler_unittest.cc",
    "variations_seed_processor_unittest.cc",
    "variations_seed_simulator_unittest.cc",
    "variations_seed_store_unittest.cc",
  ]

  if (is_android || is_ios) {
    sources += [ "variations_request_scheduler_mobile_unittest.cc" ]
  }

  deps = [
    ":variations",
    "net",
    "proto",
    "//base/test:test_support",
    "//components/crash/core/common:crash_key",
    "//components/prefs:test_support",
    "//components/variations/field_trial_config:field_trial_config",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/smhasher:murmurhash3",
    "//third_party/zlib/google:compression_utils",
  ]
}

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