Index: media/cast/test/loopback_transport.cc |
diff --git a/media/cast/test/loopback_transport.cc b/media/cast/test/loopback_transport.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a8d604d6879d563347ba21e1728d36d312c5950b |
--- /dev/null |
+++ b/media/cast/test/loopback_transport.cc |
@@ -0,0 +1,65 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "media/cast/test/loopback_transport.h" |
+ |
+#include "base/single_thread_task_runner.h" |
+#include "base/time/tick_clock.h" |
+#include "media/cast/test/utility/udp_proxy.h" |
+ |
+namespace media { |
+namespace cast { |
+namespace { |
+ |
+// Shim that turns forwards packets from a test::PacketPipe to a |
+// PacketReceiverCallback. |
+class LoopBackPacketPipe : public test::PacketPipe { |
+ public: |
+ LoopBackPacketPipe( |
+ const transport::PacketReceiverCallback& packet_receiver) |
+ : packet_receiver_(packet_receiver) {} |
+ |
+ virtual ~LoopBackPacketPipe() {} |
+ |
+ // PacketPipe implementations. |
+ virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { |
+ packet_receiver_.Run(packet.Pass()); |
+ } |
+ |
+ private: |
+ transport::PacketReceiverCallback packet_receiver_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(LoopBackPacketPipe); |
+}; |
+ |
+} // namespace |
+ |
+LoopBackTransport::LoopBackTransport( |
+ scoped_refptr<CastEnvironment> cast_environment) |
+ : cast_environment_(cast_environment) { |
+} |
+ |
+bool LoopBackTransport::SendPacket(transport::PacketRef packet, |
+ const base::Closure& cb) OVERRIDE { |
+ DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
+ scoped_ptr<Packet> packet_copy(new Packet(packet->data)); |
+ packet_pipe_->Send(packet_copy.Pass()); |
+ return true; |
+} |
+ |
+void LoopBackTransport::Initialize( |
+ scoped_ptr<test::PacketPipe> pipe, |
+ const transport::PacketReceiverCallback& packet_receiver, |
+ const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
+ base::TickClock* clock) { |
+ scoped_ptr<test::PacketPipe> loopback_pipe( |
+ new LoopBackPacketPipe(packet_receiver)); |
+ // Append the loopback pipe to the end. |
+ pipe->AppendToPipe(loopback_pipe.Pass()); |
+ packet_pipe_ = pipe.Pass(); |
+ packet_pipe_->InitOnIOThread(task_runner, clock); |
+} |
+ |
+} // namespace cast |
+} // namespace media |