View Javadoc
1   package io.guixer.logs;
2   
3   import static com.google.common.collect.Lists.newArrayList;
4   import static java.nio.charset.StandardCharsets.UTF_8;
5   import static org.apache.commons.lang3.StringUtils.substringAfter;
6   import static org.joda.time.DateTimeZone.UTC;
7   import static org.junit.jupiter.api.Assertions.assertEquals;
8   import static org.junit.jupiter.api.Assertions.assertSame;
9   
10  import java.io.File;
11  import java.io.IOException;
12  import java.util.Collection;
13  import java.util.List;
14  import java.util.stream.Stream;
15  
16  import org.apache.commons.io.FileUtils;
17  import org.junit.jupiter.params.provider.Arguments;
18  
19  import io.guixer.logs.ElaborateLog.Attribute;
20  import io.guixer.logs.ElaborateLog.Group;
21  import io.guixer.logs.ElaborateLog.Intent;
22  import io.guixer.logs.ElaborateLog.Status;
23  import io.guixer.logs.ElaborateLog.Step;
24  import io.guixer.logs.lines.LogLine;
25  import io.guixer.logs.lines.LogLine.Type;
26  
27  public abstract class LogTestUtils {
28  
29  	public static void assertLogEquals(
30  		final Log log,
31  		final ElaborateLog elaborateLog
32  	) {
33  
34  		// 1. Log vs. ElaborateLog
35  
36  		assertEquals(log.getGuixerVersion(), elaborateLog.getGuixerVersion());
37  		assertEquals(log.getTimeMillis(), elaborateLog.getTimeMillis());
38  		assertEquals(log.getTestClassName(), elaborateLog.getTestClassName());
39  		assertEquals(log.getTestClassSimpleName(), elaborateLog.getTestClassSimpleName());
40  		assertEquals(log.getTestMethodName(), elaborateLog.getTestMethodName());
41  		assertEquals(log.getTestClassName(), elaborateLog.getTestClassName());
42  		assertEquals(log.getScenario(), elaborateLog.getScenario());
43  		assertEquals(log.getSuccessCount(), elaborateLog.getSuccessCount());
44  		assertEquals(log.getFailureCount(), elaborateLog.getFailureCount());
45  		assertEquals(log.isInError(), elaborateLog.isInError());
46  		assertEquals(log.isInError(), elaborateLog.getError() != null);
47  
48  		try {
49  			ElaborateLogUtils.generateXML(elaborateLog, new File("target", "coco.xml"));
50  		} catch (final Exception e) {
51  			throw new RuntimeException(e);
52  		}
53  
54  		// 2. ElaborateLog vs. ElaborateLog
55  
56  		final ElaborateLog ref = ElaborateLogUtils.toElaborateLog(log);
57  
58  		assertLogEquals(ref, elaborateLog);
59  
60  		// 2. Log vs. Log
61  
62  		final Log log2 = ElaborateLogUtils.toGuixerOutLog(elaborateLog, elaborateLog.getRawBytes());
63  
64  		assertLogEquals(log, log2);
65  	}
66  
67  	public static void assertLogEquals(
68  		final ElaborateLog ref,
69  		final ElaborateLog test
70  	) {
71  
72  		assertEquals(ref.getGuixerVersion(), test.getGuixerVersion());
73  		assertEquals(ref.getTimeMillis(), test.getTimeMillis());
74  		assertEquals(ref.getTestClassName(), test.getTestClassName());
75  		assertEquals(ref.getTestClassSimpleName(), test.getTestClassSimpleName());
76  		assertEquals(ref.getTestMethodName(), test.getTestMethodName());
77  		assertEquals(ref.getTestClassName(), test.getTestClassName());
78  		assertEquals(ref.getScenario(), test.getScenario());
79  		assertEquals(ref.getSuccessCount(), test.getSuccessCount());
80  		assertEquals(ref.getFailureCount(), test.getFailureCount());
81  		assertEquals(ref.isInError(), test.isInError());
82  		assertEquals(ref.isInError(), ref.getError() != null);
83  
84  		assertEquals(ref.getError() == null, test.getError() == null);
85  		if (ref.getError() != null) {
86  			assertEquals(ref.getError().getTimeMillis(), test.getError().getTimeMillis());
87  			assertEquals( //
88  					ref.getError().getTrace().replace("\t", "    ").trim(), //
89  					test.getError().getTrace().replace("\t", "    ").trim());
90  			assertEquals(ref.getError().getScreenshot().getTimeMillis(),
91  					test.getError().getScreenshot().getTimeMillis());
92  			assertEquals(ref.getError().getScreenshot().getFileName(), test.getError().getScreenshot().getFileName());
93  		}
94  
95  		assertEquals(ref.getBefore() == null, test.getBefore() == null);
96  		if (ref.getBefore() != null) {
97  			assertStepsEqual(ref.getBefore().getSteps(), test.getBefore().getSteps());
98  		}
99  
100 		assertEquals(ref.getAttributes().length, test.getAttributes().length);
101 
102 		for (int i = 0; i < ref.getAttributes().length; ++i) {
103 
104 			final Attribute refAttribute = ref.getAttributes()[i];
105 			final Attribute testAttribute = test.getAttributes()[i];
106 
107 			assertSame(refAttribute.getScope(), testAttribute.getScope());
108 			assertEquals(refAttribute.getName(), testAttribute.getName());
109 			assertEquals(refAttribute.getValue(), testAttribute.getValue());
110 		}
111 
112 		assertIntentsEqual(ref.getIntents(), test.getIntents());
113 
114 		assertEquals(ref.getDone() == null, test.getDone() == null);
115 		if (ref.getDone() != null) {
116 			assertEquals(ref.getDone().getTimeMillis(), test.getDone().getTimeMillis());
117 			assertEquals(ref.getDone().getMessage(), test.getDone().getMessage());
118 		}
119 	}
120 
121 	private static void assertIntentsEqual(
122 		final Intent[] refIntents,
123 		final Intent[] testIntents
124 	) {
125 
126 		assertEquals(refIntents.length, testIntents.length);
127 
128 		for (int i = 0; i < refIntents.length; ++i) {
129 
130 			final Intent refIntent = refIntents[i];
131 			final Intent testIntent = testIntents[i];
132 
133 			assertEquals(refIntent.getTimeMillis(), testIntent.getTimeMillis());
134 			assertEquals(refIntent.getTitle(), testIntent.getTitle());
135 			assertEquals(refIntent.getSteps().length, testIntent.getSteps().length);
136 			assertSame(refIntent.getGroup() == null, testIntent.getGroup() == null);
137 
138 			if (refIntent.getGroup() != null) {
139 
140 				final Group refGroup = refIntent.getGroup();
141 				final Group testGroup = testIntent.getGroup();
142 
143 				assertEquals(refIntent.getTitle(), refGroup.getName());
144 				assertEquals(refIntent.getTimeMillis(), refGroup.getBeginAtMs());
145 
146 				assertEquals(refGroup.getBeginAtMs(), testGroup.getBeginAtMs());
147 				assertEquals(refGroup.getEndAtMs(), testGroup.getEndAtMs());
148 				assertEquals(refGroup.getName(), testGroup.getName());
149 
150 				assertIntentsEqual(refGroup.getIntents(), testGroup.getIntents());
151 
152 			} else if (refIntent.getStatus() != null) {
153 
154 				final Status refStatus = refIntent.getStatus();
155 				final Status testStatus = testIntent.getStatus();
156 
157 				assertEquals(refIntent.getTitle(), refStatus.getLabel());
158 
159 				assertEquals(refStatus.getLabel(), testStatus.getLabel());
160 
161 			} else {
162 
163 				assertStepsEqual(refIntent.getSteps(), testIntent.getSteps());
164 			}
165 		}
166 	}
167 
168 	private static void assertStepsEqual(
169 		final Step[] refSteps,
170 		final Step[] testSteps
171 	) {
172 
173 		assertEquals(refSteps.length, testSteps.length);
174 
175 		for (int j = 0; j < refSteps.length; ++j) {
176 
177 			final Step refStep = refSteps[j];
178 			final Step testStep = testSteps[j];
179 
180 			assertEquals(refStep.getNamespace(), testStep.getNamespace());
181 			assertEquals(refStep.getFileName(), testStep.getFileName());
182 			assertEquals(refStep.getLabel(), testStep.getLabel());
183 			assertEquals(refStep.getLocator() == null, testStep.getLocator() == null);
184 			if (refStep.getLocator() != null) {
185 				assertSame(refStep.getLocator().getType(), testStep.getLocator().getType());
186 				assertEquals(refStep.getLocator().getValue(), testStep.getLocator().getValue());
187 			}
188 			assertEquals(refStep.getMessage(), testStep.getMessage());
189 			assertEquals(refStep.getName(), testStep.getName());
190 			assertSame(refStep.getResultType(), testStep.getResultType());
191 			assertEquals(refStep.getSeconds(), testStep.getSeconds());
192 			assertSame(refStep.getScope(), testStep.getScope());
193 			assertEquals(refStep.getTimeMillis(), testStep.getTimeMillis());
194 			assertEquals(refStep.getScript(), testStep.getScript());
195 			assertSame(refStep.getType(), testStep.getType());
196 			assertEquals(refStep.getUrl(), testStep.getUrl());
197 			assertEquals(refStep.getValue(), testStep.getValue());
198 		}
199 	}
200 
201 	public static Stream<Arguments> logFiles() throws IOException {
202 
203 		final List<Arguments> arguments = newArrayList();
204 
205 		// Recursive
206 		//
207 		scanLogFiles(new File("src/test/guixer_out_samples"), arguments);
208 
209 		// Top-level only
210 		//
211 		for (final File file : new File("src/test/log_samples").listFiles(file //
212 		-> file.getName().startsWith("test-") && file.getName().endsWith(".log"))) {
213 
214 			final String timeMillis = extractTimeMillis(file);
215 
216 			arguments.add(Arguments.of(timeMillis, file));
217 		}
218 
219 		return arguments.stream();
220 	}
221 
222 	private static void scanLogFiles(
223 		final File dir,
224 		final Collection<Arguments> arguments
225 	) throws IOException {
226 
227 		for (final File file : dir.listFiles()) {
228 
229 			if (file.isFile() && file.getName().equals("test.log")) {
230 
231 				arguments.add(Arguments.of(dir.getName(), dir));
232 
233 			} else if (file.isDirectory()) {
234 
235 				scanLogFiles(file, arguments);
236 			}
237 		}
238 	}
239 
240 	private static String extractTimeMillis(
241 		final File logFile
242 	) throws IOException {
243 
244 		for (final String line : FileUtils.readLines(logFile, UTF_8)) {
245 
246 			if (line.startsWith("timeMillis: ")) {
247 
248 				return substringAfter(line, ": ");
249 			}
250 		}
251 
252 		throw new IllegalStateException("Cannot find line: \"timeMillis: xxx\"");
253 	}
254 
255 	public static void assertLogEquals(
256 		final Log ref,
257 		final Log test
258 	) {
259 		assertEquals(ref.getGuixerVersion(), test.getGuixerVersion());
260 		assertEquals(ref.getTimeMillis(), test.getTimeMillis());
261 		assertEquals(ref.getTestClassName(), test.getTestClassName());
262 		assertEquals(ref.getTestClassSimpleName(), test.getTestClassSimpleName());
263 		assertEquals(ref.getTestMethodName(), test.getTestMethodName());
264 		assertEquals(ref.getTestClassName(), test.getTestClassName());
265 		assertEquals(ref.getScenario(), test.getScenario());
266 		assertEquals(ref.getSuccessCount(), test.getSuccessCount());
267 		assertEquals(ref.getFailureCount(), test.getFailureCount());
268 		assertEquals(ref.isInError(), test.isInError());
269 		assertEquals(ref.getRawBytes().length == 0, test.getRawBytes().length == 0);
270 		assertEquals(ref.getDateAsString() == null, test.getDateAsString() == null);
271 		// assertEquals(ref.getDate() == null, test.getDate() == null);
272 		if (ref.getDate() != null && test.getDate() != null) {
273 			assertEquals(ref.getDate().withZone(UTC), test.getDate().withZone(UTC));
274 		}
275 		assertEquals(ref.getSuccessCount(), test.getSuccessCount());
276 		assertEquals(ref.getFailureCount(), test.getFailureCount());
277 		assertEquals(ref.getAttributes().length, test.getAttributes().length);
278 		assertEquals(ref.getLogLines().length, test.getLogLines().length);
279 
280 		for (int i = 0; i < ref.getAttributes().length; ++i) {
281 
282 			assertLogLineEquals(ref.getAttributes()[i], test.getAttributes()[i]);
283 		}
284 
285 		for (int i = 0; i < ref.getLogLines().length; ++i) {
286 
287 			assertLogLineEquals(ref.getLogLines()[i], test.getLogLines()[i]);
288 		}
289 	}
290 
291 	private static void assertLogLineEquals(
292 		final LogLine ref,
293 		final LogLine test
294 	) {
295 
296 		assertSame(ref.getType(), test.getType());
297 		assertEquals(ref.getClass(), test.getClass());
298 		assertEquals(ref.getTimeMillis(), test.getTimeMillis());
299 		assertRawTextEquals(ref.getType(), ref.getRawText(), test.getRawText());
300 	}
301 
302 	private static void assertRawTextEquals(
303 		final Type type,
304 		final String ref,
305 		final String test
306 	) {
307 
308 		if (ref.startsWith("type:") && test.startsWith("sendKeys:")) {
309 
310 			assertEquals( //
311 					substringAfter(ref, ":").replace("'", "").replace("\"", ""), //
312 					substringAfter(test, ":").replace("'", "").replace("\"", ""), //
313 					ref);
314 
315 		} else if (type == Type.SEND_KEYS) {
316 
317 			assertEquals( //
318 					ref.replace("'", "").replace("\"", ""), //
319 					test.replace("'", "").replace("\"", ""));
320 
321 		} else {
322 
323 			assertEquals(ref, test);
324 		}
325 	}
326 }