using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Tango.Transport; using Tango.Transport.Transporters; using Tango.Transport.Adapters; using Tango.PMR.IO; using Tango.PMR; using Google.Protobuf; using Tango.Transport.Discovery; using Tango.PMR.Discovery; namespace Tango.UnitTesting { [TestClass] [TestCategory("Remote Runner")] public class RemoteRunner_TST { [TestMethod] public void Run_Remote_Runner_Connect_Upload_And_Execute_Process() { Process runner = Process.Start(Path.Combine(Helper.GetBuildPath(), "Tango.RemoteRunner.UI.exe")); runner.WaitForInputIdle(); Thread.Sleep(2000); UdpDiscoveryClient discoveryClient = new UdpDiscoveryClient(2018); var discoveryResponse = discoveryClient.Discover().Result; ITransportAdapter adapter = new TcpTransportAdapter(discoveryResponse.Address, discoveryResponse.Message.Port); ITransporter transporter = new BasicTransporter(adapter); transporter.Connect().Wait(); Thread.Sleep(1000); String uploadFileName = "RemoteRunnerExeTest.zip"; String executeFileName = "RemoteRunnerExeTest.exe"; System.IO.FileInfo exeFile = new System.IO.FileInfo(Helper.GetResourcePath(uploadFileName)); var uploadResponse = transporter.SendRequest(new FileUploadRequest() { Path = uploadFileName, Length = exeFile.Length, }).Result.Message; int currentFilePosition = 0; do { using (FileStream fs = new FileStream(exeFile.FullName, FileMode.Open)) { fs.Position = currentFilePosition; FileChunkUploadRequest chunkRequest = new FileChunkUploadRequest(); chunkRequest.UploadID = uploadResponse.UploadID; long remaining = exeFile.Length - currentFilePosition; byte[] buffer = new byte[uploadResponse.MaxChunkLength < remaining ? uploadResponse.MaxChunkLength : remaining]; fs.Read(buffer, 0, buffer.Length); chunkRequest.Buffer = ByteString.CopyFrom(buffer); transporter.SendRequest(chunkRequest).Wait(); currentFilePosition += buffer.Length; } } while (currentFilePosition < exeFile.Length); Thread.Sleep(1000); var response = transporter.SendRequest(new ExecuteProcessRequest() { UploadID = uploadResponse.UploadID, FileName = executeFileName, }, new TransportRequestConfig() { Timeout = TimeSpan.FromSeconds(30), }).Result.Message; Thread.Sleep(5000); transporter.SendRequest(new KillProcessRequest() { ProcessID = response.ProcessID, }).Wait(); transporter.Disconnect().Wait(); runner.Kill(); } } }