4 using System.Collections.Generic;
5 using System.ComponentModel;
6 using System.Configuration.Install;
10 using System.Net.Sockets;
11 using System.Reflection;
12 using System.Runtime.InteropServices;
13 using System.ServiceProcess;
14 using System.Threading;
16 using SiliconStudio.Paradox.Graphics;
17 using SiliconStudio.Paradox.Graphics.Regression;
23 public const string DefaultServiceName =
"SiliconStudio Image Comparer Service";
25 private int port = 1832;
26 private string baseOutputPath;
27 private Dictionary<TcpClient, Thread> clients =
new Dictionary<TcpClient, Thread>();
28 private Thread listenerThread;
29 private TcpListener server;
33 ServiceName = DefaultServiceName;
45 return comparer.Compare_RMSE(receivedImage, resultTempFileName);
48 private void ProcessSendImage(ImageComparerClient imageComparerClient, BinaryReader reader, BinaryWriter binaryWriter)
50 var receivedImage =
new TestResultServerImage(imageComparerClient);
53 receivedImage.ClientImage.Read(reader);
55 Console.WriteLine(
@"Receiving {0} from {1}", receivedImage.ClientImage.TestName, imageComparerClient.Connection.Serial);
58 var goldPath = Path.Combine(baseOutputPath, receivedImage.GetGoldDirectory());
59 var outputPath = Path.Combine(baseOutputPath, receivedImage.GetOutputDirectory());
61 receivedImage.GoldPath = goldPath;
62 receivedImage.OutputPath = outputPath;
63 receivedImage.JsonPath = Path.Combine(baseOutputPath,
"json");
65 Directory.CreateDirectory(receivedImage.GoldPath);
66 Directory.CreateDirectory(receivedImage.OutputPath);
67 Directory.CreateDirectory(receivedImage.JsonPath);
69 receivedImage.GoldFileName = Path.Combine(goldPath, receivedImage.GetFileName());
70 receivedImage.ResultFileName = Path.Combine(outputPath, receivedImage.GetFileName());
71 receivedImage.DiffFileName = Path.Combine(outputPath, receivedImage.GetDiffFileName());
72 receivedImage.DiffNormFileName = Path.Combine(outputPath, receivedImage.GetNormDiffFileName());
76 var resultTempFileName = Path.GetTempPath() + Guid.NewGuid() +
".png";
80 using (var image = receivedImage.ClientImage.Image)
81 using (var resultFileStream =
File.OpenWrite(resultTempFileName))
83 image.Save(resultFileStream, ImageFileType.Png);
86 CompareImage(receivedImage, resultTempFileName);
90 File.Delete(resultTempFileName);
93 var receivedImages = imageComparerClient.Images;
94 List<TestResultServerImage> receivedImageForThisTest;
97 if (!receivedImages.TryGetValue(receivedImage.ClientImage.TestName, out receivedImageForThisTest))
99 receivedImageForThisTest =
new List<TestResultServerImage>();
100 receivedImage.FrameIndex = receivedImageForThisTest.Count;
101 receivedImages.Add(receivedImage.ClientImage.TestName, receivedImageForThisTest);
105 receivedImageForThisTest.Add(receivedImage);
108 binaryWriter.Write(
true);
116 private void ProcessRequestImageComparisonStatus(ImageComparerClient imageComparerClient, BinaryReader binaryReader, BinaryWriter binaryWriter)
118 var testName = binaryReader.ReadString();
120 var receivedImages = imageComparerClient.Images;
121 List<TestResultServerImage> receivedImageForThisTest;
122 lock (receivedImages)
124 if (!receivedImages.TryGetValue(testName, out receivedImageForThisTest))
127 binaryWriter.Write(
true);
133 var testSucceeded =
true;
134 foreach (var receivedImage
in receivedImageForThisTest)
136 testSucceeded &= receivedImage.MeanSquareError == 0.0f;
139 binaryWriter.Write(testSucceeded);
140 binaryWriter.Flush();
143 private void ClientThread(
object res)
145 var client = (TcpClient)res;
147 var imageComparerClient =
new ImageComparerClient();
151 clients[client] = Thread.CurrentThread;
156 using (var networkStream = client.GetStream())
158 var binaryReader =
new BinaryReader(networkStream);
159 var binaryWriter =
new BinaryWriter(networkStream);
162 imageComparerClient.Connection.Read(binaryReader);
173 case ImageServerMessageType.SendImage:
175 ProcessSendImage(imageComparerClient, binaryReader, binaryWriter);
177 case ImageServerMessageType.RequestImageComparisonStatus:
179 ProcessRequestImageComparisonStatus(imageComparerClient, binaryReader, binaryWriter);
189 Console.WriteLine(
"Client thread exception: {0}", e);
194 clients.Remove(client);
200 server =
new TcpListener(IPAddress.Any, port);
207 var client = server.AcceptTcpClient();
209 Console.WriteLine(
@"Accepted a new connection from client '{0}'.", client.Client.RemoteEndPoint);
211 new Thread(ClientThread).Start(client);
214 catch (SocketException)
220 protected override void OnStart(
string[] args)
224 var exeName = Path.GetFileName(Assembly.GetExecutingAssembly().Location);
225 var showHelp =
false;
226 baseOutputPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
"SiliconStudio",
"ImageComparerResults");
228 var p =
new OptionSet
230 "Copyright (C) 2011-2013 Silicon Studio Corporation. All Rights Reserved",
231 "Paradox Test Suite Tool - Version: "
238 string.Format(
"Usage: {0} [--port=port] [--output=folder", exeName),
242 {
"h|help",
@"Show this message and exit", v => showHelp = v != null },
243 {
"p|port=",
@"Port (default: 1832)", v => port = int.Parse(v) },
244 {
"o|output=",
@"Output folder (default: %APPDATA%\SiliconStudio\ImageComparerResults)", v => baseOutputPath = v },
249 var commandArgs = p.Parse(args);
250 if (commandArgs.Count > 0)
251 throw new OptionException();
255 p.WriteOptionDescriptions(Console.Out);
260 Directory.CreateDirectory(baseOutputPath);
262 listenerThread =
new Thread(ListenBase);
263 listenerThread.Start();
267 Console.WriteLine(
"{0}: {1}", exeName, e);
268 if (e is OptionException)
269 p.WriteOptionDescriptions(Console.Out);
283 if (listenerThread != null)
285 listenerThread.Join();
286 listenerThread = null;
290 KeyValuePair<TcpClient, Thread>[] currentClients;
293 currentClients = clients.ToArray();
297 foreach (var client
in currentClients)
307 static void Main(
string[] args)
309 if (args.Length > 0 && args[0] ==
"--console")
312 imageComparerService.OnStart(args.Skip(1).ToArray());
313 imageComparerService.listenerThread.Join();
314 imageComparerService.OnStop();
316 else if (args.Length > 0 && args[0] ==
"--install")
318 ManagedInstallerClass.InstallHelper(
new[] { Assembly.GetExecutingAssembly().Location });
320 else if (args.Length > 0 && args[0] ==
"--uninstall")
322 ManagedInstallerClass.InstallHelper(
new[] {
"/u", Assembly.GetExecutingAssembly().Location });
326 ServiceBase.Run(
new ImageComparerService());
336 var processInstaller =
new ServiceProcessInstaller();
337 var serviceInstaller =
new ServiceInstaller();
340 processInstaller.Account = ServiceAccount.LocalSystem;
343 serviceInstaller.StartType = ServiceStartMode.Automatic;
347 this.Installers.Add(processInstaller);
348 this.Installers.Add(serviceInstaller);
override void OnStart(string[] args)
const string DefaultServiceName
MyWindowsServiceInstaller()