/*
 *  Copyright (c) 2023 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_tools/rtc_event_log_visualizer/analyzer_bindings.h"

#include <string>
#include <vector>

#include "rtc_base/protobuf_utils.h"
#include "rtc_base/system/file_wrapper.h"
#include "test/gmock.h"
#include "test/gtest.h"
#include "test/testsupport/file_utils.h"

#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
#include "external/webrtc/webrtc/rtc_tools/rtc_event_log_visualizer/proto/chart.pb.h"
#else
#include "rtc_tools/rtc_event_log_visualizer/proto/chart.pb.h"
#endif

class RtcEventLogAnalyzerBindingsTest : public ::testing::Test {
  void SetUp() override {
    // Read an RTC event log to a char buffer.
    std::string file_name = webrtc::test::ResourcePath(
        "rtc_event_log/rtc_event_log_500kbps", "binarypb");
    webrtc::FileWrapper file = webrtc::FileWrapper::OpenReadOnly(file_name);
    ASSERT_TRUE(file.is_open());

    absl::optional<size_t> file_size = file.FileSize();
    ASSERT_TRUE(file_size.has_value());
    constexpr size_t kMaxFileSize = 1'000'000;
    ASSERT_GT(*file_size, 0u);
    ASSERT_LE(*file_size, kMaxFileSize);

    event_log_contents_.resize(*file_size);
    size_t read_size =
        file.Read(event_log_contents_.data(), event_log_contents_.size());
    ASSERT_EQ(*file_size, read_size);
  }

 protected:
  std::vector<char> event_log_contents_;
};

TEST_F(RtcEventLogAnalyzerBindingsTest, OutgoingBitrateChart) {
  uint32_t kMaxOutputSize = 1'000'000;
  std::vector<char> output(kMaxOutputSize);

  // Call analyzer.
  char selection[] = "outgoing_bitrate";
  size_t selection_size = strlen(selection);
  uint32_t output_size = output.size();
  analyze_rtc_event_log(event_log_contents_.data(), event_log_contents_.size(),
                        selection, selection_size, output.data(), &output_size);
  ASSERT_GT(output_size, 0u);

  // Parse output as charts.
  webrtc::analytics::ChartCollection collection;
  bool success =
      collection.ParseFromArray(output.data(), static_cast<int>(output_size));
  ASSERT_TRUE(success);
  ASSERT_EQ(collection.charts().size(), 1);
  EXPECT_EQ(collection.charts(0).title(), "Outgoing RTP bitrate");
  EXPECT_EQ(collection.charts(0).id(), "outgoing_bitrate");
}

TEST_F(RtcEventLogAnalyzerBindingsTest, NetWorkDelayFeedbackChart) {
  uint32_t kMaxOutputSize = 1'000'000;
  std::vector<char> output(kMaxOutputSize);

  // Call analyzer.
  char selection[] = "network_delay_feedback";
  size_t selection_size = strlen(selection);
  uint32_t output_size = output.size();
  analyze_rtc_event_log(event_log_contents_.data(), event_log_contents_.size(),
                        selection, selection_size, output.data(), &output_size);
  ASSERT_GT(output_size, 0u);

  // Parse output as charts.
  webrtc::analytics::ChartCollection collection;
  bool success =
      collection.ParseFromArray(output.data(), static_cast<int>(output_size));
  ASSERT_TRUE(success);
  ASSERT_EQ(collection.charts().size(), 1);
  EXPECT_EQ(collection.charts(0).title(),
            "Outgoing network delay (based on per-packet feedback)");
  EXPECT_EQ(collection.charts(0).id(), "network_delay_feedback");
}

TEST_F(RtcEventLogAnalyzerBindingsTest, OutputbufferTooSmall) {
  uint32_t kMaxOutputSize = 100;
  std::vector<char> output(kMaxOutputSize);

  // Call analyzer.
  char selection[] = "outgoing_bitrate";
  size_t selection_size = strlen(selection);
  uint32_t output_size = output.size();
  analyze_rtc_event_log(event_log_contents_.data(), event_log_contents_.size(),
                        selection, selection_size, output.data(), &output_size);

  // No output since the buffer is too small.
  ASSERT_EQ(output_size, 0u);
}
