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); } }
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); } }
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); } }
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()); } }
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); } }
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); } }
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()); } }
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()); } }
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); } }
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()); } }
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()); } }
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()); } }
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); } }
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()); } }
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()); } }