001package com.ganteater.ae.processor; 002 003import static org.junit.Assert.assertEquals; 004import static org.junit.Assert.assertSame; 005import static org.junit.Assert.assertTrue; 006 007import java.io.File; 008import java.io.IOException; 009import java.net.ServerSocket; 010import java.util.HashMap; 011import java.util.Map; 012import java.util.Properties; 013 014import org.junit.Test; 015 016import com.ganteater.ae.AEManager; 017import com.ganteater.ae.CommandException; 018import com.ganteater.ae.ILogger; 019import com.ganteater.ae.RecipeListener; 020import com.ganteater.ae.util.xml.easyparser.Node; 021 022public class TaskProcessorThreadTest { 023 024 @Test 025 public void clone_whenCloneIdIsZero_returnsSameInstanceAndSetsThreadId() throws Exception { 026 // Arrange 027 DummyProcessor parent = new DummyProcessor(); 028 Node task = new Node("Task"); 029 ILogger log = parent.getListener().createLog("test", false); 030 TaskProcessorThread thread = new TaskProcessorThread(parent, task, new File("."), log); 031 032 // Act 033 TaskProcessorThread cloned = thread.clone(0); 034 035 // Assert 036 assertSame(thread, cloned); 037 assertEquals("0", String.valueOf(thread.getProcessor().getVariables().get(TaskProcessorThread.THREAD_ID))); 038 } 039 040 @Test 041 public void clone_whenCloneIdIsNonZero_returnsNewInstanceAndSetsThreadId() throws Exception { 042 // Arrange 043 DummyProcessor parent = new DummyProcessor(); 044 Node task = new Node("Task"); 045 ILogger log = parent.getListener().createLog("test", false); 046 TaskProcessorThread thread = new TaskProcessorThread(parent, task, new File("."), log); 047 048 // Act 049 TaskProcessorThread cloned = thread.clone(2); 050 051 // Assert 052 assertTrue(cloned != thread); 053 assertEquals("2", String.valueOf(cloned.getProcessor().getVariables().get(TaskProcessorThread.THREAD_ID))); 054 } 055 056 private static class DummyProcessor extends Processor { 057 private final RecipeListener listener = new DummyRecipeListener(); 058 059 DummyProcessor() { 060 super(new HashMap<String, Object>(), new Node("Config"), new File(".")); 061 setTestListener(listener); 062 this.startVariables = new HashMap<String, Object>(); 063 this.variables = new HashMap<String, Object>(); 064 this.log = listener.createLog("dummy", false); 065 } 066 067 @Override 068 public void regChildProcess(TaskProcessorThread aMaxTestRunnable) { 069 // no-op 070 } 071 072 @Override 073 public void unregChildProcess(TaskProcessorThread aMaxTestRunnable) { 074 // no-op 075 } 076 } 077 078 private static class DummyRecipeListener implements RecipeListener { 079 private final AEManager manager = new DummyManager(); 080 081 @Override 082 public void setProgress(String aCurrentTaskName, long aMaxTags, long aCurrTags, boolean aErrorState) { 083 // no-op 084 } 085 086 @Override 087 public void setStatus(int status) { 088 // no-op 089 } 090 091 @Override 092 public void startTask(String aNameTask) { 093 // no-op 094 } 095 096 @Override 097 public void endTask(boolean aErrorState) { 098 // no-op 099 } 100 101 @Override 102 public void changeVariable(String aAttribut, Object aValue) { 103 // no-op 104 } 105 106 @Override 107 public void startCommand(int i) { 108 // no-op 109 } 110 111 @Override 112 public void startChildProcess(TaskProcessorThread aMaxTestRunnable) { 113 // no-op 114 } 115 116 @Override 117 public void stopChildProcess(TaskProcessorThread aMaxTestRunnable) { 118 // no-op 119 } 120 121 @Override 122 public void criticalError(CommandException aThrowable, Processor processor) { 123 // no-op 124 } 125 126 @Override 127 public void checkFailure(CommandException e, Processor processor) { 128 // no-op 129 } 130 131 @Override 132 public void aboutTest(String theTaskName, Node aCurrentAction) { 133 // no-op 134 } 135 136 @Override 137 public String getRunMode() { 138 return null; 139 } 140 141 @Override 142 public void exceptionIgnored(Throwable e) { 143 // no-op 144 } 145 146 @Override 147 public ServerSocket createPort(int thePort, String aDescription) throws IOException { 148 return new ServerSocket(thePort); 149 } 150 151 @Override 152 public void closePort(int thePort) { 153 // no-op 154 } 155 156 @Override 157 public void errorInformation(Processor processor, Throwable e, Node aTaskNode) throws CommandException { 158 throw new CommandException(e, processor, aTaskNode); 159 } 160 161 @Override 162 public void outToView(Processor processor, Properties aProperties, Object theValue) { 163 // no-op 164 } 165 166 @Override 167 public void runCommandView(Properties params) throws Throwable { 168 // no-op 169 } 170 171 @Override 172 public ILogger createLog(String aLogName, boolean mainLog) { 173 return new NoOpLogger(aLogName); 174 } 175 176 @Override 177 public AEManager getManager() { 178 return manager; 179 } 180 181 @Override 182 public void pause() { 183 // no-op 184 } 185 186 @Override 187 public void resume() { 188 // no-op 189 } 190 191 @Override 192 public void stopTest() { 193 // no-op 194 } 195 196 @Override 197 public boolean isNotifyMe() { 198 return false; 199 } 200 } 201 202 private static class DummyManager implements AEManager { 203 204 @Override 205 public File getStartDir() { 206 return new File("."); 207 } 208 209 @Override 210 public String inputChoice(String varName, String description, String[] varValues, String defaultValue, 211 Processor taskProcessor, boolean notifyMe) { 212 return null; 213 } 214 215 @Override 216 public String inputFile(String name, String description, File defaultFile, ILogger log, Processor taskProcessor) { 217 return null; 218 } 219 220 @Override 221 public void inputDataTable(Processor unit, Node aTableNode, boolean notifyMe) throws Exception { 222 // no-op 223 } 224 225 @Override 226 public boolean confirmation(String name, String message, Processor unit, boolean notifyMe) throws Exception { 227 return false; 228 } 229 230 @Override 231 public String inputValue(String name, String description, String value, ILogger log, String type, boolean notifyMe, 232 Processor processor) throws Exception { 233 return null; 234 } 235 236 @Override 237 public String getTestPath(String newName) { 238 return null; 239 } 240 241 @Override 242 public String[] getTestsList() { 243 return new String[0]; 244 } 245 246 @Override 247 public File getWorkingDir() { 248 return new File("."); 249 } 250 251 @Override 252 public com.ganteater.ae.MultiTaskRunDialog tasksChoice(com.ganteater.ae.MultiTaskRunDialog choiceRunner, 253 String[] theNames, boolean exceptionIgnoreFlag, Object setup, Processor taskProcessor, boolean visible) { 254 return null; 255 } 256 257 @Override 258 public String choiceValue(String name, String description, Object[] aPossibleValues, ILogger log, boolean notifyMe, 259 Processor processor) { 260 return null; 261 } 262 263 @Override 264 public File getFile(String path) { 265 return new File(path); 266 } 267 268 @Override 269 public Map<String, Object> getSystemVariables() { 270 return new HashMap<String, Object>(); 271 } 272 273 @Override 274 public void setConsoleDefaultInput(boolean defaultMode) { 275 // no-op 276 } 277 278 @Override 279 public boolean isConsoleDefaultInput(String varName, String description) { 280 return true; 281 } 282 283 @Override 284 public com.ganteater.ae.RecipeRunner runTask(String name, boolean async) throws CommandException { 285 return null; 286 } 287 288 @Override 289 public Node getConfigNode() { 290 return new Node("Config"); 291 } 292 293 @Override 294 public void startTaskNotify(com.ganteater.ae.RecipeRunner task) { 295 // no-op 296 } 297 298 @Override 299 public void progressText(String name) { 300 // no-op 301 } 302 303 @Override 304 public void progressValue(int i, int length, boolean success) { 305 // no-op 306 } 307 308 @Override 309 public void addRunner(com.ganteater.ae.RecipeRunner testRunner) { 310 // no-op 311 } 312 313 @Override 314 public void removeRunner(com.ganteater.ae.RecipeRunner testRunner) { 315 // no-op 316 } 317 318 @Override 319 public void finished(String aTestFile) { 320 // no-op 321 } 322 323 @Override 324 public MessageHandler message(Processor taskProcessor, String message, String description, boolean notifyMe) { 325 return null; 326 } 327 328 @Override 329 public File getHomeWorkingDir() { 330 return new File("."); 331 } 332 } 333 334 private static class NoOpLogger implements ILogger { 335 private final String name; 336 337 NoOpLogger(String name) { 338 this.name = name; 339 } 340 341 @Override 342 public Object info(Object message) { 343 return message; 344 } 345 346 @Override 347 public Object debug(Object message) { 348 return message; 349 } 350 351 @Override 352 public Object debug(Object message, Throwable t) { 353 return message; 354 } 355 356 @Override 357 public Object warn(Object message) { 358 return message; 359 } 360 361 @Override 362 public Object error(Object message) { 363 return message; 364 } 365 366 @Override 367 public Object error(Object message, Throwable t) { 368 return message; 369 } 370 371 @Override 372 public String getName() { 373 return name; 374 } 375 376 @Override 377 public boolean isFilterEnabled() { 378 return false; 379 } 380 381 @Override 382 public String filter(Object message) { 383 return String.valueOf(message); 384 } 385 } 386}