| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 /* | 
|  | 2  *  Copyright (c) 2015 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 #ifdef RTC_AUDIOCODING_DEBUG_DUMP | 
|  | 12 | 
|  | 13 #include <stdio.h> | 
|  | 14 #include <string> | 
|  | 15 #include <vector> | 
|  | 16 | 
|  | 17 #include "testing/gtest/include/gtest/gtest.h" | 
|  | 18 #include "webrtc/base/scoped_ptr.h" | 
|  | 19 #include "webrtc/modules/audio_coding/main/acm2/acm_dump.h" | 
|  | 20 #include "webrtc/system_wrappers/interface/clock.h" | 
|  | 21 #include "webrtc/test/test_suite.h" | 
|  | 22 #include "webrtc/test/testsupport/fileutils.h" | 
|  | 23 #include "webrtc/test/testsupport/gtest_disable.h" | 
|  | 24 | 
|  | 25 // Files generated at build-time by the protobuf compiler. | 
|  | 26 #ifdef WEBRTC_ANDROID_PLATFORM_BUILD | 
|  | 27 #include "external/webrtc/webrtc/modules/audio_coding/dump.pb.h" | 
|  | 28 #else | 
|  | 29 #include "webrtc/audio_coding/dump.pb.h" | 
|  | 30 #endif | 
|  | 31 | 
|  | 32 namespace webrtc { | 
|  | 33 | 
|  | 34 // Test for the acm dump class. Dumps some RTP packets to disk, then reads them | 
|  | 35 // back to see if they match. | 
|  | 36 class AcmDumpTest : public ::testing::Test { | 
|  | 37  public: | 
|  | 38   void VerifyResults(const ACMDumpEventStream& parsed_stream, | 
|  | 39                      size_t packet_size) { | 
|  | 40     // Verify the result. | 
|  | 41     EXPECT_EQ(5, parsed_stream.stream_size()); | 
|  | 42     const ACMDumpEvent& start_event = parsed_stream.stream(2); | 
|  | 43     ASSERT_TRUE(start_event.has_type()); | 
|  | 44     EXPECT_EQ(ACMDumpEvent::DEBUG_EVENT, start_event.type()); | 
|  | 45     EXPECT_TRUE(start_event.has_timestamp_us()); | 
|  | 46     EXPECT_FALSE(start_event.has_packet()); | 
|  | 47     ASSERT_TRUE(start_event.has_debug_event()); | 
|  | 48     auto start_debug_event = start_event.debug_event(); | 
|  | 49     ASSERT_TRUE(start_debug_event.has_type()); | 
|  | 50     EXPECT_EQ(ACMDumpDebugEvent::LOG_START, start_debug_event.type()); | 
|  | 51     ASSERT_TRUE(start_debug_event.has_message()); | 
|  | 52 | 
|  | 53     for (int i = 0; i < parsed_stream.stream_size(); i++) { | 
|  | 54       if (i == 2) { | 
|  | 55         // This is the LOG_START packet that was already verified. | 
|  | 56         continue; | 
|  | 57       } | 
|  | 58       const ACMDumpEvent& test_event = parsed_stream.stream(i); | 
|  | 59       ASSERT_TRUE(test_event.has_type()); | 
|  | 60       EXPECT_EQ(ACMDumpEvent::RTP_EVENT, test_event.type()); | 
|  | 61       EXPECT_TRUE(test_event.has_timestamp_us()); | 
|  | 62       EXPECT_FALSE(test_event.has_debug_event()); | 
|  | 63       ASSERT_TRUE(test_event.has_packet()); | 
|  | 64       const ACMDumpRTPPacket& test_packet = test_event.packet(); | 
|  | 65       ASSERT_TRUE(test_packet.has_direction()); | 
|  | 66       if (i <= 1) { | 
|  | 67         EXPECT_EQ(ACMDumpRTPPacket::INCOMING, test_packet.direction()); | 
|  | 68       } else if (i >= 3) { | 
|  | 69         EXPECT_EQ(ACMDumpRTPPacket::OUTGOING, test_packet.direction()); | 
|  | 70       } | 
|  | 71       ASSERT_TRUE(test_packet.has_rtp_data()); | 
|  | 72       ASSERT_EQ(packet_size, test_packet.rtp_data().size()); | 
|  | 73       for (size_t i = 0; i < packet_size; i++) { | 
|  | 74         EXPECT_EQ(rtp_packet_[i], | 
|  | 75                   static_cast<uint8_t>(test_packet.rtp_data()[i])); | 
|  | 76       } | 
|  | 77     } | 
|  | 78   } | 
|  | 79 | 
|  | 80   void Run(int packet_size, int random_seed) { | 
|  | 81     rtp_packet_.clear(); | 
|  | 82     rtp_packet_.reserve(packet_size); | 
|  | 83     srand(random_seed); | 
|  | 84     // Fill the packet vector with random data. | 
|  | 85     for (int i = 0; i < packet_size; i++) { | 
|  | 86       rtp_packet_.push_back(rand()); | 
|  | 87     } | 
|  | 88     // Find the name of the current test, in order to use it as a temporary | 
|  | 89     // filename. | 
|  | 90     auto test_info = ::testing::UnitTest::GetInstance()->current_test_info(); | 
|  | 91     const std::string temp_filename = | 
|  | 92         test::OutputPath() + test_info->test_case_name() + test_info->name(); | 
|  | 93 | 
|  | 94     // When log_dumper goes out of scope, it causes the log file to be flushed | 
|  | 95     // to disk. | 
|  | 96     { | 
|  | 97       rtc::scoped_ptr<AcmDump> log_dumper(AcmDump::Create()); | 
|  | 98       log_dumper->LogRtpPacket(true, rtp_packet_.data(), rtp_packet_.size()); | 
|  | 99       log_dumper->LogRtpPacket(true, rtp_packet_.data(), rtp_packet_.size()); | 
|  | 100       log_dumper->StartLogging(temp_filename, 10000000); | 
|  | 101       log_dumper->LogRtpPacket(false, rtp_packet_.data(), rtp_packet_.size()); | 
|  | 102       log_dumper->LogRtpPacket(false, rtp_packet_.data(), rtp_packet_.size()); | 
|  | 103     } | 
|  | 104 | 
|  | 105     // Read the generated file from disk. | 
|  | 106     ACMDumpEventStream parsed_stream; | 
|  | 107 | 
|  | 108     ASSERT_EQ(true, AcmDump::ParseAcmDump(temp_filename, &parsed_stream)); | 
|  | 109 | 
|  | 110     VerifyResults(parsed_stream, packet_size); | 
|  | 111 | 
|  | 112     // Clean up temporary file - can be pretty slow. | 
|  | 113     remove(temp_filename.c_str()); | 
|  | 114   } | 
|  | 115   std::vector<uint8_t> rtp_packet_; | 
|  | 116 }; | 
|  | 117 | 
|  | 118 TEST_F(AcmDumpTest, DumpAndRead) { | 
|  | 119   Run(256, 321); | 
|  | 120 } | 
|  | 121 | 
|  | 122 }  // namespace webrtc | 
|  | 123 | 
|  | 124 #endif  // RTC_AUDIOCODING_DEBUG_DUMP | 
| OLD | NEW | 
|---|