/*
 *  Copyright 2019 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 "rtc_base/experiments/keyframe_interval_settings.h"
#include "test/field_trial.h"
#include "test/gtest.h"

namespace webrtc {
namespace {

TEST(KeyframeIntervalSettingsTest, ParsesMinKeyframeSendIntervalMs) {
  EXPECT_FALSE(KeyframeIntervalSettings::ParseFromFieldTrials()
                   .MinKeyframeSendIntervalMs());

  test::ScopedFieldTrials field_trials(
      "WebRTC-KeyframeInterval/min_keyframe_send_interval_ms:100/");
  EXPECT_EQ(KeyframeIntervalSettings::ParseFromFieldTrials()
                .MinKeyframeSendIntervalMs(),
            100);
}

TEST(KeyframeIntervalSettingsTest, ParsesMaxWaitForKeyframeMs) {
  EXPECT_FALSE(
      KeyframeIntervalSettings::ParseFromFieldTrials().MaxWaitForKeyframeMs());

  test::ScopedFieldTrials field_trials(
      "WebRTC-KeyframeInterval/max_wait_for_keyframe_ms:100/");
  EXPECT_EQ(
      KeyframeIntervalSettings::ParseFromFieldTrials().MaxWaitForKeyframeMs(),
      100);
}

TEST(KeyframeIntervalSettingsTest, ParsesMaxWaitForFrameMs) {
  EXPECT_FALSE(
      KeyframeIntervalSettings::ParseFromFieldTrials().MaxWaitForFrameMs());

  test::ScopedFieldTrials field_trials(
      "WebRTC-KeyframeInterval/max_wait_for_frame_ms:100/");
  EXPECT_EQ(
      KeyframeIntervalSettings::ParseFromFieldTrials().MaxWaitForFrameMs(),
      100);
}

TEST(KeyframeIntervalSettingsTest, ParsesAllValues) {
  test::ScopedFieldTrials field_trials(
      "WebRTC-KeyframeInterval/"
      "min_keyframe_send_interval_ms:100,"
      "max_wait_for_keyframe_ms:101,"
      "max_wait_for_frame_ms:102/");
  EXPECT_EQ(KeyframeIntervalSettings::ParseFromFieldTrials()
                .MinKeyframeSendIntervalMs(),
            100);
  EXPECT_EQ(
      KeyframeIntervalSettings::ParseFromFieldTrials().MaxWaitForKeyframeMs(),
      101);
  EXPECT_EQ(
      KeyframeIntervalSettings::ParseFromFieldTrials().MaxWaitForFrameMs(),
      102);
}

TEST(KeyframeIntervalSettingsTest, DoesNotParseAllValuesWhenIncorrectlySet) {
  EXPECT_FALSE(
      KeyframeIntervalSettings::ParseFromFieldTrials().MaxWaitForFrameMs());

  test::ScopedFieldTrials field_trials(
      "WebRTC-KeyframeInterval/"
      "min_keyframe_send_interval_ms:a,"
      "max_wait_for_keyframe_ms:b,"
      "max_wait_for_frame_ms:c/");
  EXPECT_FALSE(KeyframeIntervalSettings::ParseFromFieldTrials()
                   .MinKeyframeSendIntervalMs());
  EXPECT_FALSE(
      KeyframeIntervalSettings::ParseFromFieldTrials().MaxWaitForKeyframeMs());
  EXPECT_FALSE(
      KeyframeIntervalSettings::ParseFromFieldTrials().MaxWaitForFrameMs());
}

}  // namespace
}  // namespace webrtc
