Esempio n. 1
0
            /// <summary>
            /// コンストラクタ
            /// </summary>
            /// <param name="command">リモートコマンド文字列</param>
            /// <param name="request">リクエストリモート</param>
            public RequestRemoteMessage(string command, RequestRemote request)
            {
                Assert.IfNull(request);
                Assert.IfNullOrEmpty(command, nameof(command));

                RemoteParameter = string.Format(command, request.SessionCode);
            }
Esempio n. 2
0
        public async Task RequestRemoteAsync_SendSuccess_ReturnsSucceed()
        {
            // 以下の確認をしたい。
            //      ・DBから取得したエッジIDに対して処理を行う。
            //      ・設定から取得したメッセージを送る。
            //      ・引数セッションコードをその中に含む

            // 期待する結果
            Guid   expectedEdgeId          = Guid.NewGuid();
            string expectedSessionCode     = "525215";
            string expectedRemoteParameter = "isl.exe --session-code {0}.";
            string expectedMessage         = JsonConvert.SerializeObject(
                new RequestRemoteMessage(
                    expectedRemoteParameter,
                    new RequestRemote()
            {
                SessionCode = expectedSessionCode
            }));
            var GotDevice = new DtDevice()
            {
                EdgeId = expectedEdgeId
            };

            // 渡された値
            Guid   actualEdgeId  = Guid.Empty;
            string actualMessage = string.Empty;

            // Target Create
            TestDiProviderBuilder builder =
                new TestDiProviderBuilder()
                .AddConfigure("RemoteParameter", expectedRemoteParameter);

            // Mock : デバイス取得に成功
            SetMock_ReadDevice_Returns(GotDevice, builder);

            // Mock : メッセージ送信に成功
            var mockOfRequestDevice = new Mock <IRequestDeviceRepository>();

            mockOfRequestDevice
            .Setup(x => x.SendMessageAsync(It.IsAny <DeviceConnectionInfo>(), It.IsAny <string>()))
            .Callback <DeviceConnectionInfo, string>((info, message) =>
            {
                // 引数が想定された内容で渡されたことを確認する。
                actualEdgeId  = info.EdgeId;
                actualMessage = message;
            });
            builder.ServiceCollection.AddTransient(_ => mockOfRequestDevice.Object);
            var service = builder.Build().GetService <IDeviceService>();
            var request = new RequestRemote()
            {
                SessionCode = expectedSessionCode
            };

            var result = await service.RequestRemoteAsync(request);

            Assert.AreEqual(ResultCode.Succeed, result.ResultCode);
            Assert.AreEqual(expectedEdgeId, actualEdgeId);
            Assert.AreEqual(expectedMessage, actualMessage);
        }
Esempio n. 3
0
        /// <summary>
        /// メッセージを作成する
        /// </summary>
        /// <param name="request">リモート接続要求</param>
        /// <param name="result">メッセージ作成結果</param>
        /// <returns>メッセージ</returns>
        /// <remarks>
        /// リポジトリにしてもいいかもしれないが、
        /// 自動テストではどちらにせよAppSettingsをDIしており手間がかかる割に恩恵が薄いのでService内にて対応。
        /// </remarks>
        private string CreateMessage(RequestRemote request, out Result result)
        {
            result = null;
            string remoteParamater = _settings.RemoteParameter;

            if (string.IsNullOrWhiteSpace(remoteParamater))
            {
                result = new Result(ResultCode.ServerEerror);
                return(string.Empty);
            }

            var messageObject = new RequestRemoteMessage(remoteParamater, request);
            var message       = JsonConvert.SerializeObject(messageObject);

            result = new Result(ResultCode.Succeed);

            _logger.Debug("message: {0}", new object[] { message });
            return(message);
        }
Esempio n. 4
0
        public async Task RequestRemoteAsync_ThrowExceptionAtSendMessage_ThrownException()
        {
            var exception = new Exception();
            var GotDevice = new DtDevice();

            // Target Create
            TestDiProviderBuilder builder =
                new TestDiProviderBuilder()
                .AddConfigure("RemoteParameter", "isl.exe --session-code {0}.");

            // Mock : デバイス取得に成功
            SetMock_ReadDevice_Returns(GotDevice, builder);

            // Mock : メッセージ送信時に例外
            SetMock_SendMessage_Thrown(exception, builder);

            var service = builder.Build().GetService <IDeviceService>();
            var request = new RequestRemote();

            var result = await service.RequestRemoteAsync(request);

            Assert.Fail();
        }
Esempio n. 5
0
        /// <summary>
        /// 端末へリモート接続のリクエストを行う
        /// </summary>
        /// <remarks>sd 03-2.リモート接続(ワンタイム接続)</remarks>
        /// <param name="request">リクエスト</param>
        /// <returns>結果</returns>
        public async Task <Result> RequestRemoteAsync(RequestRemote request)
        {
            Result result = null;
            RequestRemoteAsyncStatus status = RequestRemoteAsyncStatus.ReadDtDevice;

            try
            {
                _logger.EnterJson("In Param: {0}", request);

                // 端末データからDeviceIDをDeviceEdgeIdを取得する。
                DtDevice model = _dtDeviceRepository.ReadDtDevice(request.DeviceId);
                if (model == null)
                {
                    _logger.Error(nameof(Resources.CO_API_DRC_003));
                    result = new Result(ResultCode.NotFound, Resources.CO_API_DRC_003);
                    return(result);
                }

                // Sq3.1.1 接続先情報を取得する
                status = RequestRemoteAsyncStatus.GetDeviceConnectionInfoAsync;
                DeviceConnectionInfo deveiceConnectionInfo = await _requestDeviceRepository.GetDeviceConnectionInfoAsync(model.EdgeId);

                if (deveiceConnectionInfo == null)
                {
                    _logger.Error(nameof(Resources.CO_API_DRC_004));
                    result = new Result(ResultCode.NotFound, Resources.CO_API_DRC_004);
                    return(result);
                }

                // Sq3.1.2 メッセージを生成する
                string message = CreateMessage(request, out result);

                // Sq3.1.3 メッセージを送信する
                status = RequestRemoteAsyncStatus.SendMessageAsync;
                await _requestDeviceRepository.SendMessageAsync(deveiceConnectionInfo, message);

                _logger.Info(nameof(Resources.CO_API_DRC_007));
                result = new Result(ResultCode.Succeed, Resources.CO_API_DRC_007);
                return(result);
            }
            catch (Exception ex)
            {
                switch (status)
                {
                // ReadDtDeviceでnullを返さずにExceptionが発生した場合
                case RequestRemoteAsyncStatus.ReadDtDevice:
                    _logger.Error(nameof(Resources.CO_API_DRC_003));
                    result = new Result(ResultCode.NotFound, Resources.CO_API_DRC_003);
                    break;

                case RequestRemoteAsyncStatus.GetDeviceConnectionInfoAsync:
                    _logger.Error(ex, nameof(Resources.CO_API_DRC_004));
                    result = new Result(ResultCode.ServerEerror, Resources.CO_API_DRC_004);
                    break;

                case RequestRemoteAsyncStatus.SendMessageAsync:
                default:
                    _logger.Error(ex, nameof(Resources.CO_API_DRC_006));
                    result = new Result(ResultCode.ServerEerror, Resources.CO_API_DRC_006);
                    break;
                }

                return(result);
            }
            finally
            {
                _logger.LeaveJson("Result Param: {0}", result);
            }
        }
Esempio n. 6
0
 /// <summary>
 /// デバイスにリモート接続をリクエストする
 /// </summary>
 /// <param name="request">リクエスト</param>
 /// <returns>結果</returns>
 public Task <Result> RequestRemoteAsync(RequestRemote request)
 {
     throw new Exception();
 }