UdpSocket: Update Read - Update cast/*

This change is a subset of CL:
https://chromium-review.googlesource.com/c/openscreen/+/1764117

This CL makes 2 changes:
1) Update cast/ to use the new callback scheme instead of the old one
2) Add enable_reading() and disable_reading() to UdpSocket

Change-Id: I590548c2fa082c717506ecbdc83c25c40c75480e
Reviewed-on: https://chromium-review.googlesource.com/c/openscreen/+/1764118
Commit-Queue: Ryan Keane <rwkeane@google.com>
Reviewed-by: Max Yakimakha <yakimakha@chromium.org>
Reviewed-by: mark a. foltz <mfoltz@chromium.org>
diff --git a/cast/common/mdns/mdns_receiver.cc b/cast/common/mdns/mdns_receiver.cc
index a097838..e6fa855 100644
--- a/cast/common/mdns/mdns_receiver.cc
+++ b/cast/common/mdns/mdns_receiver.cc
@@ -10,12 +10,9 @@
 namespace cast {
 namespace mdns {
 
-MdnsReceiver::MdnsReceiver(UdpSocket* socket,
-                           NetworkRunner* network_runner,
-                           Delegate* delegate)
-    : socket_(socket), network_runner_(network_runner), delegate_(delegate) {
+MdnsReceiver::MdnsReceiver(UdpSocket* socket, Delegate* delegate)
+    : socket_(socket), delegate_(delegate) {
   OSP_DCHECK(socket_);
-  OSP_DCHECK(network_runner_);
   OSP_DCHECK(delegate_);
 }
 
@@ -25,29 +22,22 @@
   }
 }
 
-Error MdnsReceiver::Start() {
-  if (state_ == State::kRunning) {
-    return Error::Code::kNone;
-  }
-  Error result = network_runner_->ReadRepeatedly(socket_, this);
-  if (result.ok()) {
-    state_ = State::kRunning;
-  }
-  return result;
+void MdnsReceiver::Start() {
+  state_ = State::kRunning;
 }
 
-Error MdnsReceiver::Stop() {
-  if (state_ == State::kStopped) {
-    return Error::Code::kNone;
-  }
-  Error result = network_runner_->CancelRead(socket_);
-  if (result.ok()) {
-    state_ = State::kStopped;
-  }
-  return result;
+void MdnsReceiver::Stop() {
+  state_ = State::kStopped;
 }
 
-void MdnsReceiver::OnRead(UdpPacket packet, NetworkRunner* network_runner) {
+void MdnsReceiver::OnRead(UdpSocket* socket,
+                          openscreen::ErrorOr<UdpPacket> packet_or_error) {
+  if (state_ != State::kRunning || packet_or_error.is_error()) {
+    return;
+  }
+
+  UdpPacket packet = packet_or_error.MoveValue();
+
   TRACE_SCOPED(TraceCategory::mDNS, "MdnsReceiver::OnRead");
   MdnsReader reader(packet.data(), packet.size());
   MdnsMessage message;
@@ -61,5 +51,15 @@
   }
 }
 
+void MdnsReceiver::OnError(UdpSocket* socket, Error error) {
+  // This method should never be called for MdnsReciever.
+  OSP_UNIMPLEMENTED();
+}
+
+void MdnsReceiver::OnSendError(UdpSocket* socket, Error error) {
+  // This method should never be called for MdnsReciever.
+  OSP_UNIMPLEMENTED();
+}
+
 }  // namespace mdns
 }  // namespace cast
diff --git a/cast/common/mdns/mdns_receiver.h b/cast/common/mdns/mdns_receiver.h
index 62aff21..b2d998e 100644
--- a/cast/common/mdns/mdns_receiver.h
+++ b/cast/common/mdns/mdns_receiver.h
@@ -6,9 +6,8 @@
 #define CAST_COMMON_MDNS_MDNS_RECEIVER_H_
 
 #include "cast/common/mdns/mdns_records.h"
-#include "platform/api/network_runner.h"
+#include "platform/api/task_runner.h"
 #include "platform/api/udp_packet.h"
-#include "platform/api/udp_read_callback.h"
 #include "platform/api/udp_socket.h"
 #include "platform/base/error.h"
 #include "platform/base/ip_address.h"
@@ -17,13 +16,12 @@
 namespace mdns {
 
 using Error = openscreen::Error;
-using NetworkRunner = openscreen::platform::NetworkRunner;
 using UdpSocket = openscreen::platform::UdpSocket;
-using UdpReadCallback = openscreen::platform::UdpReadCallback;
 using UdpPacket = openscreen::platform::UdpPacket;
+using TaskRunner = openscreen::platform::TaskRunner;
 using IPEndpoint = openscreen::IPEndpoint;
 
-class MdnsReceiver : UdpReadCallback {
+class MdnsReceiver : UdpSocket::Client {
  public:
   class Delegate {
    public:
@@ -34,12 +32,10 @@
                                     const IPEndpoint& sender) = 0;
   };
 
-  // MdnsReceiver does not own |socket|, |network_runner| and |delegate|
+  // MdnsReceiver does not own |socket| and |delegate|
   // and expects that the lifetime of these objects exceeds the lifetime of
   // MdnsReceiver.
-  MdnsReceiver(UdpSocket* socket,
-               NetworkRunner* network_runner,
-               Delegate* delegate);
+  MdnsReceiver(UdpSocket* socket, Delegate* delegate);
   MdnsReceiver(const MdnsReceiver& other) = delete;
   MdnsReceiver(MdnsReceiver&& other) noexcept = delete;
   ~MdnsReceiver() override;
@@ -48,16 +44,17 @@
   MdnsReceiver& operator=(MdnsReceiver&& other) noexcept = delete;
 
   // The receiver can be started and stopped multiple times.
-  // Start and Stop return Error::Code::kNone on success and return an error on
-  // failure. Start returns Error::Code::kNone when called on a receiver that
-  // has already been started. Stop returns Error::Code::kNone when called on a
-  // receiver that has already been stopped or not yet started. Start and Stop
-  // are both synchronous calls. After MdnsReceiver has been started it will
-  // receive OnRead callbacks from the network runner.
-  Error Start();
-  Error Stop();
+  // Start and Stop are both synchronous calls. When MdnsReceiver has not yet
+  // been started, OnRead callbacks it receives from the task runner will be
+  // no-ops.
+  void Start();
+  void Stop();
 
-  void OnRead(UdpPacket packet, NetworkRunner* network_runner) override;
+  // UdpSocket::Client overrides.
+  void OnRead(UdpSocket* socket,
+              openscreen::ErrorOr<UdpPacket> packet) override;
+  void OnError(UdpSocket* socket, Error error) override;
+  void OnSendError(UdpSocket* socket, Error error) override;
 
  private:
   enum class State {
@@ -66,7 +63,6 @@
   };
 
   UdpSocket* const socket_;
-  NetworkRunner* const network_runner_;
   Delegate* const delegate_;
   State state_ = State::kStopped;
 };
diff --git a/cast/common/mdns/mdns_receiver_unittest.cc b/cast/common/mdns/mdns_receiver_unittest.cc
index ce796dd..01fb779 100644
--- a/cast/common/mdns/mdns_receiver_unittest.cc
+++ b/cast/common/mdns/mdns_receiver_unittest.cc
@@ -16,18 +16,6 @@
 using ::testing::Return;
 using MockUdpSocket = openscreen::platform::MockUdpSocket;
 
-// TODO(yakimakha): Update tests to use a fake NetworkRunner when implemented
-class MockNetworkRunner : public NetworkRunner {
- public:
-  MOCK_METHOD2(ReadRepeatedly, Error(UdpSocket*, UdpReadCallback*));
-  MOCK_METHOD1(CancelRead, Error(UdpSocket*));
-
-  void PostPackagedTask(Task task) override {}
-  void PostPackagedTaskWithDelay(
-      Task task,
-      openscreen::platform::Clock::duration delay) override {}
-};
-
 class MockMdnsReceiverDelegate : public MdnsReceiver::Delegate {
  public:
   MOCK_METHOD2(OnQueryReceived, void(const MdnsMessage&, const IPEndpoint&));
@@ -54,12 +42,8 @@
 
   std::unique_ptr<openscreen::platform::MockUdpSocket> socket_info =
       MockUdpSocket::CreateDefault(openscreen::IPAddress::Version::kV4);
-  MockNetworkRunner runner;
   MockMdnsReceiverDelegate delegate;
-  MdnsReceiver receiver(socket_info.get(), &runner, &delegate);
-
-  EXPECT_CALL(runner, ReadRepeatedly(socket_info.get(), _))
-      .WillOnce(Return(Error::Code::kNone));
+  MdnsReceiver receiver(socket_info.get(), &delegate);
   receiver.Start();
 
   MdnsQuestion question(DomainName{"testing", "local"}, DnsType::kA,
@@ -77,10 +61,8 @@
 
   // Imitate a call to OnRead from NetworkRunner by calling it manually here
   EXPECT_CALL(delegate, OnQueryReceived(message, packet.source())).Times(1);
-  receiver.OnRead(std::move(packet), &runner);
+  receiver.OnRead(socket_info.get(), std::move(packet));
 
-  EXPECT_CALL(runner, CancelRead(socket_info.get()))
-      .WillOnce(Return(Error::Code::kNone));
   receiver.Stop();
 }
 
@@ -112,12 +94,8 @@
 
   std::unique_ptr<openscreen::platform::MockUdpSocket> socket_info =
       MockUdpSocket::CreateDefault(openscreen::IPAddress::Version::kV6);
-  MockNetworkRunner runner;
   MockMdnsReceiverDelegate delegate;
-  MdnsReceiver receiver(socket_info.get(), &runner, &delegate);
-
-  EXPECT_CALL(runner, ReadRepeatedly(socket_info.get(), _))
-      .WillOnce(Return(Error::Code::kNone));
+  MdnsReceiver receiver(socket_info.get(), &delegate);
   receiver.Start();
 
   MdnsRecord record(DomainName{"testing", "local"}, DnsType::kA, DnsClass::kIN,
@@ -137,10 +115,8 @@
 
   // Imitate a call to OnRead from NetworkRunner by calling it manually here
   EXPECT_CALL(delegate, OnResponseReceived(message, packet.source())).Times(1);
-  receiver.OnRead(std::move(packet), &runner);
+  receiver.OnRead(socket_info.get(), std::move(packet));
 
-  EXPECT_CALL(runner, CancelRead(socket_info.get()))
-      .WillOnce(Return(Error::Code::kNone));
   receiver.Stop();
 }