/*
 *  Copyright 2018 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 "test/gtest.h"
#include "test/scenario/scenario.h"

namespace webrtc {
namespace test {
namespace {
void CreateAnalyzedStream(Scenario* s,
                          NetworkNodeConfig network_config,
                          VideoQualityAnalyzer* analyzer) {
  VideoStreamConfig config;
  config.encoder.codec = VideoStreamConfig::Encoder::Codec::kVideoCodecVP8;
  config.encoder.implementation =
      VideoStreamConfig::Encoder::Implementation::kSoftware;
  config.hooks.frame_pair_handlers = {analyzer->Handler()};
  auto route = s->CreateRoutes(s->CreateClient("caller", CallClientConfig()),
                               {s->CreateSimulationNode(network_config)},
                               s->CreateClient("callee", CallClientConfig()),
                               {s->CreateSimulationNode(NetworkNodeConfig())});
  s->CreateVideoStream(route->forward(), config);
}
}  // namespace

TEST(ScenarioAnalyzerTest, PsnrIsHighWhenNetworkIsGood) {
  VideoQualityAnalyzer analyzer;
  {
    Scenario s;
    NetworkNodeConfig good_network;
    good_network.simulation.bandwidth = DataRate::kbps(1000);
    CreateAnalyzedStream(&s, good_network, &analyzer);
    s.RunFor(TimeDelta::seconds(1));
  }
  // This is mainty a regression test, the target is based on previous runs and
  // might change due to changes in configuration and encoder etc.
  EXPECT_GT(analyzer.stats().psnr.Mean(), 45);
}

TEST(ScenarioAnalyzerTest, PsnrIsLowWhenNetworkIsBad) {
  VideoQualityAnalyzer analyzer;
  {
    Scenario s;
    NetworkNodeConfig bad_network;
    bad_network.simulation.bandwidth = DataRate::kbps(100);
    bad_network.simulation.loss_rate = 0.02;
    CreateAnalyzedStream(&s, bad_network, &analyzer);
    s.RunFor(TimeDelta::seconds(1));
  }
  // This is mainty a regression test, the target is based on previous runs and
  // might change due to changes in configuration and encoder etc.
  EXPECT_LT(analyzer.stats().psnr.Mean(), 43);
}
}  // namespace test
}  // namespace webrtc
