// Copyright 2016 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.

#include "base/metrics/field_trial_param_associator.h"

#include "base/metrics/field_trial.h"

namespace base {

FieldTrialParamAssociator::FieldTrialParamAssociator() = default;
FieldTrialParamAssociator::~FieldTrialParamAssociator() = default;

// static
FieldTrialParamAssociator* FieldTrialParamAssociator::GetInstance() {
  return Singleton<FieldTrialParamAssociator,
                   LeakySingletonTraits<FieldTrialParamAssociator>>::get();
}

bool FieldTrialParamAssociator::AssociateFieldTrialParams(
    const std::string& trial_name,
    const std::string& group_name,
    const FieldTrialParams& params) {
  if (FieldTrialList::IsTrialActive(trial_name))
    return false;

  AutoLock scoped_lock(lock_);
  const FieldTrialKey key(trial_name, group_name);
  if (ContainsKey(field_trial_params_, key))
    return false;

  field_trial_params_[key] = params;
  return true;
}

bool FieldTrialParamAssociator::GetFieldTrialParams(
    const std::string& trial_name,
    FieldTrialParams* params) {
  FieldTrial* field_trial = FieldTrialList::Find(trial_name);
  if (!field_trial)
    return false;

  // First try the local map, falling back to getting it from shared memory.
  if (GetFieldTrialParamsWithoutFallback(trial_name, field_trial->group_name(),
                                         params)) {
    return true;
  }

  // TODO(lawrencewu): add the params to field_trial_params_ for next time.
  return FieldTrialList::GetParamsFromSharedMemory(field_trial, params);
}

bool FieldTrialParamAssociator::GetFieldTrialParamsWithoutFallback(
    const std::string& trial_name,
    const std::string& group_name,
    FieldTrialParams* params) {
  AutoLock scoped_lock(lock_);

  const FieldTrialKey key(trial_name, group_name);
  if (!ContainsKey(field_trial_params_, key))
    return false;

  *params = field_trial_params_[key];
  return true;
}

void FieldTrialParamAssociator::ClearAllParamsForTesting() {
  {
    AutoLock scoped_lock(lock_);
    field_trial_params_.clear();
  }
  FieldTrialList::ClearParamsFromSharedMemoryForTesting();
}

void FieldTrialParamAssociator::ClearParamsForTesting(
    const std::string& trial_name,
    const std::string& group_name) {
  AutoLock scoped_lock(lock_);
  const FieldTrialKey key(trial_name, group_name);
  field_trial_params_.erase(key);
}

void FieldTrialParamAssociator::ClearAllCachedParamsForTesting() {
  AutoLock scoped_lock(lock_);
  field_trial_params_.clear();
}

}  // namespace base
