private void SaveTexture(Texture texture, string filename) { using (var image = texture.GetDataAsImage(Game.GraphicsContext.CommandList)) { //Send to server and store to disk var imageData = new TestResultImage { Frame = "0", Image = image, TestName = "" }; var payload = new ScreenShotPayload { FileName = filename }; var resultFileStream = new MemoryStream(); var writer = new BinaryWriter(resultFileStream); imageData.Write(writer); Task.Run(() => { payload.Data = resultFileStream.ToArray(); payload.Size = payload.Data.Length; socketMessageLayer.Send(payload).Wait(); resultFileStream.Dispose(); }); } }
protected override async void HandleClient(SimpleSocket clientSocket, string url) { await AcceptConnection(clientSocket); var socketMessageLayer = new SocketMessageLayer(clientSocket, true); socketMessageLayer.AddPacketHandler <TestRegistrationRequest>(async request => { if (request.Tester) { switch (request.Platform) { case (int)PlatformType.Windows: { Process process = null; var debugInfo = ""; try { var workingDir = Path.GetDirectoryName(request.Cmd); if (workingDir != null) { var start = new ProcessStartInfo { WorkingDirectory = workingDir, FileName = request.Cmd }; start.UseShellExecute = false; start.RedirectStandardError = true; start.RedirectStandardOutput = true; debugInfo = "Starting process " + start.FileName + " with path " + start.WorkingDirectory; await socketMessageLayer.Send(new LogRequest { Message = debugInfo }); process = Process.Start(start); } } catch (Exception ex) { await socketMessageLayer.Send(new StatusMessageRequest { Error = true, Message = "Launch exception: " + ex.Message }); } if (process == null) { await socketMessageLayer.Send(new StatusMessageRequest { Error = true, Message = "Failed to start game process. " + debugInfo }); } else { process.OutputDataReceived += async(sender, args) => { try { if (args.Data != null) { await socketMessageLayer.Send(new LogRequest { Message = $"STDIO: {args.Data}" }); } } catch { } }; process.ErrorDataReceived += async(sender, args) => { try { if (args.Data != null) { await socketMessageLayer.Send(new LogRequest { Message = $"STDERR: {args.Data}" }); } } catch { } }; process.BeginOutputReadLine(); process.BeginErrorReadLine(); var currenTestPair = new TestPair { TesterSocket = socketMessageLayer, GameName = request.GameAssembly, Process = process }; lock (processes) { processes[request.GameAssembly] = currenTestPair; testerToGame[socketMessageLayer] = currenTestPair; } await socketMessageLayer.Send(new LogRequest { Message = "Process created, id: " + process.Id.ToString() }); } break; } case (int)PlatformType.Android: { Process process = null; try { process = Process.Start("cmd.exe", $"/C adb shell monkey -p {request.GameAssembly}.{request.GameAssembly} -c android.intent.category.LAUNCHER 1"); } catch (Exception ex) { await socketMessageLayer.Send(new StatusMessageRequest { Error = true, Message = "Launch exception: " + ex.Message }); } if (process == null) { await socketMessageLayer.Send(new StatusMessageRequest { Error = true, Message = "Failed to start game process." }); } else { lock (loggerLock) { currentTester = socketMessageLayer; } var currenTestPair = new TestPair { TesterSocket = socketMessageLayer, GameName = request.GameAssembly, Process = process, TestEndAction = () => { // force stop - only works for Android 3.0 and above. Process.Start("cmd.exe", $"/C adb shell am force-stop {request.GameAssembly}.{request.GameAssembly}"); } }; lock (processes) { processes[request.GameAssembly] = currenTestPair; testerToGame[socketMessageLayer] = currenTestPair; } await socketMessageLayer.Send(new LogRequest { Message = "Process created, id: " + process.Id.ToString() }); } break; } case (int)PlatformType.iOS: { Process process = null; var debugInfo = ""; try { Thread.Sleep(5000); //ios processes might be slow to close, we must make sure that we start clean var start = new ProcessStartInfo { FileName = $"idevicedebug.exe", Arguments = $"run com.your-company.{request.GameAssembly}", UseShellExecute = false }; debugInfo = "Starting process " + start.FileName + " with path " + start.WorkingDirectory; process = Process.Start(start); } catch (Exception ex) { await socketMessageLayer.Send(new StatusMessageRequest { Error = true, Message = $"Launch exception: {ex.Message} info: {debugInfo}" }); } if (process == null) { await socketMessageLayer.Send(new StatusMessageRequest { Error = true, Message = "Failed to start game process. " + debugInfo }); } else { lock (loggerLock) { currentTester = socketMessageLayer; } var currenTestPair = new TestPair { TesterSocket = socketMessageLayer, GameName = request.GameAssembly, Process = process }; lock (processes) { processes[request.GameAssembly] = currenTestPair; testerToGame[socketMessageLayer] = currenTestPair; } await socketMessageLayer.Send(new LogRequest { Message = "Process created, id: " + process.Id.ToString() }); } break; } } } else //Game process { TestPair pair; lock (processes) { if (!processes.TryGetValue(request.GameAssembly, out pair)) { return; } pair.GameSocket = socketMessageLayer; testerToGame[pair.TesterSocket] = pair; gameToTester[pair.GameSocket] = pair; } await pair.TesterSocket.Send(new StatusMessageRequest { Error = false, Message = "Start" }); Console.WriteLine($"Starting test {request.GameAssembly}"); } }); socketMessageLayer.AddPacketHandler <KeySimulationRequest>(async request => { TestPair game; lock (processes) { game = testerToGame[socketMessageLayer]; } await game.GameSocket.Send(request); }); socketMessageLayer.AddPacketHandler <TapSimulationRequest>(async request => { TestPair game; lock (processes) { game = testerToGame[socketMessageLayer]; } await game.GameSocket.Send(request); }); socketMessageLayer.AddPacketHandler <ScreenshotRequest>(async request => { TestPair game; lock (processes) { game = testerToGame[socketMessageLayer]; } await game.GameSocket.Send(request); }); socketMessageLayer.AddPacketHandler <TestEndedRequest>(async request => { TestPair game; lock (processes) { game = testerToGame[socketMessageLayer]; } await game.GameSocket.Send(request); lock (processes) { testerToGame.Remove(socketMessageLayer); gameToTester.Remove(game.GameSocket); processes.Remove(game.GameName); } socketMessageLayer.Context.Dispose(); game.GameSocket.Context.Dispose(); game.Process.Kill(); game.Process.Dispose(); lock (loggerLock) { currentTester = null; } game.TestEndAction?.Invoke(); Console.WriteLine($"Finished test {game.GameName}"); }); socketMessageLayer.AddPacketHandler <TestAbortedRequest>(request => { TestPair game; lock (processes) { game = testerToGame[socketMessageLayer]; testerToGame.Remove(socketMessageLayer); processes.Remove(game.GameName); } socketMessageLayer.Context.Dispose(); game.Process.Kill(); game.Process.Dispose(); lock (loggerLock) { currentTester = null; } game.TestEndAction?.Invoke(); Console.WriteLine($"Aborted test {game.GameName}"); }); socketMessageLayer.AddPacketHandler <ScreenShotPayload>(async request => { TestPair tester; lock (processes) { tester = gameToTester[socketMessageLayer]; } var imageData = new TestResultImage(); var stream = new MemoryStream(request.Data); imageData.Read(new BinaryReader(stream)); stream.Dispose(); // Ensure directory exists Directory.CreateDirectory(Path.GetDirectoryName(request.FileName)); var resultFileStream = File.OpenWrite(request.FileName); imageData.Image.Save(resultFileStream, ImageFileType.Png); resultFileStream.Dispose(); await tester.TesterSocket.Send(new ScreenshotStored()); }); Task.Run(async() => { try { await socketMessageLayer.MessageLoop(); } catch { } }); }
private void SaveTexture(Texture texture, string filename) { using (var image = texture.GetDataAsImage(Game.GraphicsContext.CommandList)) { //Send to server and store to disk var imageData = new TestResultImage { CurrentVersion = "1.0", Frame = "0", Image = image, TestName = "" }; var payload = new ScreenShotPayload { FileName = filename }; var resultFileStream = new MemoryStream(); var writer = new BinaryWriter(resultFileStream); imageData.Write(writer); Task.Run(() => { payload.Data = resultFileStream.ToArray(); payload.Size = payload.Data.Length; socketMessageLayer.Send(payload).Wait(); resultFileStream.Dispose(); }); } }
protected override async void HandleClient(SimpleSocket clientSocket, string url) { await AcceptConnection(clientSocket); var socketMessageLayer = new SocketMessageLayer(clientSocket, true); socketMessageLayer.AddPacketHandler<TestRegistrationRequest>(request => { if (request.Tester) { switch (request.Platform) { case (int)PlatformType.Windows: { Process process = null; var debugInfo = ""; try { var workingDir = Path.GetDirectoryName(request.Cmd); if (workingDir != null) { var start = new ProcessStartInfo { WorkingDirectory = workingDir, FileName = request.Cmd }; start.EnvironmentVariables["SiliconStudioXenkoDir"] = Environment.GetEnvironmentVariable("SiliconStudioXenkoDir"); start.UseShellExecute = false; start.RedirectStandardError = true; start.RedirectStandardOutput = true; debugInfo = "Starting process " + start.FileName + " with path " + start.WorkingDirectory; socketMessageLayer.Send(new LogRequest { Message = debugInfo }).Wait(); process = Process.Start(start); } } catch (Exception ex) { socketMessageLayer.Send(new StatusMessageRequest { Error = true, Message = "Launch exception: " + ex.Message }).Wait(); } if (process == null) { socketMessageLayer.Send(new StatusMessageRequest { Error = true, Message = "Failed to start game process. " + debugInfo }).Wait(); } else { process.OutputDataReceived += (sender, args) => { try { socketMessageLayer.Send(new LogRequest { Message = $"STDIO: {args.Data}" }).Wait(); } catch { } }; process.ErrorDataReceived += (sender, args) => { try { socketMessageLayer.Send(new LogRequest { Message = $"STDERR: {args.Data}" }).Wait(); } catch { } }; process.BeginOutputReadLine(); process.BeginErrorReadLine(); var currenTestPair = new TestPair { TesterSocket = socketMessageLayer, GameName = request.GameAssembly, Process = process }; processes[request.GameAssembly] = currenTestPair; testerToGame[socketMessageLayer] = currenTestPair; socketMessageLayer.Send(new LogRequest { Message = "Process created, id: " + process.Id.ToString() }).Wait(); } break; } case (int)PlatformType.Android: { Process process = null; try { process = Process.Start("cmd.exe", $"/C adb shell monkey -p {request.GameAssembly}.{request.GameAssembly} -c android.intent.category.LAUNCHER 1"); } catch (Exception ex) { socketMessageLayer.Send(new StatusMessageRequest { Error = true, Message = "Launch exception: " + ex.Message }).Wait(); } if (process == null) { socketMessageLayer.Send(new StatusMessageRequest { Error = true, Message = "Failed to start game process." }).Wait(); } else { lock (loggerLock) { currentTester = socketMessageLayer; } var currenTestPair = new TestPair { TesterSocket = socketMessageLayer, GameName = request.GameAssembly, Process = process, TestEndAction = () => { // force stop - only works for Android 3.0 and above. Process.Start("cmd.exe", $"/C adb shell am force-stop {request.GameAssembly}.{request.GameAssembly}"); } }; processes[request.GameAssembly] = currenTestPair; testerToGame[socketMessageLayer] = currenTestPair; socketMessageLayer.Send(new LogRequest { Message = "Process created, id: " + process.Id.ToString() }).Wait(); } break; } case (int)PlatformType.iOS: { Process process = null; var debugInfo = ""; try { Thread.Sleep(5000); //ios processes might be slow to close, we must make sure that we start clean var start = new ProcessStartInfo { WorkingDirectory = $"{Environment.GetEnvironmentVariable("SiliconStudioXenkoDir")}\\Bin\\Windows-Direct3D11\\", FileName = $"{Environment.GetEnvironmentVariable("SiliconStudioXenkoDir")}\\Bin\\Windows-Direct3D11\\idevicedebug.exe", Arguments = $"run com.your-company.{request.GameAssembly}", UseShellExecute = false }; debugInfo = "Starting process " + start.FileName + " with path " + start.WorkingDirectory; process = Process.Start(start); } catch (Exception ex) { socketMessageLayer.Send(new StatusMessageRequest { Error = true, Message = $"Launch exception: {ex.Message} info: {debugInfo}" }).Wait(); } if (process == null) { socketMessageLayer.Send(new StatusMessageRequest { Error = true, Message = "Failed to start game process. " + debugInfo }).Wait(); } else { lock (loggerLock) { currentTester = socketMessageLayer; } var currenTestPair = new TestPair { TesterSocket = socketMessageLayer, GameName = request.GameAssembly, Process = process }; processes[request.GameAssembly] = currenTestPair; testerToGame[socketMessageLayer] = currenTestPair; socketMessageLayer.Send(new LogRequest { Message = "Process created, id: " + process.Id.ToString() }).Wait(); } break; } } } else //Game process { TestPair pair; if (!processes.TryGetValue(request.GameAssembly, out pair)) return; pair.GameSocket = socketMessageLayer; testerToGame[pair.TesterSocket] = pair; gameToTester[pair.GameSocket] = pair; pair.TesterSocket.Send(new StatusMessageRequest { Error = false, Message = "Start" }).Wait(); Console.WriteLine($"Starting test {request.GameAssembly}"); } }); socketMessageLayer.AddPacketHandler<KeySimulationRequest>(request => { var game = testerToGame[socketMessageLayer]; game.GameSocket.Send(request).Wait(); }); socketMessageLayer.AddPacketHandler<TapSimulationRequest>(request => { var game = testerToGame[socketMessageLayer]; game.GameSocket.Send(request).Wait(); }); socketMessageLayer.AddPacketHandler<ScreenshotRequest>(request => { var game = testerToGame[socketMessageLayer]; game.GameSocket.Send(request).Wait(); }); socketMessageLayer.AddPacketHandler<TestEndedRequest>(request => { var game = testerToGame[socketMessageLayer]; game.GameSocket.Send(request).Wait(); testerToGame.Remove(socketMessageLayer); gameToTester.Remove(game.GameSocket); processes.Remove(game.GameName); socketMessageLayer.Context.Dispose(); game.GameSocket.Context.Dispose(); game.Process.Kill(); game.Process.Dispose(); lock (loggerLock) { currentTester = null; } game.TestEndAction?.Invoke(); Console.WriteLine($"Finished test {game.GameName}"); }); socketMessageLayer.AddPacketHandler<TestAbortedRequest>(request => { var game = testerToGame[socketMessageLayer]; testerToGame.Remove(socketMessageLayer); processes.Remove(game.GameName); socketMessageLayer.Context.Dispose(); game.Process.Kill(); game.Process.Dispose(); lock (loggerLock) { currentTester = null; } game.TestEndAction?.Invoke(); Console.WriteLine($"Aborted test {game.GameName}"); }); socketMessageLayer.AddPacketHandler<ScreenShotPayload>(request => { var tester = gameToTester[socketMessageLayer]; var imageData = new TestResultImage(); var stream = new MemoryStream(request.Data); imageData.Read(new BinaryReader(stream)); stream.Dispose(); var resultFileStream = File.OpenWrite(request.FileName); imageData.Image.Save(resultFileStream, ImageFileType.Png); resultFileStream.Dispose(); tester.TesterSocket.Send(new ScreenshotStored()).Wait(); }); Task.Run(async () => { try { await socketMessageLayer.MessageLoop(); } catch { } }); }
public TestResultServerImage(ImageComparerClient client) { Client = client; ClientImage = new TestResultImage(); }