From 0741005ffac3904b1cf773f5a5fc3bc27bebb15a Mon Sep 17 00:00:00 2001 From: smdn Date: Fri, 19 Jan 2024 00:41:44 +0900 Subject: [PATCH] implement and expose ISmartDevice.EndPoint --- .../Smdn.TPSmartHomeDevices.Kasa/KasaDevice.cs | 13 +++++++++++++ .../Smdn.TPSmartHomeDevices.Tapo/TapoDevice.cs | 13 +++++++++++++ .../Smdn.TPSmartHomeDevices.Kasa/KasaDevice.cs | 9 ++++++++- .../Smdn.TPSmartHomeDevices.Tapo/TapoDevice.cs | 10 +++++++++- 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/Smdn.TPSmartHomeDevices.Kasa/Smdn.TPSmartHomeDevices.Kasa/KasaDevice.cs b/src/Smdn.TPSmartHomeDevices.Kasa/Smdn.TPSmartHomeDevices.Kasa/KasaDevice.cs index 0bb2213..906cf80 100644 --- a/src/Smdn.TPSmartHomeDevices.Kasa/Smdn.TPSmartHomeDevices.Kasa/KasaDevice.cs +++ b/src/Smdn.TPSmartHomeDevices.Kasa/Smdn.TPSmartHomeDevices.Kasa/KasaDevice.cs @@ -50,6 +50,19 @@ protected readonly struct NullParameter { } private IDeviceEndPoint deviceEndPoint; // if null, it indicates a 'disposed' state. + /// + /// Gets the representing a endpoint of smart device, + /// which will be used to resolve the actual endpoint used to communicate with smart devices. + /// + /// The device has been disposed. + public IDeviceEndPoint EndPoint { + get { + ThrowIfDisposed(); + + return deviceEndPoint; + } + } + #if SYSTEM_DIAGNOSTICS_CODEANALYSIS_MEMBERNOTNULLWHENATTRIBUTE [MemberNotNullWhen(false, nameof(deviceEndPoint))] #endif diff --git a/src/Smdn.TPSmartHomeDevices.Tapo/Smdn.TPSmartHomeDevices.Tapo/TapoDevice.cs b/src/Smdn.TPSmartHomeDevices.Tapo/Smdn.TPSmartHomeDevices.Tapo/TapoDevice.cs index 49a663d..220cc2e 100644 --- a/src/Smdn.TPSmartHomeDevices.Tapo/Smdn.TPSmartHomeDevices.Tapo/TapoDevice.cs +++ b/src/Smdn.TPSmartHomeDevices.Tapo/Smdn.TPSmartHomeDevices.Tapo/TapoDevice.cs @@ -49,6 +49,19 @@ public LoggerScopeEndPointState(EndPoint currentEndPoint, IDeviceEndPoint device private IDeviceEndPoint deviceEndPoint; // if null, it indicates a 'disposed' state. + /// + /// Gets the representing a endpoint of smart device, + /// which will be used to resolve the actual endpoint used to communicate with smart devices. + /// + /// The device has been disposed. + public IDeviceEndPoint EndPoint { + get { + ThrowIfDisposed(); + + return deviceEndPoint; + } + } + #if SYSTEM_DIAGNOSTICS_CODEANALYSIS_MEMBERNOTNULLWHENATTRIBUTE [MemberNotNullWhen(false, nameof(deviceEndPoint))] #endif diff --git a/tests/Smdn.TPSmartHomeDevices.Kasa/Smdn.TPSmartHomeDevices.Kasa/KasaDevice.cs b/tests/Smdn.TPSmartHomeDevices.Kasa/Smdn.TPSmartHomeDevices.Kasa/KasaDevice.cs index 137d06a..ebf72b9 100644 --- a/tests/Smdn.TPSmartHomeDevices.Kasa/Smdn.TPSmartHomeDevices.Kasa/KasaDevice.cs +++ b/tests/Smdn.TPSmartHomeDevices.Kasa/Smdn.TPSmartHomeDevices.Kasa/KasaDevice.cs @@ -52,6 +52,7 @@ public async Task Create_WithIPAddress() ipAddress: IPAddress.Loopback ); + Assert.That(device.EndPoint, Is.Not.Null); Assert.That( await device.ResolveEndPointAsync(), Is.EqualTo(new IPEndPoint(IPAddress.Loopback, KasaClient.DefaultPort)) @@ -65,6 +66,7 @@ public async Task Create_WithHostName() host: "localhost" ); + Assert.That(device.EndPoint, Is.Not.Null); Assert.That( await device.ResolveEndPointAsync(), Is.EqualTo(new DnsEndPoint("localhost", KasaClient.DefaultPort)) @@ -85,6 +87,7 @@ public async Task Create_WithMacAddress_IServiceProvider() serviceProvider: services.BuildServiceProvider() ); + Assert.That(device.EndPoint, Is.Not.Null); Assert.That( await device.ResolveEndPointAsync(), Is.EqualTo(new IPEndPoint(IPAddress.Loopback, KasaClient.DefaultPort)) @@ -107,10 +110,13 @@ public void Create_WithMacAddress_IServiceProvider_IDeviceEndPointFactoryNotRegi [Test] public async Task Create_WithEndPoint() { + var endpoint = new StaticDeviceEndPoint(new DnsEndPoint("localhost", 0)); + using var device = KasaDevice.Create( - deviceEndPoint: new StaticDeviceEndPoint(new DnsEndPoint("localhost", 0)) + deviceEndPoint: endpoint ); + Assert.That(device.EndPoint, Is.EqualTo(endpoint)); Assert.That( await device.ResolveEndPointAsync(), Is.EqualTo(new DnsEndPoint("localhost", KasaClient.DefaultPort)) @@ -127,6 +133,7 @@ public void Dispose() Assert.DoesNotThrow(device.Dispose, "dispose"); Assert.DoesNotThrow(device.Dispose, "dispose again"); + Assert.Throws(() => Assert.That(device.EndPoint, Is.Not.Null), nameof(device.EndPoint)); Assert.Throws(() => Assert.That(device.IsConnected, Is.False), nameof(device.IsConnected)); Assert.ThrowsAsync(async () => await device.ResolveEndPointAsync(), nameof(device.ResolveEndPointAsync)); diff --git a/tests/Smdn.TPSmartHomeDevices.Tapo/Smdn.TPSmartHomeDevices.Tapo/TapoDevice.cs b/tests/Smdn.TPSmartHomeDevices.Tapo/Smdn.TPSmartHomeDevices.Tapo/TapoDevice.cs index 8f6c5e2..fb7cd3b 100644 --- a/tests/Smdn.TPSmartHomeDevices.Tapo/Smdn.TPSmartHomeDevices.Tapo/TapoDevice.cs +++ b/tests/Smdn.TPSmartHomeDevices.Tapo/Smdn.TPSmartHomeDevices.Tapo/TapoDevice.cs @@ -129,6 +129,7 @@ public async Task Create_WithIPAddress() "password" ); + Assert.That(device.EndPoint, Is.Not.Null); Assert.That( await device.ResolveEndPointAsync(), Is.EqualTo(new IPEndPoint(IPAddress.Loopback, TapoClient.DefaultPort)) @@ -144,6 +145,7 @@ public async Task Create_WithHostName() "password" ); + Assert.That(device.EndPoint, Is.Not.Null); Assert.That( await device.ResolveEndPointAsync(), Is.EqualTo(new DnsEndPoint("localhost", TapoClient.DefaultPort)) @@ -166,6 +168,7 @@ public async Task Create_WithMacAddress_IServiceProvider() serviceProvider: services!.BuildServiceProvider() ); + Assert.That(device.EndPoint, Is.Not.Null); Assert.That( await device.ResolveEndPointAsync(), Is.EqualTo(new IPEndPoint(IPAddress.Loopback, TapoClient.DefaultPort)) @@ -190,11 +193,14 @@ public void Create_WithMacAddress_IServiceProvider_IDeviceEndPointFactoryNotRegi [Test] public async Task Create_WithEndPoint() { + var endpoint = new StaticDeviceEndPoint(new DnsEndPoint("localhost", 0)); + using var device = TapoDevice.Create( - deviceEndPoint: new StaticDeviceEndPoint(new DnsEndPoint("localhost", 0)), + deviceEndPoint: endpoint, serviceProvider: services!.BuildServiceProvider() ); + Assert.That(device.EndPoint, Is.EqualTo(endpoint)); Assert.That( await device.ResolveEndPointAsync(), Is.EqualTo(new DnsEndPoint("localhost", TapoClient.DefaultPort)) @@ -249,6 +255,8 @@ public void Dispose() Assert.That(device.Session, Is.Null, nameof(device.Session)); + Assert.Throws(() => Assert.That(device.EndPoint, Is.Not.Null), nameof(device.EndPoint)); + #pragma warning disable CA2012 Assert.ThrowsAsync(async () => await device.ResolveEndPointAsync(), nameof(device.ResolveEndPointAsync)); Assert.Throws(() => device.ResolveEndPointAsync(), nameof(device.ResolveEndPointAsync));