1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
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<BasicDiscoveryMessage> discoveryClient = new UdpDiscoveryClient<BasicDiscoveryMessage>(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<FileUploadRequest, FileUploadResponse>(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<FileChunkUploadRequest, FileChunkUploadResponse>(chunkRequest).Wait();
currentFilePosition += buffer.Length;
}
} while (currentFilePosition < exeFile.Length);
Thread.Sleep(1000);
var response = transporter.SendRequest<ExecuteProcessRequest, ExecuteProcessResponse>(new ExecuteProcessRequest()
{
UploadID = uploadResponse.UploadID,
FileName = executeFileName,
}, new TransportRequestConfig()
{
Timeout = TimeSpan.FromSeconds(30),
}).Result.Message;
Thread.Sleep(5000);
transporter.SendRequest<KillProcessRequest, KillProcessResponse>(new KillProcessRequest()
{
ProcessID = response.ProcessID,
}).Wait();
transporter.Disconnect().Wait();
runner.Kill();
}
}
}
|