sharee.bike-App/TestTINKLib/Fixtures/ObjectTests/Services/BluetoothLock/TestLockItBaseService.cs

93 lines
4.2 KiB
C#
Raw Permalink Normal View History

2021-07-12 21:31:46 +02:00
using NSubstitute;
using NUnit.Framework;
using Plugin.BLE.Abstractions.Contracts;
using System;
using System.Threading.Tasks;
using TINK.Services.BluetoothLock.Tdo;
using TINK.Services.BluetoothLock.Exception;
using TINK.Services.BluetoothLock.BLE;
using DeviceState = Plugin.BLE.Abstractions.DeviceState;
using System.Threading;
namespace TestTINKLib.Fixtures.ObjectTests.Services.BluetoothLock
{
[TestFixture]
public class TestLockItBaseService
{
[Test]
public void TestConnect_Connected_InvalidArgs()
{
var device = Rhino.Mocks.MockRepository.GenerateStub<IDevice>();
var adapter = Rhino.Mocks.MockRepository.GenerateStub<IAdapter>();
var cipher = Rhino.Mocks.MockRepository.GenerateStub<TINK.Model.Device.ICipher>();
Rhino.Mocks.RhinoMocksExtensions.Stub(device, x => x.State).Return(DeviceState.Disconnected);
var exception = Assert.Throws<AggregateException>(
() => { var lockIt = LockItEventBased.Authenticate(device, null, adapter, cipher).Result; },
"If connected no auth is requied.");
Assert.That(exception.InnerExceptions.Count > 0);
Assert.That(exception.InnerExceptions[0], Is.InstanceOf<BluetoothDisconnectedException>());
}
[Test]
public void TestConnect_Connected()
{
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)'i', (byte)'V', (byte)'F', (byte)'m', (byte)'u', (byte)'T', (byte)'n', (byte)'K', (byte)'q', (byte)'E', (byte)'Y', (byte)'h', (byte)'m', (byte)'T', (byte)'l', (byte)'e' },
K_u = new byte[16]
}.Build();
device.State.Returns(DeviceState.Connected);
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)); // Write COPRI seed to lock
auth.ReadAsync(Arg.Any<CancellationToken>()).Returns(Task.FromResult(new byte[8])); // Read lock seed
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(Task.FromResult(true)); // Write COPRI seed to lock
device.Name.Returns("Origin");
Assert.AreEqual(
"Origin",
LockItEventBased.Authenticate(device, authTdo, adapter, cipher).Result.Name,
"If connected no auth is requied.");
}
[Test]
public void TestAuth()
{
var authTdo = new LockInfoAuthTdo.Builder {
Id = 12,
K_seed = new byte[] { (byte)'c', (byte)'b', (byte)'z', (byte)'b', (byte)'y', (byte)'I', (byte)'q', (byte)'j', (byte)'v', (byte)'L', (byte)'V', (byte)'I', (byte)'t', (byte)'C', (byte)'B', (byte)'I' },
K_u = new byte[16]
}.Build();
var device = Rhino.Mocks.MockRepository.GenerateStub<IDevice>();
var adapter = Rhino.Mocks.MockRepository.GenerateStub<IAdapter>();
var cipher = Rhino.Mocks.MockRepository.GenerateStub<TINK.Model.Device.ICipher>();
Rhino.Mocks.RhinoMocksExtensions.Stub(device, x => x.State).Return(DeviceState.Disconnected);
// Use factory to create LockIt-object.
var exception = Assert.Throws<AggregateException>(
() => { var lockIt = LockItEventBased.Authenticate(device, authTdo, adapter, cipher).Result; },
"If connected no auth is requied.");
Assert.That(exception.InnerExceptions.Count > 0);
Assert.That(exception.InnerExceptions[0], Is.InstanceOf<BluetoothDisconnectedException>());
}
}
}