xref: /aosp_15_r20/external/webrtc/modules/audio_coding/neteq/test/result_sink.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "modules/audio_coding/neteq/test/result_sink.h"
12 
13 #include <string>
14 
15 #include "absl/strings/string_view.h"
16 #include "rtc_base/ignore_wundef.h"
17 #include "rtc_base/message_digest.h"
18 #include "rtc_base/string_encode.h"
19 #include "test/gtest.h"
20 
21 #ifdef WEBRTC_NETEQ_UNITTEST_BITEXACT
22 RTC_PUSH_IGNORING_WUNDEF()
23 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD
24 #include "external/webrtc/webrtc/modules/audio_coding/neteq/neteq_unittest.pb.h"
25 #else
26 #include "modules/audio_coding/neteq/neteq_unittest.pb.h"
27 #endif
28 RTC_POP_IGNORING_WUNDEF()
29 #endif
30 
31 namespace webrtc {
32 
33 #ifdef WEBRTC_NETEQ_UNITTEST_BITEXACT
Convert(const webrtc::NetEqNetworkStatistics & stats_raw,webrtc::neteq_unittest::NetEqNetworkStatistics * stats)34 void Convert(const webrtc::NetEqNetworkStatistics& stats_raw,
35              webrtc::neteq_unittest::NetEqNetworkStatistics* stats) {
36   stats->set_current_buffer_size_ms(stats_raw.current_buffer_size_ms);
37   stats->set_preferred_buffer_size_ms(stats_raw.preferred_buffer_size_ms);
38   stats->set_jitter_peaks_found(stats_raw.jitter_peaks_found);
39   stats->set_expand_rate(stats_raw.expand_rate);
40   stats->set_speech_expand_rate(stats_raw.speech_expand_rate);
41   stats->set_preemptive_rate(stats_raw.preemptive_rate);
42   stats->set_accelerate_rate(stats_raw.accelerate_rate);
43   stats->set_secondary_decoded_rate(stats_raw.secondary_decoded_rate);
44   stats->set_secondary_discarded_rate(stats_raw.secondary_discarded_rate);
45   stats->set_mean_waiting_time_ms(stats_raw.mean_waiting_time_ms);
46   stats->set_median_waiting_time_ms(stats_raw.median_waiting_time_ms);
47   stats->set_min_waiting_time_ms(stats_raw.min_waiting_time_ms);
48   stats->set_max_waiting_time_ms(stats_raw.max_waiting_time_ms);
49 }
50 
AddMessage(FILE * file,rtc::MessageDigest * digest,absl::string_view message)51 void AddMessage(FILE* file,
52                 rtc::MessageDigest* digest,
53                 absl::string_view message) {
54   int32_t size = message.length();
55   if (file)
56     ASSERT_EQ(1u, fwrite(&size, sizeof(size), 1, file));
57   digest->Update(&size, sizeof(size));
58 
59   if (file)
60     ASSERT_EQ(static_cast<size_t>(size),
61               fwrite(message.data(), sizeof(char), size, file));
62   digest->Update(message.data(), sizeof(char) * size);
63 }
64 
65 #endif  // WEBRTC_NETEQ_UNITTEST_BITEXACT
66 
ResultSink(absl::string_view output_file)67 ResultSink::ResultSink(absl::string_view output_file)
68     : output_fp_(nullptr),
69       digest_(rtc::MessageDigestFactory::Create(rtc::DIGEST_SHA_1)) {
70   if (!output_file.empty()) {
71     output_fp_ = fopen(std::string(output_file).c_str(), "wb");
72     EXPECT_TRUE(output_fp_ != NULL);
73   }
74 }
75 
~ResultSink()76 ResultSink::~ResultSink() {
77   if (output_fp_)
78     fclose(output_fp_);
79 }
80 
AddResult(const NetEqNetworkStatistics & stats_raw)81 void ResultSink::AddResult(const NetEqNetworkStatistics& stats_raw) {
82 #ifdef WEBRTC_NETEQ_UNITTEST_BITEXACT
83   neteq_unittest::NetEqNetworkStatistics stats;
84   Convert(stats_raw, &stats);
85 
86   std::string stats_string;
87   ASSERT_TRUE(stats.SerializeToString(&stats_string));
88   AddMessage(output_fp_, digest_.get(), stats_string);
89 #else
90   FAIL() << "Writing to reference file requires Proto Buffer.";
91 #endif  // WEBRTC_NETEQ_UNITTEST_BITEXACT
92 }
93 
VerifyChecksum(absl::string_view checksum)94 void ResultSink::VerifyChecksum(absl::string_view checksum) {
95   std::string buffer;
96   buffer.resize(digest_->Size());
97   digest_->Finish(buffer.data(), buffer.size());
98   const std::string result = rtc::hex_encode(buffer);
99   if (checksum.size() == result.size()) {
100     EXPECT_EQ(checksum, result);
101   } else {
102     // Check result is one the '|'-separated checksums.
103     EXPECT_NE(checksum.find(result), absl::string_view::npos)
104         << result << " should be one of these:\n"
105         << checksum;
106   }
107 }
108 
109 }  // namespace webrtc
110