private static void HandleServiceCallAttribute(INetDaemon _daemon, INetDaemonApp netDaemonApp, MethodInfo method) { var(signatureOk, err) = CheckIfServiceCallSignatureIsOk(method); if (!signatureOk) { _daemon.Logger.LogWarning(err); return; } dynamic serviceData = new FluentExpandoObject(); serviceData.method = method.Name; serviceData.@class = netDaemonApp.GetType().Name; _daemon.CallService("netdaemon", "register_service", serviceData); _daemon.ListenServiceCall("netdaemon", $"{serviceData.@class}_{serviceData.method}", async(data) => { try { var expObject = data as ExpandoObject; await method.InvokeAsync(netDaemonApp, expObject !).ConfigureAwait(false); } catch (Exception e) { _daemon.Logger.LogError(e, "Failed to invoke the ServiceCall function"); } }); }
public async Task SpeakCallsCorrectServiceCall() { await InitializeFakeDaemon().ConfigureAwait(false); // ARRANGE DefaultDaemonHost.InternalDelayTimeForTts = 0; // For testing // ACT await DefaultDaemonApp .MediaPlayer("media_player.correct_player") .Speak("a message") .ExecuteAsync(); await Task.Delay(20); var expObject = new FluentExpandoObject(); dynamic expectedAttruibutes = expObject; expectedAttruibutes.entity_id = "media_player.correct_player"; expectedAttruibutes.message = "a message"; // ASSERT VerifyCallService("tts", "google_cloud_say", expObject, true); // Verify(n => n.CallService("tts", "google_cloud_say", expObject, true)); await RunFakeDaemonUntilTimeout().ConfigureAwait(false); }
public async Task RepositoryLoadSavedDataUsingExpando() { // ARRANGE var dataRepository = new DataRepository(DataReposityryPath); dynamic dataBeingSaved = new FluentExpandoObject(false, true); var now = DateTime.Now; dataBeingSaved.SomeString = "this data should be saved!"; dataBeingSaved.SomeInt = 123456; dataBeingSaved.SomeFloat = 1.23456; dataBeingSaved.SomeDateTime = now; // ACT await dataRepository.Save <IDictionary <string, object> >("RepositoryLoadSavedData_id", dataBeingSaved); var dataReturned = await dataRepository.Get <IDictionary <string, object> >("RepositoryLoadSavedData_id"); var returnedFluentExpandoObject = new FluentExpandoObject(); returnedFluentExpandoObject.CopyFrom(dataReturned); dynamic dynamicDataReturned = returnedFluentExpandoObject; // ASSERT Assert.Equal(dataBeingSaved.SomeString, dynamicDataReturned !.SomeString); Assert.Equal(dataBeingSaved.SomeInt, dynamicDataReturned !.SomeInt); Assert.Equal(dataBeingSaved.SomeFloat, dynamicDataReturned !.SomeFloat); Assert.Equal(dataBeingSaved.SomeDateTime, dynamicDataReturned !.SomeDateTime); }
public async Task StorageShouldRestoreWithCorrectValues() { // ARRANGE var yamlConfigMock = new Mock <YamlConfig>(Path.Combine(ConfigFixturePath, "level2", "level3")); IEnumerable <Type> types = new List <Type>() { typeof(AssmeblyDaemonApp) }; var yamlConfig = @" app: class: AssmeblyDaemonApp "; using var instance = new YamlAppConfig(types, new StringReader(yamlConfig), yamlConfigMock.Object, "").Instances.FirstOrDefault() as AssmeblyDaemonApp; var daemonMock = new Mock <INetDaemon>(); var storageItem = new FluentExpandoObject(); storageItem["Data"] = "SomeData"; daemonMock.Setup(n => n.GetDataAsync <IDictionary <string, object> >(It.IsAny <string>())) .ReturnsAsync((IDictionary <string, object>)storageItem); await instance !.StartUpAsync(daemonMock.Object); // ACT await instance.RestoreAppStateAsync(); // ASSERT Assert.Equal("SomeData", instance.Storage.Data); }
public async Task RepositoryLoadSavedDataUsingExpando() { // ARRANGE var dataRepository = new DataRepository(DataRepositoryPath); dynamic dataBeingSaved = new FluentExpandoObject(false, true); dataBeingSaved.SomeString = "this data should be saved!"; dataBeingSaved.SomeInt = 123456; dataBeingSaved.SomeFloat = 1.23456; dataBeingSaved.SomeDateTime = DateTime.Now; // ACT await dataRepository.Save <IDictionary <string, object> >("RepositoryLoadSavedData_id", dataBeingSaved).ConfigureAwait(false); var dataReturned = await dataRepository.Get <IDictionary <string, object> >("RepositoryLoadSavedData_id").ConfigureAwait(false); var returnedFluentExpandoObject = new FluentExpandoObject(); returnedFluentExpandoObject.CopyFrom(dataReturned !); dynamic dynamicDataReturned = returnedFluentExpandoObject; // ASSERT Assert.Equal(dataBeingSaved.SomeString, dynamicDataReturned.SomeString); Assert.Equal(dataBeingSaved.SomeInt, dynamicDataReturned !.SomeInt); Assert.Equal(dataBeingSaved.SomeFloat, dynamicDataReturned !.SomeFloat); // There is no way for json serializer to know this is a datetime Assert.NotNull(dynamicDataReturned !.SomeDateTime); }
public void CallServiceShouldCallCorrectDaemonCallService() { // ARRANGE and ACT var expandoData = new FluentExpandoObject(); dynamic data = expandoData; data.AnyData = "data"; // ACT _app.CallService("domain", "service", data, false); // ASSERT _netDaemonMock.Verify(n => n.CallService("domain", "service", expandoData, false)); }
public void Reload(dynamic?data = null) { var serviceData = new FluentExpandoObject(); if (data is ExpandoObject) { serviceData.CopyFrom(data); } else if (data is object) { var expObject = ((object)data).ToExpandoObject(); serviceData.CopyFrom(expObject); } DaemonRxApp.CallService("zone", "reload", serviceData); }
public void MarkRead(dynamic?data = null) { var serviceData = new FluentExpandoObject(); if (data is ExpandoObject) { serviceData.CopyFrom(data); } else if (data is object) { var expObject = ((object)data).ToExpandoObject(); serviceData.CopyFrom(expObject); } DaemonRxApp.CallService("persistent_notification", "mark_read", serviceData); }
public void SelectPrevious(dynamic?data = null) { var serviceData = new FluentExpandoObject(); if (data is ExpandoObject) { serviceData.CopyFrom(data); } else if (data is object) { var expObject = ((object)data).ToExpandoObject(); serviceData.CopyFrom(expObject); } serviceData["entity_id"] = EntityId; DaemonRxApp.CallService("input_select", "select_previous", serviceData); }
public void ShuffleSet(dynamic?data = null) { var serviceData = new FluentExpandoObject(); if (data is ExpandoObject) { serviceData.CopyFrom(data); } else if (data is object) { var expObject = ((object)data).ToExpandoObject(); serviceData.CopyFrom(expObject); } serviceData["entity_id"] = EntityId; DaemonRxApp.CallService("media_player", "shuffle_set", serviceData); }
public void SelectSoundMode(dynamic?data = null) { var serviceData = new FluentExpandoObject(); if (data is ExpandoObject) { serviceData.CopyFrom(data); } else if (data is object) { var expObject = ((object)data).ToExpandoObject(); serviceData.CopyFrom(expObject); } serviceData["entity_id"] = EntityId; DaemonRxApp.CallService("media_player", "select_sound_mode", serviceData); }
public void MediaPreviousTrack(dynamic?data = null) { var serviceData = new FluentExpandoObject(); if (data is ExpandoObject) { serviceData.CopyFrom(data); } else if (data is object) { var expObject = ((object)data).ToExpandoObject(); serviceData.CopyFrom(expObject); } serviceData["entity_id"] = EntityId; DaemonRxApp.CallService("media_player", "media_previous_track", serviceData); }
public void Record(dynamic?data = null) { var serviceData = new FluentExpandoObject(); if (data is ExpandoObject) { serviceData.CopyFrom(data); } else if (data is object) { var expObject = ((object)data).ToExpandoObject(); serviceData.CopyFrom(expObject); } serviceData["entity_id"] = EntityId; DaemonRxApp.CallService("camera", "record", serviceData); }
public void DisableMotionDetection(dynamic?data = null) { var serviceData = new FluentExpandoObject(); if (data is ExpandoObject) { serviceData.CopyFrom(data); } else if (data is object) { var expObject = ((object)data).ToExpandoObject(); serviceData.CopyFrom(expObject); } serviceData["entity_id"] = EntityId; DaemonRxApp.CallService("camera", "disable_motion_detection", serviceData); }
public async Task StorageShouldRestoreWithCorrectValues() { // ARRANGE var yamlConfigMock = new Mock <IYamlConfig>(); yamlConfigMock.Setup(x => x.GetAllConfigFilePaths()) .Returns(new[] { Path.Combine(ConfigFixturePath, "level2", "level3") }); IEnumerable <Type> types = new List <Type>() { typeof(AssemblyDaemonApp) }; const string?yamlConfig = @" app: class: NetDaemon.Daemon.Tests.DaemonRunner.App.AssemblyDaemonApp "; await using var instance = new YamlAppConfig(types, new StringReader(yamlConfig), yamlConfigMock.Object, "").Instances.FirstOrDefault() as AssemblyDaemonApp; var daemonMock = new Mock <INetDaemon>(); daemonMock.SetupGet(x => x.Logger).Returns(new Mock <ILogger>().Object); var storageItem = new FluentExpandoObject { ["Data"] = "SomeData" }; daemonMock.SetupGet(x => x.Logger).Returns(new Mock <ILogger>().Object); daemonMock.Setup(n => n.GetDataAsync <IDictionary <string, object> >(It.IsAny <string>())) .ReturnsAsync((IDictionary <string, object>)storageItem); await instance !.StartUpAsync(daemonMock.Object).ConfigureAwait(false); // ACT await instance.RestoreAppStateAsync().ConfigureAwait(false); // ASSERT Assert.Equal("SomeData", instance.Storage.Data); }
/// <summary> /// Performs a specified service call to a specified domain with specified data /// </summary> /// <param name="domain">The domain to which the service call belongs</param> /// <param name="service">The service in the domain to call</param> /// <param name="data">Additional data to send to the service</param> /// <param name="sendEntityId">If true it will include the entity_id attribute with this entity's EntityId with the service call</param> protected void CallService(string domain, string service, dynamic?data = null, bool sendEntityId = false) { var serviceData = new FluentExpandoObject(); if (data is ExpandoObject) { serviceData.CopyFrom(data); } else if (data is not null) { var expObject = ((object)data).ToExpandoObject(); if (expObject is not null) { serviceData.CopyFrom(expObject); } } if (sendEntityId) { serviceData["entity_id"] = EntityId; } DaemonRxApp.CallService(domain, service, serviceData); }