mirror of
https://dev.azure.com/TeilRad/sharee.bike%20App/_git/Code
synced 2024-12-23 07:36:31 +01:00
189 lines
8.6 KiB
C#
189 lines
8.6 KiB
C#
|
using NSubstitute;
|
|||
|
using NUnit.Framework;
|
|||
|
using Plugin.BLE.Abstractions;
|
|||
|
using Plugin.BLE.Abstractions.Contracts;
|
|||
|
using System;
|
|||
|
using System.Threading;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using TINK.Model.Device;
|
|||
|
using TINK.Services.BluetoothLock.BLE;
|
|||
|
using TINK.Services.BluetoothLock.Tdo;
|
|||
|
|
|||
|
namespace TestLockItBLE.Services.BluetoothLock.BLE
|
|||
|
{
|
|||
|
public class TestLockItBase
|
|||
|
{
|
|||
|
|
|||
|
[Test]
|
|||
|
public void TestName_Null()
|
|||
|
{
|
|||
|
var device = Substitute.For<IDevice>();
|
|||
|
var adapter = Substitute.For<IAdapter>();
|
|||
|
var cipher = Substitute.For<TINK.Model.Device.ICipher>();
|
|||
|
var auth = Substitute.For<ICharacteristic>();
|
|||
|
var lockControl = Substitute.For<IService>();
|
|||
|
|
|||
|
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<Guid>(), Arg.Any<CancellationToken>()).Returns(Task.FromResult(lockControl));
|
|||
|
lockControl.GetCharacteristicAsync(Arg.Any<Guid>()).Returns(Task.FromResult(auth));
|
|||
|
auth.WriteAsync(Arg.Any<byte[]>()).Returns(Task.FromResult(true));
|
|||
|
auth.ReadAsync(Arg.Any<CancellationToken>()).Returns(Task.FromResult(new byte[8]));
|
|||
|
cipher.Decrypt(Arg.Any<byte[]>(), Arg.Any<byte[]>()).Returns(new byte[3]);
|
|||
|
cipher.Encrypt(Arg.Any<byte[]>(), Arg.Any<byte[]>()).Returns(new byte[16]);
|
|||
|
auth.WriteAsync(Arg.Any<byte[]>()).Returns(true);
|
|||
|
|
|||
|
device.Name.Returns((string)null);
|
|||
|
|
|||
|
// Use factory to create LockIt-object.
|
|||
|
var lockIt = LockItBaseTest.Authenticate(device, authTdo, adapter, cipher).Result;
|
|||
|
Assert.AreEqual(string.Empty, lockIt.Name);
|
|||
|
}
|
|||
|
|
|||
|
[Test]
|
|||
|
public void TestName()
|
|||
|
{
|
|||
|
var device = Substitute.For<IDevice>();
|
|||
|
var adapter = Substitute.For<IAdapter>();
|
|||
|
var cipher = Substitute.For<ICipher>();
|
|||
|
var auth = Substitute.For<ICharacteristic>();
|
|||
|
var lockControl = Substitute.For<IService>();
|
|||
|
|
|||
|
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<Guid>(), Arg.Any<CancellationToken>()).Returns(Task.FromResult(lockControl));
|
|||
|
lockControl.GetCharacteristicAsync(Arg.Any<Guid>()).Returns(Task.FromResult(auth));
|
|||
|
auth.WriteAsync(Arg.Any<byte[]>()).Returns(Task.FromResult(true));
|
|||
|
auth.ReadAsync(Arg.Any<CancellationToken>()).Returns(Task.FromResult(new byte[8]));
|
|||
|
cipher.Decrypt(Arg.Any<byte[]>(), Arg.Any<byte[]>()).Returns(new byte[3]);
|
|||
|
cipher.Encrypt(Arg.Any<byte[]>(), Arg.Any<byte[]>()).Returns(new byte[16]);
|
|||
|
auth.WriteAsync(Arg.Any<byte[]>()).Returns(true);
|
|||
|
|
|||
|
device.Name.Returns("ISHAREIT+123");
|
|||
|
|
|||
|
// Use factory to create LockIt-object.
|
|||
|
var lockIt = LockItBaseTest.Authenticate(device, authTdo, adapter, cipher).Result;
|
|||
|
Assert.AreEqual("ISHAREIT+123", lockIt.Name);
|
|||
|
}
|
|||
|
|
|||
|
[Test]
|
|||
|
public void TestId()
|
|||
|
{
|
|||
|
var device = Substitute.For<IDevice>();
|
|||
|
var adapter = Substitute.For<IAdapter>();
|
|||
|
var cipher = Substitute.For<ICipher>();
|
|||
|
var auth = Substitute.For<ICharacteristic>();
|
|||
|
var lockControl = Substitute.For<IService>();
|
|||
|
|
|||
|
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<Guid>(), Arg.Any<CancellationToken>()).Returns(Task.FromResult(lockControl));
|
|||
|
lockControl.GetCharacteristicAsync(Arg.Any<Guid>()).Returns(Task.FromResult(auth));
|
|||
|
auth.WriteAsync(Arg.Any<byte[]>()).Returns(Task.FromResult(true));
|
|||
|
auth.ReadAsync(Arg.Any<CancellationToken>()).Returns(Task.FromResult(new byte[8]));
|
|||
|
cipher.Decrypt(Arg.Any<byte[]>(), Arg.Any<byte[]>()).Returns(new byte[3]);
|
|||
|
cipher.Encrypt(Arg.Any<byte[]>(), Arg.Any<byte[]>()).Returns(new byte[16]);
|
|||
|
auth.WriteAsync(Arg.Any<byte[]>()).Returns(true);
|
|||
|
|
|||
|
device.Name.Returns("ISHAREIT+123");
|
|||
|
|
|||
|
// Use factory to create LockIt-object.
|
|||
|
var lockIt = LockItBaseTest.Authenticate(device, authTdo, adapter, cipher).Result;
|
|||
|
Assert.AreEqual(123, lockIt.Id);
|
|||
|
}
|
|||
|
|
|||
|
[Test]
|
|||
|
public void TestGuid()
|
|||
|
{
|
|||
|
var device = Substitute.For<IDevice>();
|
|||
|
var adapter = Substitute.For<IAdapter>();
|
|||
|
var cipher = Substitute.For<TINK.Model.Device.ICipher>();
|
|||
|
var auth = Substitute.For<ICharacteristic>();
|
|||
|
var lockControl = Substitute.For<IService>();
|
|||
|
|
|||
|
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<Guid>(), Arg.Any<CancellationToken>()).Returns(Task.FromResult(lockControl));
|
|||
|
lockControl.GetCharacteristicAsync(Arg.Any<Guid>()).Returns(Task.FromResult(auth));
|
|||
|
auth.WriteAsync(Arg.Any<byte[]>()).Returns(Task.FromResult(true));
|
|||
|
auth.ReadAsync(Arg.Any<CancellationToken>()).Returns(Task.FromResult(new byte[8]));
|
|||
|
cipher.Decrypt(Arg.Any<byte[]>(), Arg.Any<byte[]>()).Returns(new byte[3]);
|
|||
|
cipher.Encrypt(Arg.Any<byte[]>(), Arg.Any<byte[]>()).Returns(new byte[16]);
|
|||
|
auth.WriteAsync(Arg.Any<byte[]>()).Returns(true);
|
|||
|
|
|||
|
device.Name.Returns("ISHAREIT+123");
|
|||
|
|
|||
|
// Use factory to create LockIt-object.
|
|||
|
var lockIt = LockItBaseTest.Authenticate(device, authTdo, adapter, cipher).Result;
|
|||
|
Assert.AreEqual(new Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd"), lockIt.Guid);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary> Derives from LockItBase class for testing purposes. </summary>
|
|||
|
|
|||
|
private class LockItBaseTest : LockItBase
|
|||
|
{
|
|||
|
private LockItBaseTest(IDevice device, IAdapter adapter, ICipher cipher) : base(device, adapter, cipher)
|
|||
|
{
|
|||
|
}
|
|||
|
/// <summary> Connects to device. </summary>
|
|||
|
/// <param name="authInfo">Info required to connect.</param>
|
|||
|
/// <param name="device">Device with must be connected.</param>
|
|||
|
/// <returns>True if connecting succeeded, false if not.</returns>
|
|||
|
public static async Task<LockItBase> Authenticate(
|
|||
|
IDevice device,
|
|||
|
LockInfoAuthTdo authInfo,
|
|||
|
IAdapter adapter,
|
|||
|
ICipher cipher)
|
|||
|
=> await Authenticate(
|
|||
|
device,
|
|||
|
authInfo,
|
|||
|
adapter,
|
|||
|
cipher,
|
|||
|
() => new LockItBaseTest(device, adapter, cipher));
|
|||
|
|
|||
|
public override Task<LockitLockingState?> CloseAsync()
|
|||
|
{
|
|||
|
throw new NotImplementedException();
|
|||
|
}
|
|||
|
|
|||
|
public override Task<LockitLockingState?> OpenAsync()
|
|||
|
{
|
|||
|
throw new NotImplementedException();
|
|||
|
}
|
|||
|
|
|||
|
public override Task ReconnectAsync(LockInfoAuthTdo authInfo, TimeSpan connectTimeout)
|
|||
|
{
|
|||
|
throw new NotImplementedException();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|