Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
ImageTester.Runtime.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 
4 #if SILICONSTUDIO_PLATFORM_WINDOWS_STORE || SILICONSTUDIO_PLATFORM_WINDOWS_PHONE
5 
6 using System;
7 using System.IO;
8 using System.Threading.Tasks;
9 
10 using Windows.Networking.Sockets;
11 using Windows.Networking;
12 using Windows.Storage.Streams;
13 
14 namespace SiliconStudio.Paradox.Graphics.Regression
15 {
16  public static partial class ImageTester
17  {
18  private static StreamSocket imageComparisonServer;
19 
20  public static bool Connect()
21  {
22  var task = ConnectAsync();
23  task.Wait();
24  return task.Result;
25  }
26 
27  public static void Disconnect()
28  {
29  DisconnectAsync().Wait();
30  }
31 
32  public static bool RequestImageComparisonStatus(string testName = null)
33  {
34  var task = RequestImageComparisonStatusAsync(testName);
35  task.Wait();
36  return task.Result;
37  }
38 
39  /// <summary>
40  /// Send the data of the test to the server.
41  /// </summary>
42  /// <param name="testResultImage">The image to send.</param>
43  public static bool SendImage(TestResultImage testResultImage)
44  {
45  var task = SendImageAsync(testResultImage);
46  task.Wait();
47  return task.Result;
48  }
49 
50  public static async Task<bool> ConnectAsync()
51  {
52  if (imageComparisonServer != null)
53  return true;
54 
55  try
56  {
57  imageComparisonServer = new StreamSocket();
58  await imageComparisonServer.ConnectAsync(new HostName(ParadoxImageServerHost), ParadoxImageServerPort.ToString());
59 
60  // Send initial parameters
61  using (var memoryStream = new MemoryStream())
62  {
63  var binaryWriter = new BinaryWriter(memoryStream);
64  ImageTestResultConnection.Write(binaryWriter);
65 
66  var dataWriter = new DataWriter(imageComparisonServer.OutputStream);
67  dataWriter.WriteBytes(memoryStream.ToArray());
68  await dataWriter.StoreAsync();
69  await dataWriter.FlushAsync();
70  dataWriter.DetachStream();
71  }
72 
73  return true;
74  }
75  catch (Exception)
76  {
77  imageComparisonServer = null;
78 
79  return false;
80  }
81  }
82 
83  public static async Task DisconnectAsync()
84  {
85  if (imageComparisonServer != null)
86  {
87  try
88  {
89  // Properly sends a message notifying we want to close the connection
90  using (var dataWriter = new DataWriter(imageComparisonServer.OutputStream))
91  {
92  dataWriter.WriteInt32((int)ImageServerMessageType.ConnectionFinished);
93  await dataWriter.StoreAsync();
94  await dataWriter.FlushAsync();
95  dataWriter.DetachStream();
96  }
97 
98  imageComparisonServer.Dispose();
99  }
100  catch (Exception)
101  {
102  }
103  imageComparisonServer = null;
104  }
105  }
106 
107  public static async Task<bool> RequestImageComparisonStatusAsync(string testName = null)
108  {
109  if (!Connect())
110  throw new InvalidOperationException("Could not connect to image comparer server");
111 
112  try
113  {
114  if (testName == null && NUnit.Framework.TestContext.CurrentContext == null)
115  {
116  testName = NUnit.Framework.TestContext.CurrentContext.Test.FullName;
117  }
118 
119  // Send initial parameters
120  using (var memoryStream = new MemoryStream())
121  {
122  var binaryWriter = new BinaryWriter(memoryStream);
123 
124  // Header
125  binaryWriter.Write((int)ImageServerMessageType.RequestImageComparisonStatus);
126  binaryWriter.Write(testName);
127 
128  var dataWriter = new DataWriter(imageComparisonServer.OutputStream);
129  dataWriter.WriteBytes(memoryStream.ToArray());
130  await dataWriter.StoreAsync();
131  await dataWriter.FlushAsync();
132  dataWriter.DetachStream();
133  }
134 
135  var dataReader = new DataReader(imageComparisonServer.InputStream);
136  await dataReader.LoadAsync(1);
137  var result = dataReader.ReadBoolean();
138  dataReader.DetachStream();
139 
140  return result;
141  }
142  catch (Exception)
143  {
144  throw;
145  }
146  }
147 
148  /// <summary>
149  /// Send the data of the test to the server.
150  /// </summary>
151  /// <param name="testResultImage">The image to send.</param>
152  public static async Task<bool> SendImageAsync(TestResultImage testResultImage)
153  {
154  if (!Connect())
155  throw new InvalidOperationException("Could not connect to image comparer server");
156 
157  try
158  {
159  if (testResultImage.TestName == null && NUnit.Framework.TestContext.CurrentContext != null)
160  {
161  testResultImage.TestName = NUnit.Framework.TestContext.CurrentContext.Test.FullName;
162  }
163 
164  // Send initial parameters
165  using (var memoryStream = new MemoryStream())
166  {
167  var binaryWriter = new BinaryWriter(memoryStream);
168 
169  // Header
170  binaryWriter.Write((int)ImageServerMessageType.SendImage);
171  TestGameBase.TestGameLogger.Info(@"Sending image information...");
172  testResultImage.Write(binaryWriter);
173 
174  var dataWriter = new DataWriter(imageComparisonServer.OutputStream);
175  dataWriter.WriteBytes(memoryStream.ToArray());
176  await dataWriter.StoreAsync();
177  await dataWriter.FlushAsync();
178  dataWriter.DetachStream();
179  }
180 
181  var dataReader = new DataReader(imageComparisonServer.InputStream);
182  await dataReader.LoadAsync(1);
183  var result = dataReader.ReadBoolean();
184  dataReader.DetachStream();
185 
186  return result;
187  }
188  catch (Exception)
189  {
190  throw;
191  }
192  }
193  }
194 }
195 
196 #endif