Exemple #1
0
        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();
                });
            }
        }
Exemple #2
0
        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();
 }