# 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",
    "caching_permuted_entropy_provider.cc",
    "caching_permuted_entropy_provider.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",
    "experiment_labels.cc",
    "experiment_labels.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/permuted_entropy_cache.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_experiment_util.cc",
    "variations_experiment_util.h",
    "variations_http_header_provider.cc",
    "variations_http_header_provider.h",
    "variations_id_collection.cc",
    "variations_id_collection.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_starboard) {
    sources -= [
      # These bring in JNI, which we do not want to bring into Cobalt.
      "android/variations_associated_data_android.cc",
      "android/variations_seed_bridge.cc",
      "android/variations_seed_bridge.h",
      # The ".proto" files were referenced here directly, but caused the build
      # to fail.
      "proto/client_variations.proto",
      "proto/permuted_entropy_cache.proto",
      "proto/study.proto",
      "proto/variations_seed.proto",
    ]
  }

  if (!use_cobalt_customizations && (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 && !use_cobalt_customizations) {
    deps += [ ":jni" ]
  }
}

if (is_android && !use_cobalt_customizations) {
  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" ]
  }
}

# TODO(b/283258321): Re-enable as many tests as posible.
if (!use_cobalt_customizations) {
  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",
      "caching_permuted_entropy_provider_unittest.cc",
      "child_process_field_trial_syncer_unittest.cc",
      "entropy_provider_unittest.cc",
      "experiment_labels_unittest.cc",
      "hashing_unittest.cc",
      "net/variations_command_line_unittest.cc",
      "net/variations_http_headers_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_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/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",
    ]
  }
}
