public async Task CanReceiveMulticastPacket()
        {
            var multicastIp = IPAddress.Parse("239.0.0.1");
            var ep          = new IPEndPoint(IPAddress.Loopback, UdpPort);
            var service     = new UdpService(ep);

            service.JoinMulticastGroup(multicastIp);

            service.LocalEndPoint.Should().Be(ep, "because this value was set in the constructor");
            service.MulticastGroups.Should().BeEquivalentTo(new[] { multicastIp }, "because this value was set in the constructor");

            var data = System.Text.Encoding.UTF8.GetBytes("Test");
            var host = new UdpClient();

            service.PacketReceived += (s, e) =>
                                      e.Buffer.Should().BeEquivalentTo(data, "because we should receive the test data exactly");

            using (var monitoredService = service.Monitor())
            {
                service.StartListening();

                int bytesSent = await host.SendAsync(data, data.Length, new IPEndPoint(multicastIp, ep.Port));

                bytesSent.Should().Be(data.Length, "because the test data is this long");

                // Allow some time to receive the packet
                await Task.Delay(100);

                monitoredService.Should().Raise(nameof(service.PacketReceived), "because the event should be raised upon receiving a packet");
            }

            host.Dispose();

            service.Dispose();
        }
        public void CanManageListeningState()
        {
            var service = new UdpService(new IPEndPoint(IPAddress.Loopback, UdpPort));

            service.IsListening.Should().BeFalse("because the service is not listening");

            service.Invoking(s => s.StopListeningAsync())
            .Should().Throw <InvalidOperationException>("because the service is not listening");

            service.StartListening();

            service.IsListening.Should().BeTrue("because the service is listening");

            service.Invoking(s => s.StartListening())
            .Should().Throw <InvalidOperationException>("because the service is already listening");

            service.Dispose();
        }