webrtc_rtp_dump_handler_unittest.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file. 446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/bind.h" 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/file_util.h" 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/macros.h" 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/run_loop.h" 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media/webrtc_rtp_dump_handler.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media/webrtc_rtp_dump_writer.h" 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class FakeDumpWriter : public WebRtcRtpDumpWriter { 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FakeDumpWriter(size_t max_dump_size, 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Closure& max_size_reached_callback, 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool end_dump_success) 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : WebRtcRtpDumpWriter(base::FilePath(), 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::FilePath(), 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) max_dump_size, 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Closure()), 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) max_dump_size_(max_dump_size), 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) current_dump_size_(0), 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) max_size_reached_callback_(max_size_reached_callback), 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) end_dump_success_(end_dump_success) {} 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void WriteRtpPacket(const uint8* packet_header, 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) size_t header_length, 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) size_t packet_length, 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool incoming) OVERRIDE { 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) current_dump_size_ += header_length; 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (current_dump_size_ > max_dump_size_) 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) max_size_reached_callback_.Run(); 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void EndDump(RtpDumpType type, 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const EndDumpCallback& finished_callback) OVERRIDE { 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool incoming_sucess = end_dump_success_; 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool outgoing_success = end_dump_success_; 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (type == RTP_DUMP_INCOMING) 4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) outgoing_success = false; 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) else if (type == RTP_DUMP_OUTGOING) 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) incoming_sucess = false; 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::MessageLoop::current()->PostTask( 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) FROM_HERE, 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(finished_callback, incoming_sucess, outgoing_success)); 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) size_t max_dump_size_; 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) size_t current_dump_size_; 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Closure max_size_reached_callback_; 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool end_dump_success_; 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class WebRtcRtpDumpHandlerTest : public testing::Test { 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WebRtcRtpDumpHandlerTest() 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) { 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ResetDumpHandler(base::FilePath(), true); 6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void ResetDumpHandler(const base::FilePath& dir, bool end_dump_success) { 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_.reset(new WebRtcRtpDumpHandler( 7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) dir.empty() ? base::FilePath(FILE_PATH_LITERAL("dummy")) : dir)); 7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<WebRtcRtpDumpWriter> writer(new FakeDumpWriter( 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10, 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandler::OnMaxDumpSizeReached, 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(handler_.get())), 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) end_dump_success)); 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->SetDumpWriterForTesting(writer.Pass()); 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void WriteFakeDumpFiles(const base::FilePath& dir, 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::FilePath* incoming_dump, 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::FilePath* outgoing_dump) { 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) *incoming_dump = dir.AppendASCII("recv"); 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) *outgoing_dump = dir.AppendASCII("send"); 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const char dummy[] = "dummy"; 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_GT(base::WriteFile(*incoming_dump, dummy, arraysize(dummy)), 0); 8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_GT(base::WriteFile(*outgoing_dump, dummy, arraysize(dummy)), 0); 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MOCK_METHOD2(OnStopDumpFinished, 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void(bool success, const std::string& error)); 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MOCK_METHOD0(OnStopOngoingDumpsFinished, void(void)); 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) protected: 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<WebRtcRtpDumpHandler> handler_; 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, StateTransition) { 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string error; 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RtpDumpType types[3]; 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) types[0] = RTP_DUMP_INCOMING; 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) types[1] = RTP_DUMP_OUTGOING; 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) types[2] = RTP_DUMP_BOTH; 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (size_t i = 0; i < arraysize(types); ++i) { 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(2) << "Verifying state transition: type = " << types[i]; 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Only StartDump is allowed in STATE_NONE. 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopDumpFinished(false, testing::_)); 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(types[i], 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WebRtcRtpDumpHandler::ReleasedDumps empty_dumps(handler_->ReleaseDumps()); 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(empty_dumps.incoming_dump_path.empty()); 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(empty_dumps.outgoing_dump_path.empty()); 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(types[i], &error)); 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Only StopDump is allowed in STATE_STARTED. 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(handler_->StartDump(types[i], &error)); 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(handler_->ReadyToRelease()); 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopDumpFinished(true, testing::_)); 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(types[i], 13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Only ReleaseDump is allowed in STATE_STOPPED. 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(handler_->StartDump(types[i], &error)); 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopDumpFinished(false, testing::_)); 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(types[i], 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->ReadyToRelease()); 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WebRtcRtpDumpHandler::ReleasedDumps dumps(handler_->ReleaseDumps()); 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (types[i] == RTP_DUMP_INCOMING || types[i] == RTP_DUMP_BOTH) 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(dumps.incoming_dump_path.empty()); 14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (types[i] == RTP_DUMP_OUTGOING || types[i] == RTP_DUMP_BOTH) 14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(dumps.outgoing_dump_path.empty()); 15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ResetDumpHandler(base::FilePath(), true); 15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, StoppedWhenMaxSizeReached) { 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string error; 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(RTP_DUMP_INCOMING, &error)); 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<uint8> buffer(100, 0); 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->OnRtpPacket(&buffer[0], buffer.size(), buffer.size(), true); 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Dumping should have been stopped, so ready to release. 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WebRtcRtpDumpHandler::ReleasedDumps dumps = handler_->ReleaseDumps(); 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(dumps.incoming_dump_path.empty()); 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, PacketIgnoredIfDumpingNotStarted) { 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<uint8> buffer(100, 0); 17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->OnRtpPacket(&buffer[0], buffer.size(), buffer.size(), true); 17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->OnRtpPacket(&buffer[0], buffer.size(), buffer.size(), false); 17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, PacketIgnoredIfDumpingStopped) { 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string error; 17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(RTP_DUMP_INCOMING, &error)); 18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopDumpFinished(true, testing::_)); 18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(RTP_DUMP_INCOMING, 18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<uint8> buffer(100, 0); 18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->OnRtpPacket(&buffer[0], buffer.size(), buffer.size(), true); 18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, CannotStartMoreThanFiveDumps) { 19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string error; 19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_.reset(); 19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<WebRtcRtpDumpHandler> handlers[6]; 19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (size_t i = 0; i < arraysize(handlers); ++i) { 20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handlers[i].reset(new WebRtcRtpDumpHandler(base::FilePath())); 20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (i < arraysize(handlers) - 1) { 20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handlers[i]->StartDump(RTP_DUMP_INCOMING, &error)); 20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else { 20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(handlers[i]->StartDump(RTP_DUMP_INCOMING, &error)); 20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, StartStopIncomingThenStartStopOutgoing) { 21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string error; 21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopDumpFinished(true, testing::_)).Times(2); 21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(RTP_DUMP_INCOMING, &error)); 21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(RTP_DUMP_INCOMING, 21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 21946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 22046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(RTP_DUMP_OUTGOING, &error)); 22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(RTP_DUMP_OUTGOING, 22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 22346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 22446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 22546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, StartIncomingStartOutgoingThenStopBoth) { 22946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string error; 23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopDumpFinished(true, testing::_)); 23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(RTP_DUMP_INCOMING, &error)); 23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(RTP_DUMP_OUTGOING, &error)); 23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(RTP_DUMP_INCOMING, 23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 24246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 24346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, StartBothThenStopIncomingStopOutgoing) { 24446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string error; 24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopDumpFinished(true, testing::_)).Times(2); 24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(RTP_DUMP_BOTH, &error)); 24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(RTP_DUMP_INCOMING, 25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(RTP_DUMP_OUTGOING, 25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 25946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, DumpsCleanedUpIfNotReleased) { 26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::ScopedTempDir temp_dir; 26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ResetDumpHandler(temp_dir.path(), true); 26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::FilePath incoming_dump, outgoing_dump; 26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WriteFakeDumpFiles(temp_dir.path(), &incoming_dump, &outgoing_dump); 26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string error; 26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(RTP_DUMP_BOTH, &error)); 27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopDumpFinished(true, testing::_)); 27246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(RTP_DUMP_BOTH, 27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_.reset(); 27846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 27946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 28046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(base::PathExists(incoming_dump)); 28146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(base::PathExists(outgoing_dump)); 28246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 28446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, DumpDeletedIfEndDumpFailed) { 28546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::ScopedTempDir temp_dir; 28646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 28746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 28846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Make the writer return failure on EndStream. 28946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ResetDumpHandler(temp_dir.path(), false); 29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 29146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::FilePath incoming_dump, outgoing_dump; 29246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WriteFakeDumpFiles(temp_dir.path(), &incoming_dump, &outgoing_dump); 29346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 29446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string error; 29546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(RTP_DUMP_BOTH, &error)); 29646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopDumpFinished(true, testing::_)).Times(2); 29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 29846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(RTP_DUMP_INCOMING, 29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 30046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 30146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 30246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 30346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(base::PathExists(incoming_dump)); 30446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(base::PathExists(outgoing_dump)); 30546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(RTP_DUMP_OUTGOING, 30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 30846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 30946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 31046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(base::PathExists(outgoing_dump)); 31146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 31246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 31346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, StopOngoingDumpsWhileStoppingDumps) { 31446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string error; 31546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(RTP_DUMP_BOTH, &error)); 31646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 31746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) testing::InSequence s; 31846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopDumpFinished(true, testing::_)); 31946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopOngoingDumpsFinished()); 32046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 32146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(RTP_DUMP_BOTH, 32246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 32346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 32446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 32546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopOngoingDumps( 32646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopOngoingDumpsFinished, 32746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 32846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 32946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 33046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 33146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WebRtcRtpDumpHandler::ReleasedDumps dumps(handler_->ReleaseDumps()); 33246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(dumps.incoming_dump_path.empty()); 33346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(dumps.outgoing_dump_path.empty()); 33446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 33646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, StopOngoingDumpsWhileDumping) { 33746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string error; 33846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(RTP_DUMP_BOTH, &error)); 33946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 34046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopOngoingDumpsFinished()); 34146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 34246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopOngoingDumps( 34346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopOngoingDumpsFinished, 34446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 34546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 34646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 34746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 34846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WebRtcRtpDumpHandler::ReleasedDumps dumps(handler_->ReleaseDumps()); 34946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(dumps.incoming_dump_path.empty()); 35046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(dumps.outgoing_dump_path.empty()); 35146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 35246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 35346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, StopOngoingDumpsWhenAlreadyStopped) { 35446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string error; 35546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(RTP_DUMP_BOTH, &error)); 35646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 35746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 35846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopDumpFinished(true, testing::_)); 35946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 36046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(RTP_DUMP_BOTH, 36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 36346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 36446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 36546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 36646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopOngoingDumpsFinished()); 36746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopOngoingDumps( 36846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopOngoingDumpsFinished, 36946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 37046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 37146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(WebRtcRtpDumpHandlerTest, StopOngoingDumpsWhileStoppingOneDump) { 37346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string error; 37446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(handler_->StartDump(RTP_DUMP_BOTH, &error)); 37546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) testing::InSequence s; 37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopDumpFinished(true, testing::_)); 37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_CALL(*this, OnStopOngoingDumpsFinished()); 37946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopDump(RTP_DUMP_INCOMING, 38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopDumpFinished, 38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 38346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 38446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) handler_->StopOngoingDumps( 38546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&WebRtcRtpDumpHandlerTest::OnStopOngoingDumpsFinished, 38646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this))); 38746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 38846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 38946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 39046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WebRtcRtpDumpHandler::ReleasedDumps dumps(handler_->ReleaseDumps()); 39146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(dumps.incoming_dump_path.empty()); 39246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_FALSE(dumps.outgoing_dump_path.empty()); 39346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 394