Index: webrtc/video/end_to_end_tests.cc |
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc |
index 26ba26a04587c4b93ab9585f2fa387d58ead21c7..98a92210a95016527e0f5fcd31a47ad3b47b20f3 100644 |
--- a/webrtc/video/end_to_end_tests.cc |
+++ b/webrtc/video/end_to_end_tests.cc |
@@ -19,6 +19,7 @@ |
#include "webrtc/base/checks.h" |
#include "webrtc/base/event.h" |
+#include "webrtc/base/file.h" |
#include "webrtc/base/optional.h" |
#include "webrtc/base/rate_limiter.h" |
#include "webrtc/call.h" |
@@ -52,6 +53,13 @@ |
#include "webrtc/test/testsupport/perf_test.h" |
#include "webrtc/video_encoder.h" |
+#if defined(WEBRTC_WIN) |
+#include "webrtc/base/win32.h" |
+#else |
+#include <fcntl.h> |
+#include <unistd.h> |
+#endif |
+ |
namespace webrtc { |
static const int kSilenceTimeoutMs = 2000; |
@@ -3740,4 +3748,106 @@ TEST_F(EndToEndTest, TransportSeqNumOnAudioAndVideo) { |
RunBaseTest(&test); |
} |
+ |
+class EndToEndLogTest : public EndToEndTest { |
+ void SetUp() { paths_.clear(); } |
+ void TearDown() { |
+ for (const auto& path : paths_) { |
+#if defined(WEBRTC_WIN) |
+ ::DeleteFile(rtc::ToUtf16(path).c_str()); |
+#else |
+ ::unlink(path.c_str()); |
+#endif |
sprang_webrtc
2016/09/04 14:48:47
Can we add this as a static delete method to File
|
+ } |
+ } |
+ |
+ public: |
+ int AddFile() { |
+ paths_.push_back(test::TempFilename(test::OutputPath(), "test_file")); |
+ return paths_.size() - 1; |
+ } |
+ |
+ rtc::PlatformFile OpenFile(int idx) { |
+#if defined(WEBRTC_WIN) |
+ return ::CreateFile(rtc::ToUtf16(paths_[idx]).c_str(), |
+ GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, |
+ FILE_ATTRIBUTE_NORMAL, nullptr); |
+#else |
+ return ::open(paths_[idx].c_str(), O_RDWR); |
+#endif |
sprang_webrtc
2016/09/04 14:48:47
Maybe even add this to File itself?
palmkvist
2016/09/05 11:57:37
Thinking about it, platform_file seems like a more
|
+ } |
+ |
+ void LogSend(bool open) { |
+ if (open) |
+ video_send_stream_->SetLogFiles(OpenFile(AddFile())); |
+ else |
+ video_send_stream_->SetLogFiles(); |
sprang_webrtc
2016/09/04 14:48:47
use brackets for if/else
|
+ } |
+ void LogReceive(bool open) { |
+ if (open) |
+ video_receive_streams_[0]->SetLogFile(OpenFile(AddFile())); |
+ else |
+ video_receive_streams_[0]->SetLogFile(); |
+ } |
+ |
+ std::vector<std::string> paths_; |
+}; |
+ |
+TEST_F(EndToEndLogTest, LogsEncodedFramesWhenRequested) { |
+ static const int kNumFramesToRecord = 10; |
+ class LogEncodingObserver : public test::EndToEndTest, |
+ public EncodedFrameObserver { |
+ public: |
+ explicit LogEncodingObserver(EndToEndLogTest* fixture) |
+ : EndToEndTest(kDefaultTimeoutMs), fixture_(fixture) {} |
+ |
+ void PerformTest() override { |
+ fixture_->LogSend(true); |
+ fixture_->LogReceive(true); |
+ ASSERT_TRUE(Wait()) << "Timed out while waiting for frame logging."; |
+ } |
+ |
+ void ModifyVideoConfigs( |
+ VideoSendStream::Config* send_config, |
+ std::vector<VideoReceiveStream::Config>* receive_configs, |
+ VideoEncoderConfig* encoder_config) override { |
+ encoder_.reset(VideoEncoder::Create(VideoEncoder::kVp8)); |
+ decoder_.reset(VP8Decoder::Create()); |
+ |
+ send_config->post_encode_callback = this; |
+ send_config->encoder_settings.payload_name = "VP8"; |
+ send_config->encoder_settings.encoder = encoder_.get(); |
+ |
+ (*receive_configs)[0].decoders.resize(1); |
+ (*receive_configs)[0].decoders[0].payload_type = |
+ send_config->encoder_settings.payload_type; |
+ (*receive_configs)[0].decoders[0].payload_name = |
+ send_config->encoder_settings.payload_name; |
+ (*receive_configs)[0].decoders[0].decoder = decoder_.get(); |
+ } |
+ |
+ void EncodedFrameCallback(const EncodedFrame& encoded_frame) override { |
+ rtc::CritScope lock(&crit_); |
+ if (recorded_frames_++ > kNumFramesToRecord) { |
+ fixture_->LogSend(false); |
+ fixture_->LogReceive(false); |
+ rtc::File send_file(fixture_->OpenFile(0)); |
+ rtc::File receive_file(fixture_->OpenFile(1)); |
+ uint8_t out[100]; |
+ EXPECT_LT(0u, receive_file.Read(out, 100)); |
sprang_webrtc
2016/09/04 14:48:47
Please add some comments about the intentions here
|
+ observation_complete_.Set(); |
+ } |
+ } |
+ |
+ private: |
+ EndToEndLogTest* fixture_; |
sprang_webrtc
2016/09/04 14:48:48
EndToEndLogTest* const fixture_;
|
+ std::unique_ptr<VideoEncoder> encoder_; |
+ std::unique_ptr<VideoDecoder> decoder_; |
+ rtc::CriticalSection crit_; |
+ int recorded_frames_ GUARDED_BY(crit_) = 0; |
sprang_webrtc
2016/09/04 14:48:47
prefer setting values in the initializer list
|
+ } test(this); |
+ |
+ RunBaseTest(&test); |
+} |
+ |
} // namespace webrtc |