public void TransferServiceInfo()
        {
            var publishInfo = new ServiceInfo();

            publishInfo.Name     = "Pubtest";
            publishInfo.Port     = 9999;
            publishInfo.Priority = 10;
            publishInfo.Weight   = 10;
            publishInfo.Flags.Add("TestFlag");
            publishInfo.Data["TestData"] = "TestValue";

            ServiceInfo recvInfo = null;

            var service = new ConnectedServiceMock("10.99.99.99");

            using (var publisher = new ServicePublisher(service))
            {
                var watcher = new ServiceWatchManager(service);
                publisher.AddService("_pubtest._tcp.local", publishInfo);
                publisher.Start();
                var watch = watcher.WatchService("_pubtest._tcp.local", (nic, x) => recvInfo = x);
                watch.Start();
                Assert.AreEqual(publishInfo.Name, recvInfo.Name);
                Assert.AreEqual(publishInfo.Port, recvInfo.Port);
                Assert.AreEqual(publishInfo.Priority, recvInfo.Priority);
                Assert.AreEqual(publishInfo.Weight, recvInfo.Weight);
                Assert.AreEqual(publishInfo.Flags[0], recvInfo.Flags[0]);
                Assert.AreEqual(publishInfo.Data["TestData"], recvInfo.Data["TestData"]);
                Assert.AreEqual(IPAddress.Parse("10.99.99.99"), recvInfo.IP4Address);
            }

            Assert.IsFalse(service.Running);
        }
        public void RespondWithServiceInfo()
        {
            var    core     = BuildService("10.99.99.99", "fe80::20c:29ff:fe0d:e789");
            Packet received = null;

            core.Setup(x => x.SendPacket(It.IsAny <Packet>())).Callback <Packet>(x => received = x);

            using (var service = new ServicePublisher(core.Object))
            {
                var publishInfo = new ServiceInfo();
                publishInfo.Name       = "Pubtest";
                publishInfo.IP4Address = IPAddress.Parse("10.0.0.10");
                publishInfo.IP6Address = IPAddress.Parse("fe80::20c:29ff:fe0d:e789");
                publishInfo.Port       = 9999;
                publishInfo.Priority   = 10;
                publishInfo.Weight     = 10;
                publishInfo.Flags.Add("TestFlag");
                publishInfo.Data["TestData"] = "TestValue";

                service.LocalName = "Scooby";
                service.AddService("_pubtest._tcp.local", publishInfo);
                service.Start();
                core.Raise(x => x.PacketReceived += null, BuildQueryPacket("_pubtest._tcp.local"), new IPEndPoint(IPAddress.Parse("10.0.0.10"), 5353));

                Assert.IsTrue(received.Flags.IsResponse);
                Assert.IsTrue(received.Flags.IsAuthoritative);
                var ptrAnswer = received.Answers.Where(x => x.Record.RecordType == PTRAnswer.RecordType).First().Data as PTRAnswer;
                Assert.AreEqual("Pubtest._pubtest._tcp.local", ptrAnswer.DomainName);

                var srv       = received.Answers.Where(x => x.Record.RecordType == SRVAnswer.RecordType).First();
                var srvAnswer = srv.Data as SRVAnswer;
                Assert.AreEqual(SRVAnswer.GetService(srv.Record), "Pubtest");
                Assert.AreEqual(SRVAnswer.GetProtocol(srv.Record), "_pubtest");
                Assert.AreEqual(SRVAnswer.GetName(srv.Record), "_tcp.local");

                //Assert.AreEqual("Pubtest._pubtest._tcp.local", srvAnswer.Name);
                Assert.AreEqual(9999, srvAnswer.Port);
                Assert.AreEqual(10, srvAnswer.Priority);
                Assert.AreEqual(10, srvAnswer.Weight);
                Assert.AreEqual("Scooby.local", srvAnswer.Target);

                var txtAnswer = received.Answers.Where(x => x.Record.RecordType == TXTAnswer.RecordType).First().Data as TXTAnswer;
                Assert.AreEqual("TestFlag", txtAnswer.Flags[0]);
                Assert.AreEqual("TestValue", txtAnswer.Data["TestData"]);

                var aAnswer = received.Answers.Where(x => x.Record.RecordType == AAnswer.RecordType).First().Data as AAnswer;
                Assert.AreEqual(IPAddress.Parse("10.99.99.99"), aAnswer.Address);

                var aaaaAnswer = received.Answers.Where(x => x.Record.RecordType == AAAAAnswer.RecordType).First().Data as AAAAAnswer;
                Assert.AreEqual(IPAddress.Parse("fe80::20c:29ff:fe0d:e789"), aaaaAnswer.Address);
            }
        }