/*
 *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/test/field_trial.h"

#include <algorithm>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <map>
#include <string>

#include "webrtc/system_wrappers/include/field_trial.h"
#include "webrtc/system_wrappers/include/field_trial_default.h"

namespace webrtc {
namespace {
bool field_trials_initiated_ = false;
}  // namespace

namespace test {
// Note: this code is copied from src/base/metrics/field_trial.cc since the aim
// is to mimic chromium --force-fieldtrials.
void InitFieldTrialsFromString(const std::string& trials_string) {
  static const char kPersistentStringSeparator = '/';

  // Catch an error if this is called more than once.
  assert(!field_trials_initiated_);
  field_trials_initiated_ = true;

  if (trials_string.empty())
    return;

  size_t next_item = 0;
  std::map<std::string, std::string> field_trials;
  while (next_item < trials_string.length()) {
    size_t name_end = trials_string.find(kPersistentStringSeparator, next_item);
    if (name_end == trials_string.npos || next_item == name_end)
      break;
    size_t group_name_end = trials_string.find(kPersistentStringSeparator,
                                               name_end + 1);
    if (group_name_end == trials_string.npos || name_end + 1 == group_name_end)
      break;
    std::string name(trials_string, next_item, name_end - next_item);
    std::string group_name(trials_string, name_end + 1,
                           group_name_end - name_end - 1);
    next_item = group_name_end + 1;

    // Fail if duplicate with different group name.
    if (field_trials.find(name) != field_trials.end() &&
        field_trials.find(name)->second != group_name) {
      break;
    }

    field_trials[name] = group_name;

    // Successfully parsed all field trials from the string.
    if (next_item == trials_string.length()) {
      webrtc::field_trial::InitFieldTrialsFromString(trials_string.c_str());
      return;
    }
  }
  // Using fprintf as LOG does not print when this is called early in main.
  fprintf(stderr, "Invalid field trials string.\n");

  // Using abort so it crashes in both debug and release mode.
  abort();
}

ScopedFieldTrials::ScopedFieldTrials(const std::string& config)
  : previous_field_trials_(webrtc::field_trial::GetFieldTrialString()) {
  assert(field_trials_initiated_);
  field_trials_initiated_ = false;
  current_field_trials_ = config;
  InitFieldTrialsFromString(current_field_trials_);
}

ScopedFieldTrials::~ScopedFieldTrials() {
  // Should still be initialized, since InitFieldTrials is called from ctor.
  // That's why we don't restore the flag.
  assert(field_trials_initiated_);
  webrtc::field_trial::InitFieldTrialsFromString(previous_field_trials_);
}

}  // namespace test
}  // namespace webrtc
