public async Task ExecuteAsync_PublishSensorDeviceTypeTypeData_CorrectlyPublished() { var publishedMessages = new List <MqttApplicationMessage>(); var sensorDeviceType = new SensorDeviceType() { Id = "DeviceType1", Sensors = new List <Sensor>() { new Sensor() { Id = "Sensor1", } } }; //Arrange var config = new CollectorConfiguration { CollectorEnabled = true, BluetoothAdapterName = "test", ScanIntervalSeconds = 1, SensorDevices = new List <SensorDevice>(), SensorDeviceTypes = new List <SensorDeviceType>() { sensorDeviceType } }; _mqttClientMock.Setup(m => m.IsConnected).Returns(true); _mqttClientMock.Setup(m => m.PublishAsync(It.IsAny <MqttApplicationMessage>(), CancellationToken.None)).Callback((MqttApplicationMessage message, CancellationToken ct) => { publishedMessages.Add(message); }); _configMock.Setup(c => c.Value).Returns(config); //Act var btGwService = _serviceProvider.GetService <CollectorService>(); var cts = new CancellationTokenSource(); #pragma warning disable CS4014 // Run as fire & forget Task.Run(() => btGwService.StartAsync(cts.Token).ConfigureAwait(false)); #pragma warning restore CS4014 await Task.Delay(100); await btGwService.HandleConnectedAsync(new MqttClientConnectedEventArgs(new MqttClientAuthenticateResult())); cts.Cancel(); // Assert var topic = MqttMessageHelper.GetSensorDeviceTypeTopic(sensorDeviceType.Id); var payload = MqttMessageHelper.SerializePayload(sensorDeviceType); var message = publishedMessages.FirstOrDefault(m => m.Topic.Equals(topic, StringComparison.OrdinalIgnoreCase)); Assert.IsNotNull(message, "MQTT message for type data of sensor device type was not received"); Assert.AreEqual(topic, message?.Topic, "Sensor device type message topic was not correct"); Assert.AreEqual(payload, message?.ConvertPayloadToString(), "Sensor device type message payload was not correct"); }
public async Task GetDeviceDataAsync_BluetoothDevices_ScanMade() { var sensorDeviceTypeId = "RuuviTag"; // Arrange var sensorDevice = new SensorDevice { SensorDeviceTypeId = sensorDeviceTypeId, Id = "SensorDevice1" }; var sensorDeviceType = new SensorDeviceType() { Id = sensorDeviceTypeId, Sensors = new List <Sensor>() { new Sensor() { Id = "Sensor1", } } }; _dataReaderMock.Setup(d => d.ReadDeviceDataAsync(It.IsAny <SensorDevice>())) .ReturnsAsync(new List <MeasurementData>()); var config = new CollectorConfiguration { CollectorEnabled = true, BluetoothAdapterName = "test", ScanIntervalSeconds = 1, SensorDevices = new List <SensorDevice>() { sensorDevice }, SensorDeviceTypes = new List <SensorDeviceType>() { sensorDeviceType } }; _configMock.Setup(c => c.Value).Returns(config); var deviceScanner = _serviceProvider.GetService <Collector.DeviceScanner.DeviceScanner>(); // Act var fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); // Assert _bleReaderMock.Verify(b => b.ScanAsync(It.IsAny <string>(), It.IsAny <int>()), Times.Once, "Bluetooth scan should've been made"); }
public async Task ExecuteAsync_PublishMeasurementData_CorrectlyPublished() { MqttApplicationMessage publishedMessage = null; var sensorDevice = new SensorDevice() { Id = "Device1", SensorDeviceTypeId = "DeviceType1" }; var sensorDeviceType = new SensorDeviceType() { Id = "DeviceType1", Sensors = new List <Sensor>() { new Sensor() { Id = "Sensor1", } } }; //Arrange var config = new CollectorConfiguration { CollectorEnabled = true, BluetoothAdapterName = "test", ScanIntervalSeconds = 0, SensorDevices = new List <SensorDevice>() { sensorDevice }, SensorDeviceTypes = new List <SensorDeviceType>() { sensorDeviceType } }; var measurementData = new MeasurementData() { SensorDeviceId = sensorDevice.Id, SensorId = sensorDeviceType.Sensors[0].Id, Timestamp = DateTime.Now, Value = "123" }; var measurementList = new List <MeasurementData>() { measurementData }; _mqttClientMock.Setup(m => m.IsConnected).Returns(true); _mqttClientMock.Setup(m => m.PublishAsync(It.IsAny <MqttApplicationMessage>(), CancellationToken.None)).Callback((MqttApplicationMessage message, CancellationToken ct) => { publishedMessage = message; }); _configMock.Setup(c => c.Value).Returns(config); _deviceScannerMock.Setup(d => d.GetDeviceDataAsync(config.SensorDevices)).ReturnsAsync(measurementList); //Act var btGwService = _serviceProvider.GetService <CollectorService>(); var cts = new CancellationTokenSource(); #pragma warning disable CS4014 // Run as fire & forget Task.Run(() => btGwService.StartAsync(cts.Token).ConfigureAwait(false)); #pragma warning restore CS4014 await Task.Delay(100); cts.Cancel(); var expectedMessage = $"{Constant.TopicMeasurement}/{sensorDevice.Location}/{sensorDevice.Id}/{measurementData.SensorId}"; Assert.AreEqual(expectedMessage, publishedMessage.Topic, "Published topic was incorrect"); Assert.AreEqual(measurementData.Value, publishedMessage.ConvertPayloadToString(), "Published payload was incorrect"); }
public async Task GetDeviceDataAsync_CustomMeasurementCreatedForCorrectSensor() { var sensorDeviceTypeId = "SomeSensorType"; var sensorDeviceId = "SomeSensorDevice"; var sensorId = "SomeSensor"; var anotherSensorDeviceId = "AnotherSensor"; var customRule = new CustomMeasurementRule() { Class = "MyClass", Id = "MyId", Name = "My custom measurement", Unit = "qwerty", Operator = Shared.Enum.OperatorType.IsGreaterThan, SensorId = sensorId, Type = Shared.Enum.ValueType.Default, Value = "10" }; // Arrange var sensorDevice = new SensorDevice { SensorDeviceTypeId = sensorDeviceTypeId, Id = sensorDeviceId, CalculatedMeasurements = new List <CustomMeasurementRule>() { customRule } }; var anotherSensorDevice = new SensorDevice { SensorDeviceTypeId = sensorDeviceTypeId, Id = anotherSensorDeviceId, CalculatedMeasurements = new List <CustomMeasurementRule>() { customRule } }; var sensorDeviceType = new SensorDeviceType() { Id = sensorDeviceTypeId, Sensors = new List <Sensor>() { new Sensor() { Id = sensorId, } } }; _dataReaderMock.Setup(d => d.ReadDeviceDataAsync(It.IsAny <SensorDevice>())) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = anotherSensorDeviceId, SensorId = sensorId, Value = "12" }, new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = "8" } }); var config = new CollectorConfiguration { CollectorEnabled = true, BluetoothAdapterName = "test", ScanIntervalSeconds = 1, SensorDevices = new List <SensorDevice>() { sensorDevice, anotherSensorDevice }, SensorDeviceTypes = new List <SensorDeviceType>() { sensorDeviceType } }; _configMock.Setup(c => c.Value).Returns(config); var deviceScanner = _serviceProvider.GetService <Collector.DeviceScanner.DeviceScanner>(); // Act var fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); // Assert Assert.AreEqual(6, fullList.Count, "Amount of measurements is not correct"); var customMeasurement = fullList.First(f => f.SensorId.Equals(customRule.Id, StringComparison.OrdinalIgnoreCase)); Assert.IsFalse(bool.Parse(customMeasurement.Value), "Custom measurement value should be false for the correct sensor device"); }
public async Task GetDeviceDataAsync_WasLastTypeCustomMeasurement_SequenceWorksCorrectly() { var sensorDeviceTypeId = "SomeSensorType"; var sensorDeviceId = "SomeSensorDevice"; var sensorId = "SomeSensor"; var customRule = new CustomMeasurementRule() { Class = "MyClass", Id = "MyId", Name = "My custom measurement", Unit = "qwerty", Operator = Shared.Enum.OperatorType.IsGreaterThan, SensorId = sensorId, Type = Shared.Enum.ValueType.WasLast, Value = "1.66" }; // Arrange var sensorDevice = new SensorDevice { SensorDeviceTypeId = sensorDeviceTypeId, Id = sensorDeviceId, CalculatedMeasurements = new List <CustomMeasurementRule>() { customRule } }; var sensorDeviceType = new SensorDeviceType() { Id = sensorDeviceTypeId, Sensors = new List <Sensor>() { new Sensor() { Id = sensorId, } } }; _dataReaderMock.SetupSequence(d => d.ReadDeviceDataAsync(It.IsAny <SensorDevice>())) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = "0.1" } }) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = "2.1" } }) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = "0.1" } }) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = "2.1" } }) ; var config = new CollectorConfiguration { CollectorEnabled = true, BluetoothAdapterName = "test", ScanIntervalSeconds = 1, SensorDevices = new List <SensorDevice>() { sensorDevice }, SensorDeviceTypes = new List <SensorDeviceType>() { sensorDeviceType } }; _configMock.Setup(c => c.Value).Returns(config); var deviceScanner = _serviceProvider.GetService <Collector.DeviceScanner.DeviceScanner>(); // Act var fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); var customMeasurement = fullList.First(f => f.SensorId.Equals(customRule.Id, StringComparison.OrdinalIgnoreCase)); Assert.AreEqual("-1", customMeasurement.Value, "Value is not what expected when condition has not been true yet"); fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); customMeasurement = fullList.First(f => f.SensorId.Equals(customRule.Id, StringComparison.OrdinalIgnoreCase)); Assert.AreEqual("0", customMeasurement.Value, "Value is not what expected when condition became true"); // Wait more than one second to get "WasLast" value to get updated to 1 await Task.Delay(1200); fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); customMeasurement = fullList.First(f => f.SensorId.Equals(customRule.Id, StringComparison.OrdinalIgnoreCase)); Assert.AreEqual("1", customMeasurement.Value, "Value is not what expected when condition became false again"); fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); customMeasurement = fullList.First(f => f.SensorId.Equals(customRule.Id, StringComparison.OrdinalIgnoreCase)); Assert.AreEqual("0", customMeasurement.Value, "Value is not what expected when condition is true again"); }
public async Task GetDeviceDataAsync_WasLastTypeCustomMeasurementExists_HandleValueZeroAndMinusOne( Shared.Enum.OperatorType operatorType, string measurementValue, string customRuleValue, string expectedComparisonValue) { var sensorDeviceTypeId = "SomeSensorType"; var sensorDeviceId = "SomeSensorDevice"; var sensorId = "SomeSensor"; var customRule = new CustomMeasurementRule() { Class = "MyClass", Id = "MyId", Name = "My custom measurement", Unit = "qwerty", Operator = operatorType, SensorId = sensorId, Type = Shared.Enum.ValueType.WasLast, Value = customRuleValue }; // Arrange var sensorDevice = new SensorDevice { SensorDeviceTypeId = sensorDeviceTypeId, Id = sensorDeviceId, CalculatedMeasurements = new List <CustomMeasurementRule>() { customRule } }; var sensorDeviceType = new SensorDeviceType() { Id = sensorDeviceTypeId, Sensors = new List <Sensor>() { new Sensor() { Id = sensorId, } } }; _dataReaderMock.Setup(d => d.ReadDeviceDataAsync(It.IsAny <SensorDevice>())) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = measurementValue } }) ; var config = new CollectorConfiguration { CollectorEnabled = true, BluetoothAdapterName = "test", ScanIntervalSeconds = 1, SensorDevices = new List <SensorDevice>() { sensorDevice }, SensorDeviceTypes = new List <SensorDeviceType>() { sensorDeviceType } }; _configMock.Setup(c => c.Value).Returns(config); var deviceScanner = _serviceProvider.GetService <Collector.DeviceScanner.DeviceScanner>(); // Act var fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); // Assert Assert.AreEqual(2, fullList.Count, "Amount of measurements is not correct"); var customMeasurement = fullList.First(f => f.SensorId.Equals(customRule.Id, StringComparison.OrdinalIgnoreCase)); Assert.AreEqual(sensorDeviceId, customMeasurement.SensorDeviceId, "Sensor device ID does not match"); Assert.AreNotEqual(default(DateTime), customMeasurement.Timestamp, "Timestamp has not been set"); Assert.AreEqual(expectedComparisonValue, customMeasurement.Value, "Value is not what expected"); }
public async Task GetDeviceDataAsync_CustomMeasurementSensorNotExists_ReturnNull() { var sensorDeviceTypeId = "SomeSensorType"; var sensorDeviceId = "SomeSensorDevice"; var sensorId = "SomeSensor"; var customRule = new CustomMeasurementRule() { Class = "MyClass", Id = "MyId", Name = "My custom measurement", Unit = "qwerty", Operator = Shared.Enum.OperatorType.IsGreaterThan, SensorId = "UnknownSensor", Type = Shared.Enum.ValueType.Default, Value = "somevalue" }; // Arrange var sensorDevice = new SensorDevice { SensorDeviceTypeId = sensorDeviceTypeId, Id = sensorDeviceId, CalculatedMeasurements = new List <CustomMeasurementRule>() { customRule } }; var sensorDeviceType = new SensorDeviceType() { Id = sensorDeviceTypeId, Sensors = new List <Sensor>() { new Sensor() { Id = sensorId, } } }; _dataReaderMock.Setup(d => d.ReadDeviceDataAsync(It.IsAny <SensorDevice>())) .ReturnsAsync(new List <MeasurementData>() { new MeasurementData() { SensorDeviceId = sensorDeviceId, SensorId = sensorId, Value = "some value" } }); var config = new CollectorConfiguration { CollectorEnabled = true, BluetoothAdapterName = "test", ScanIntervalSeconds = 1, SensorDevices = new List <SensorDevice>() { sensorDevice }, SensorDeviceTypes = new List <SensorDeviceType>() { sensorDeviceType } }; _configMock.Setup(c => c.Value).Returns(config); var deviceScanner = _serviceProvider.GetService <Collector.DeviceScanner.DeviceScanner>(); // Act var fullList = await deviceScanner.GetDeviceDataAsync(config.SensorDevices); // Assert Assert.AreEqual(1, fullList.Count, "Amount of measurements is not correct"); Assert.AreEqual(sensorDeviceId, fullList[0].SensorDeviceId, "Sensor device ID is not correct"); }
public Sensor(string deviceToken, string name, SensorDeviceType sensorDeviceType) { DeviceToken = deviceToken; SensorDeviceType = sensorDeviceType; Name = name; }