using System; using System.Threading; using System.Threading.Tasks; using NSubstitute; using NUnit.Framework; using Plugin.BLE.Abstractions; using Plugin.BLE.Abstractions.Contracts; using ShareeBike.Model.Device; using ShareeBike.Services.BluetoothLock.BLE; using ShareeBike.Services.BluetoothLock.Tdo; namespace LockIt.BLE.Tests.Services.BluetoothLock.BLE { public class TestLockItBase { [Test] public void TestName_Null() { var device = Substitute.For(); var adapter = Substitute.For(); var cipher = Substitute.For(); var auth = Substitute.For(); var lockControl = Substitute.For(); var authTdo = new LockInfoAuthTdo.Builder { Id = 12, K_seed = new byte[] { (byte)'X', (byte)'D', (byte)'G', (byte)'x', (byte)'q', (byte)'M', (byte)'f', (byte)'A', (byte)'F', (byte)'q', (byte)'g', (byte)'N', (byte)'V', (byte)'r', (byte)'N', (byte)'Y' }, K_u = new byte[16] }.Build(); device.State.Returns(DeviceState.Connected); device.Id.Returns(new Guid("0000f00d-1212-efde-1523-785fef13d123")); device.GetServiceAsync(Arg.Any(), Arg.Any()).Returns(Task.FromResult(lockControl)); lockControl.GetCharacteristicAsync(Arg.Any()).Returns(Task.FromResult(auth)); auth.WriteAsync(Arg.Any()).Returns(Task.FromResult(LockItBase.ERRORCODE_SUCCESS)); auth.ReadAsync(Arg.Any()).Returns(Task.FromResult((new byte[8], LockItBase.ERRORCODE_SUCCESS))); cipher.Decrypt(Arg.Any(), Arg.Any()).Returns(new byte[3]); cipher.Encrypt(Arg.Any(), Arg.Any()).Returns(new byte[16]); auth.WriteAsync(Arg.Any()).Returns(LockItBase.ERRORCODE_SUCCESS); device.Name.Returns((string)null); // Use factory to create LockIt-object. var lockIt = LockItBaseTest.Authenticate(device, authTdo, adapter, cipher).Result; Assert.That(lockIt.Name, Is.EqualTo(string.Empty)); } [Test] public void TestName() { var device = Substitute.For(); var adapter = Substitute.For(); var cipher = Substitute.For(); var auth = Substitute.For(); var lockControl = Substitute.For(); var authTdo = new LockInfoAuthTdo.Builder { Id = 12, K_seed = new byte[] { (byte)'m', (byte)'x', (byte)'p', (byte)'J', (byte)'g', (byte)'D', (byte)'D', (byte)'i', (byte)'o', (byte)'T', (byte)'F', (byte)'M', (byte)'S', (byte)'E', (byte)'m', (byte)'E' }, K_u = new byte[16] }.Build(); device.State.Returns(DeviceState.Connected); device.Id.Returns(new Guid("0000f00d-1212-efde-1523-785fef13d123")); device.GetServiceAsync(Arg.Any(), Arg.Any()).Returns(Task.FromResult(lockControl)); lockControl.GetCharacteristicAsync(Arg.Any()).Returns(Task.FromResult(auth)); auth.WriteAsync(Arg.Any()).Returns(Task.FromResult(LockItBase.ERRORCODE_SUCCESS)); auth.ReadAsync(Arg.Any()).Returns(Task.FromResult((new byte[8], LockItBase.ERRORCODE_SUCCESS))); cipher.Decrypt(Arg.Any(), Arg.Any()).Returns(new byte[3]); cipher.Encrypt(Arg.Any(), Arg.Any()).Returns(new byte[16]); auth.WriteAsync(Arg.Any()).Returns(LockItBase.ERRORCODE_SUCCESS); device.Name.Returns("ISHAREIT+123"); // Use factory to create LockIt-object. var lockIt = LockItBaseTest.Authenticate(device, authTdo, adapter, cipher).Result; Assert.That(lockIt.Name, Is.EqualTo("ISHAREIT+123")); } [Test] public void TestId() { var device = Substitute.For(); var adapter = Substitute.For(); var cipher = Substitute.For(); var auth = Substitute.For(); var lockControl = Substitute.For(); var authTdo = new LockInfoAuthTdo.Builder { Id = 12, K_seed = new byte[] { (byte)'l', (byte)'x', (byte)'p', (byte)'J', (byte)'g', (byte)'D', (byte)'D', (byte)'i', (byte)'o', (byte)'T', (byte)'F', (byte)'M', (byte)'S', (byte)'E', (byte)'m', (byte)'E' }, K_u = new byte[16] }.Build(); device.State.Returns(DeviceState.Connected); device.Id.Returns(new Guid("0000f00d-1212-efde-1523-785fef13d123")); device.GetServiceAsync(Arg.Any(), Arg.Any()).Returns(Task.FromResult(lockControl)); lockControl.GetCharacteristicAsync(Arg.Any()).Returns(Task.FromResult(auth)); auth.WriteAsync(Arg.Any()).Returns(Task.FromResult(LockItBase.ERRORCODE_SUCCESS)); auth.ReadAsync(Arg.Any()).Returns(Task.FromResult((new byte[8], LockItBase.ERRORCODE_SUCCESS))); cipher.Decrypt(Arg.Any(), Arg.Any()).Returns(new byte[3]); cipher.Encrypt(Arg.Any(), Arg.Any()).Returns(new byte[16]); auth.WriteAsync(Arg.Any()).Returns(LockItBase.ERRORCODE_SUCCESS); device.Name.Returns("ISHAREIT+123"); // Use factory to create LockIt-object. var lockIt = LockItBaseTest.Authenticate(device, authTdo, adapter, cipher).Result; Assert.That(lockIt.Id, Is.EqualTo(123)); } [Test] public void TestGuid() { var device = Substitute.For(); var adapter = Substitute.For(); var cipher = Substitute.For(); var auth = Substitute.For(); var lockControl = Substitute.For(); var authTdo = new LockInfoAuthTdo.Builder { Id = 12, K_seed = new byte[] { (byte)'l', (byte)'x', (byte)'p', (byte)'J', (byte)'g', (byte)'D', (byte)'D', (byte)'i', (byte)'o', (byte)'T', (byte)'F', (byte)'M', (byte)'S', (byte)'E', (byte)'m', (byte)'E' }, K_u = new byte[16] }.Build(); device.State.Returns(DeviceState.Connected); device.Id.Returns(new Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")); device.GetServiceAsync(Arg.Any(), Arg.Any()).Returns(Task.FromResult(lockControl)); lockControl.GetCharacteristicAsync(Arg.Any()).Returns(Task.FromResult(auth)); auth.WriteAsync(Arg.Any()).Returns(Task.FromResult(LockItBase.ERRORCODE_SUCCESS)); auth.ReadAsync(Arg.Any()).Returns(Task.FromResult((new byte[8], LockItBase.ERRORCODE_SUCCESS))); cipher.Decrypt(Arg.Any(), Arg.Any()).Returns(new byte[3]); cipher.Encrypt(Arg.Any(), Arg.Any()).Returns(new byte[16]); auth.WriteAsync(Arg.Any()).Returns(LockItBase.ERRORCODE_SUCCESS); device.Name.Returns("ISHAREIT+123"); // Use factory to create LockIt-object. var lockIt = LockItBaseTest.Authenticate(device, authTdo, adapter, cipher).Result; Assert.That(lockIt.Guid, Is.EqualTo(new Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd"))); } /// Derives from LockItBase class for testing purposes. private class LockItBaseTest : LockItBase { private LockItBaseTest(IDevice device, IAdapter adapter, ICipher cipher) : base(device, adapter, cipher) { } /// Connects to device. /// Info required to connect. /// Device with must be connected. /// True if connecting succeeded, false if not. public static async Task Authenticate( IDevice device, LockInfoAuthTdo authInfo, IAdapter adapter, ICipher cipher) => await Authenticate( device, authInfo, adapter, cipher, () => new LockItBaseTest(device, adapter, cipher)); public override Task CloseAsync() { throw new NotImplementedException(); } public override Task OpenAsync() { throw new NotImplementedException(); } public override Task ReconnectAsync(LockInfoAuthTdo authInfo, TimeSpan connectTimeout) { throw new NotImplementedException(); } } } }