Пример #1
0
        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");
                }
            });
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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));
        }
Пример #7
0
        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);
        }
Пример #8
0
        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);
        }
Пример #9
0
        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);
        }
Пример #10
0
        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);
        }
Пример #11
0
        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);
        }
Пример #12
0
        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);
        }
Пример #13
0
        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);
        }
Пример #14
0
        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);
        }
Пример #15
0
        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);
        }
Пример #16
0
        /// <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);
        }