Exemple #1
0
        public void DeviceLocator_SearchAsync_RaisesDeviceAvailableOnResponse()
        {
            var server        = new MockCommsServer();
            var deviceLocator = new MockDeviceLocator(server);

            var publishedDevice         = CreateDeviceTree();
            DiscoveredSsdpDevice device = null;
            bool newlyDiscovered        = false;
            var  receivedNotification   = false;

            using (var eventSignal = new System.Threading.AutoResetEvent(false))
            {
                deviceLocator.DeviceAvailable += (sender, args) =>
                {
                    device               = args.DiscoveredDevice;
                    newlyDiscovered      = args.IsNewlyDiscovered;
                    receivedNotification = true;
                    eventSignal.Set();
                };


                var task = deviceLocator.SearchAsync(TimeSpan.FromSeconds(2));
                server.MockReceiveMessage(GetMockSearchResponse(publishedDevice, publishedDevice.Udn));
                eventSignal.WaitOne(10000);
                Assert.IsTrue(receivedNotification);
                var results = task.GetAwaiter().GetResult();

                Assert.IsNotNull(results);
                Assert.IsTrue(results.Any());
                Assert.IsTrue(results.First().Usn == device.Usn);
            }
        }
Exemple #2
0
        public void DeviceLocator_Notifications_SearchResponseMissingCacheHeaderIsNonCacheable()
        {
            var server        = new MockCommsServer();
            var deviceLocator = new MockDeviceLocator(server);

            var publishedDevice         = CreateDeviceTree();
            DiscoveredSsdpDevice device = null;
            var receivedNotification    = false;

            using (var eventSignal = new System.Threading.AutoResetEvent(false))
            {
                deviceLocator.DeviceAvailable += (sender, args) =>
                {
                    device = args.DiscoveredDevice;
                    receivedNotification = true;
                    eventSignal.Set();
                };

                var t = deviceLocator.SearchAsync(TimeSpan.FromSeconds(3));
                System.Threading.Thread.Sleep(500);
                server.MockReceiveMessage(GetMockSearchResponseWithCustomCacheHeader(publishedDevice, publishedDevice.Udn, null));
                eventSignal.WaitOne(10000);
                var results = t.GetAwaiter().GetResult();

                Assert.IsNotNull(results);
                Assert.IsTrue(results.Any());
                Assert.IsTrue(receivedNotification);
                Assert.IsNotNull(device);
                Assert.AreEqual(device.Usn, String.Format("{0}:{1}", publishedDevice.Udn, publishedDevice.FullDeviceType));
                Assert.AreEqual(device.NotificationType, publishedDevice.Udn);
            }
        }
Exemple #3
0
        public void DeviceLocator_Notifications_SearchResponseDefaultsToZeroMaxAge()
        {
            var server        = new MockCommsServer();
            var deviceLocator = new MockDeviceLocator(server);

            var publishedDevice = CreateDeviceTree();

            publishedDevice.CacheLifetime = TimeSpan.FromMinutes(30);

            DiscoveredSsdpDevice device = null;

            using (var eventSignal = new System.Threading.AutoResetEvent(false))
            {
                deviceLocator.DeviceAvailable += (sender, args) =>
                {
                    device = args.DiscoveredDevice;
                    eventSignal.Set();
                };

                var t = deviceLocator.SearchAsync(TimeSpan.FromSeconds(3));
                System.Threading.Thread.Sleep(500);
                server.MockReceiveMessage(GetMockSearchResponseWithCustomCacheHeader(publishedDevice, publishedDevice.Udn, String.Format("CACHE-CONTROL: public")));
                eventSignal.WaitOne(10000);
                var results = t.GetAwaiter().GetResult();

                Assert.IsNotNull(results);
                Assert.IsTrue(results.Any());
                Assert.AreEqual(TimeSpan.Zero, results.First().CacheLifetime);
            }
        }
Exemple #4
0
        public void DeviceLocator_Notifications_SearchResponseMissingCacheHeaderIsNonCacheable()
        {
            var server = new MockCommsServer();
            var deviceLocator = new MockDeviceLocator(server);

            var publishedDevice = CreateDeviceTree();
            DiscoveredSsdpDevice device = null;
            var receivedNotification = false;

            using (var eventSignal = new System.Threading.AutoResetEvent(false))
            {
                deviceLocator.DeviceAvailable += (sender, args) =>
                {
                    device = args.DiscoveredDevice;
                    receivedNotification = true;
                    eventSignal.Set();
                };

                var t = deviceLocator.SearchAsync(TimeSpan.FromSeconds(3));
                System.Threading.Thread.Sleep(500);
                server.MockReceiveMessage(GetMockSearchResponseWithCustomCacheHeader(publishedDevice, publishedDevice.Udn, null));
                eventSignal.WaitOne(10000);
                var results = t.GetAwaiter().GetResult();

                Assert.IsNotNull(results);
                Assert.IsTrue(results.Any());
                Assert.IsTrue(receivedNotification);
                Assert.IsNotNull(device);
                Assert.AreEqual(device.Usn, String.Format("{0}:{1}", publishedDevice.Udn, publishedDevice.FullDeviceType));
                Assert.AreEqual(device.NotificationType, publishedDevice.Udn);
            }
        }
Exemple #5
0
        public void Publisher_SearchResponse_NoResponseWithMissngMXHeader()
        {
            var rootDevice = CreateValidRootDevice();

            var server = new MockCommsServer();
            using (var publisher = new TestDevicePublisher(server))
            {
                publisher.SupportPnpRootDevice = false;
                publisher.AddDevice(rootDevice);

                ReceivedUdpData searchRequest = GetSearchRequestMessageWithoutMXHeader(SsdpConstants.UpnpDeviceTypeRootDevice);

                server.MockReceiveMessage(searchRequest);
                server.WaitForMockMessage(1500);

                var searchResponses = GetSentMessages(server.SentMessages);
                Assert.AreEqual(0, searchResponses.Count());
            }
        }
Exemple #6
0
        public void DeviceLocator_Notifications_RetrievesCustomHeader()
        {
            var server = new MockCommsServer();
            var deviceLocator = new MockDeviceLocator(server);

            var publishedDevice = CreateDeviceTree(new CustomHttpHeader("machinename", Environment.MachineName));
            DiscoveredSsdpDevice device = null;
            var receivedNotification = false;

            using (var eventSignal = new System.Threading.AutoResetEvent(false))
            {
                deviceLocator.DeviceAvailable += (sender, args) =>
                {
                    device = args.DiscoveredDevice;
                    receivedNotification = true;
                    eventSignal.Set();
                };

                var t = deviceLocator.SearchAsync(TimeSpan.FromSeconds(3));
                System.Threading.Thread.Sleep(500);
                server.MockReceiveMessage(GetMockSearchResponse(publishedDevice, publishedDevice.Udn));
                eventSignal.WaitOne(10000);
                var results = t.GetAwaiter().GetResult();

                Assert.IsNotNull(results);
                Assert.IsTrue(results.Any());
                Assert.IsTrue(receivedNotification);
                Assert.IsNotNull(device);

                foreach (var h1 in results.First().ResponseHeaders)
                {
                    System.Diagnostics.Debug.WriteLine(h1.Key);
                }
                Assert.AreEqual(Environment.MachineName, (from h in results.First().ResponseHeaders where h.Key == "machinename" select h.Value.FirstOrDefault()).FirstOrDefault());
                Assert.AreEqual(device.Usn, String.Format("{0}:{1}", publishedDevice.Udn, publishedDevice.FullDeviceType));
                Assert.AreEqual(device.NotificationType, publishedDevice.Udn);
            }
        }
Exemple #7
0
        public void Publisher_SearchResponse_IgnoresNullMessageReceipt()
        {
            var rootDevice = CreateValidRootDevice();
            var parentDevice = CreateValidEmbeddedDevice(rootDevice);
            rootDevice.AddDevice(parentDevice);
            var childDevice = CreateValidEmbeddedDevice(rootDevice);
            parentDevice.AddDevice(childDevice);

            var server = new MockCommsServer();
            using (var publisher = new TestDevicePublisher(server))
            {
                publisher.SupportPnpRootDevice = false;
                publisher.AddDevice(rootDevice);

                ReceivedUdpData searchRequest = GetSearchRequestMessage("ssdp:all");
                searchRequest.Buffer = null;

                server.MockReceiveMessage(searchRequest);
            }
        }
Exemple #8
0
        public void Publisher_SearchResponse_RandomisesMxHeaderGreaterThan120()
        {
            var rootDevice = CreateValidRootDevice();

            var server = new MockCommsServer();
            using (var publisher = new TestDevicePublisher(server))
            {
                publisher.SupportPnpRootDevice = false;
                publisher.AddDevice(rootDevice);

                ReceivedUdpData searchRequest = GetSearchRequestMessageWithCustomMXHeader(rootDevice.Udn, "125");

                server.MockReceiveMessage(searchRequest);
                Assert.IsTrue(server.WaitForMockMessage(120000));
                System.Threading.Thread.Sleep(500);

                var searchResponses = GetSentMessages(server.SentMessages);
                Assert.AreEqual(3, searchResponses.Count());
            }
        }
Exemple #9
0
        public void Publisher_SearchResponse_DoesNotRespondToRequestWithEmptyMXHeaderIfPnpSupportDisabled()
        {
            var rootDevice = CreateValidRootDevice();
            var parentDevice = CreateValidEmbeddedDevice(rootDevice);
            rootDevice.AddDevice(parentDevice);
            var childDevice = CreateValidEmbeddedDevice(rootDevice);
            parentDevice.AddDevice(childDevice);

            var server = new MockCommsServer();
            using (var publisher = new TestDevicePublisher(server))
            {
                publisher.SupportPnpRootDevice = false;
                publisher.AddDevice(rootDevice);

                ReceivedUdpData searchRequest = GetSearchRequestMessageWithCustomMXHeader(childDevice.Udn, String.Empty);
                server.MockReceiveMessage(searchRequest);
                server.MockReceiveMessage(searchRequest);
                server.WaitForMockMessage(1500);
                System.Threading.Thread.Sleep(500);

                var searchResponses = GetSentMessages(server.SentMessages);
                var uuidResponses = GetResponses(searchResponses, childDevice.Udn);
                Assert.AreEqual(0, uuidResponses.Count());
            }
        }
Exemple #10
0
        public void Publisher_SearchResponse_IgnoresDuplicateSearchRequest()
        {
            var rootDevice = CreateValidRootDevice();

            var server = new MockCommsServer();
            using (var publisher = new TestDevicePublisher(server))
            {
                publisher.SupportPnpRootDevice = false;
                publisher.AddDevice(rootDevice);

                ReceivedUdpData searchRequest = GetSearchRequestMessage(SsdpConstants.UpnpDeviceTypeRootDevice);

                server.MockReceiveMessage(searchRequest);
                server.MockReceiveMessage(searchRequest);
                server.WaitForMockMessage(1500);
                System.Threading.Thread.Sleep(500);

                var searchResponses = GetSentMessages(server.SentMessages);
                Assert.AreEqual(0, searchResponses.Where((r) => !r.IsSuccessStatusCode).Count());
                Assert.IsTrue(GetResponses(searchResponses, SsdpConstants.UpnpDeviceTypeRootDevice).Count() == 1);
            }
        }
Exemple #11
0
        public void Publisher_SearchResponse_AddCustomHeaders()
        {
            var rootDevice = CreateValidRootDevice();

            var testHeader = new CustomHttpHeader("machinename", Environment.MachineName);
            rootDevice.CustomResponseHeaders.Add(testHeader);

            var server = new MockCommsServer();
            using (var publisher = new TestDevicePublisher(server))
            {
                publisher.SupportPnpRootDevice = false;
                publisher.AddDevice(rootDevice);

                ReceivedUdpData searchRequest = GetSearchRequestMessage(SsdpConstants.UpnpDeviceTypeRootDevice);

                server.MockReceiveMessage(searchRequest);
                server.WaitForMockMessage(1500);

                var searchResponses = GetSentMessages(server.SentMessages);

                Assert.AreEqual(0, searchResponses.Where((r) => !r.IsSuccessStatusCode).Count());
                Assert.IsTrue(GetResponses(searchResponses, SsdpConstants.UpnpDeviceTypeRootDevice).Count() >= 1);
                Assert.IsTrue(GetResponses(searchResponses, SsdpConstants.PnpDeviceTypeRootDevice).Count() == 0);
                Assert.IsTrue(GetResponses(searchResponses, rootDevice.Udn).Count() >= 1);
                Assert.IsTrue(GetResponses(searchResponses, rootDevice.FullDeviceType).Count() >= 1);
                Assert.AreEqual(0, searchResponses.Where((r) => !r.Headers.GetValues("USN").First().StartsWith(rootDevice.Udn)).Count());
                Assert.AreEqual(0, searchResponses.Where((r) => !r.Headers.GetValues(testHeader.Name).First().StartsWith(testHeader.Value)).Count());
            }
        }
Exemple #12
0
        public void Publisher_SearchResponse_SendsGrandchildResponses()
        {
            var rootDevice = CreateValidRootDevice();
            var parentDevice = CreateValidEmbeddedDevice(rootDevice);
            rootDevice.AddDevice(parentDevice);
            var childDevice = CreateValidEmbeddedDevice(rootDevice);
            parentDevice.AddDevice(childDevice);

            var server = new MockCommsServer();
            using (var publisher = new TestDevicePublisher(server))
            {
                publisher.SupportPnpRootDevice = false;
                publisher.AddDevice(rootDevice);

                ReceivedUdpData searchRequest = GetSearchRequestMessage(childDevice.Udn);

                server.MockReceiveMessage(searchRequest);
                server.WaitForMockMessage(1500);
                System.Threading.Thread.Sleep(100);

                var searchResponses = GetSentMessages(server.SentMessages);
                var uuidResponses = GetResponses(searchResponses, childDevice.Udn);
                Assert.AreEqual(1, uuidResponses.Count());
            }
        }
Exemple #13
0
        public void Publisher_SearchResponse_RespondsToUdnSearch()
        {
            var rootDevice = CreateValidRootDevice();

            var server = new MockCommsServer();
            using (var publisher = new TestDevicePublisher(server))
            {
                publisher.AddDevice(rootDevice);

                ReceivedUdpData searchRequest = GetSearchRequestMessage(rootDevice.Udn);

                server.MockReceiveMessage(searchRequest);
                server.WaitForMockMessage(1500);
                System.Threading.Thread.Sleep(100);

                var searchResponses = GetSentMessages(server.SentMessages);
                Assert.AreEqual(0, searchResponses.Where((r) => !r.IsSuccessStatusCode).Count());
                Assert.IsTrue(GetResponses(searchResponses, SsdpConstants.UpnpDeviceTypeRootDevice).Count() >= 1);
                Assert.IsTrue(GetResponses(searchResponses, SsdpConstants.PnpDeviceTypeRootDevice).Count() >= 1);
                Assert.IsTrue(GetResponses(searchResponses, rootDevice.Udn).Count() >= 1);
                Assert.IsTrue(GetResponses(searchResponses, rootDevice.FullDeviceType).Count() >= 1);
                Assert.AreEqual(0, searchResponses.Where((r) => !r.Headers.GetValues("USN").First().StartsWith(rootDevice.Udn)).Count());
            }
        }
Exemple #14
0
        public void DeviceLocator_Notifications_SearchResponseUsesSharedMaxAge()
        {
            var server = new MockCommsServer();
            var deviceLocator = new MockDeviceLocator(server);

            var publishedDevice = CreateDeviceTree();
            publishedDevice.CacheLifetime = TimeSpan.FromMinutes(30);

            DiscoveredSsdpDevice device = null;

            using (var eventSignal = new System.Threading.AutoResetEvent(false))
            {
                deviceLocator.DeviceAvailable += (sender, args) =>
                {
                    device = args.DiscoveredDevice;
                    eventSignal.Set();
                };

                var t = deviceLocator.SearchAsync(TimeSpan.FromSeconds(3));
                System.Threading.Thread.Sleep(500);
                server.MockReceiveMessage(GetMockSearchResponseWithCustomCacheHeader(publishedDevice, publishedDevice.Udn, String.Format("CACHE-CONTROL: public, s-maxage={0}", publishedDevice.CacheLifetime.TotalSeconds)));
                eventSignal.WaitOne(10000);
                var results = t.GetAwaiter().GetResult();

                Assert.IsNotNull(results);
                Assert.IsTrue(results.Any());
                Assert.AreEqual(device.CacheLifetime, results.First().CacheLifetime);
            }
        }
Exemple #15
0
        public void Publisher_SearchResponse_NoResponseToBlankSearchTarget()
        {
            var rootDevice = CreateValidRootDevice();

            var server = new MockCommsServer();
            using (var publisher = new TestDevicePublisher(server))
            {
                publisher.AddDevice(rootDevice);

                ReceivedUdpData searchRequest = GetSearchRequestMessage(String.Empty);

                server.MockReceiveMessage(searchRequest);
                server.WaitForMockMessage(1500);

                var searchResponses = GetSentMessages(server.SentMessages);
                Assert.AreEqual(0, searchResponses.Count());
            }
        }
Exemple #16
0
        public void DeviceLocator_SearchAsync_RaisesDeviceAvailableOnResponse()
        {
            var server = new MockCommsServer();
            var deviceLocator = new MockDeviceLocator(server);

            var publishedDevice = CreateDeviceTree();
            DiscoveredSsdpDevice device = null;
            bool newlyDiscovered = false;
            var receivedNotification = false;

            using (var eventSignal = new System.Threading.AutoResetEvent(false))
            {
                deviceLocator.DeviceAvailable += (sender, args) =>
                {
                    device = args.DiscoveredDevice;
                    newlyDiscovered = args.IsNewlyDiscovered;
                    receivedNotification = true;
                    eventSignal.Set();
                };

                var task = deviceLocator.SearchAsync(TimeSpan.FromSeconds(2));
                server.MockReceiveMessage(GetMockSearchResponse(publishedDevice, publishedDevice.Udn));
                eventSignal.WaitOne(10000);
                Assert.IsTrue(receivedNotification);
                var results = task.GetAwaiter().GetResult();

                Assert.IsNotNull(results);
                Assert.IsTrue(results.Any());
                Assert.IsTrue(results.First().Usn == device.Usn);
            }
        }
Exemple #17
0
        public void Publisher_SearchResponse_NoResponseWithNonNumericMXHeader()
        {
            var rootDevice = CreateValidRootDevice();

            var server = new MockCommsServer();
            using (var publisher = new TestDevicePublisher(server))
            {
                publisher.SupportPnpRootDevice = false;
                publisher.AddDevice(rootDevice);

                ReceivedUdpData searchRequest = GetSearchRequestMessageWithCustomMXHeader(rootDevice.Udn, "-1");

                server.MockReceiveMessage(searchRequest);
                server.WaitForMockMessage(1500);

                var searchResponses = GetSentMessages(server.SentMessages);
                Assert.AreEqual(0, searchResponses.Count());
            }
        }