/// <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); }
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); }
/// <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); }
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(); }
/// <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); } }
/// <summary> /// デバイスにリモート接続をリクエストする /// </summary> /// <param name="request">リクエスト</param> /// <returns>結果</returns> public Task <Result> RequestRemoteAsync(RequestRemote request) { throw new Exception(); }