1 package okw.log.log2html;
3 import java.io.BufferedWriter;
5 import java.io.FileOutputStream;
6 import java.io.FileWriter;
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.io.OutputStreamWriter;
10 import java.io.Writer;
11 import java.util.List;
12 import java.util.Locale;
13 import java.util.Stack;
15 import com.fasterxml.jackson.databind.ObjectMapper;
16 import com.fasterxml.jackson.databind.SerializationFeature;
18 import okw.log.ILogger;
28 private Stack<LogBase> Pointer2LogBaseStack =
new Stack<LogBase>();
32 private String name =
"";
35 private String result =
"";
39 this.myDuration.startTimer();
40 Pointer2LogBaseStack.push(
this);
44 public Log2HTML( String featereName )
46 this.myDuration.startTimer();;
47 this.name = featereName;
49 Pointer2LogBaseStack.push(
this);
57 Pointer2LogBaseStack.peek().myLogs.add(
new LogPass(Pointer2LogBaseStack.peek(), fpsMessage) );
65 Pointer2LogBaseStack.peek().myLogs.add(
new LogPrint(Pointer2LogBaseStack.peek(), fpsMessage) );
73 Pointer2LogBaseStack.peek().myLogs.add(
new LogPrintDebug(Pointer2LogBaseStack.peek(), fpsMessage) );
81 Pointer2LogBaseStack.peek().myLogs.add(
new LogWarning(Pointer2LogBaseStack.peek(), fpsMessage) );
89 Pointer2LogBaseStack.peek().myLogs.add(
new LogError(Pointer2LogBaseStack.peek(), fpsMessage) );
97 Pointer2LogBaseStack.peek().myLogs.add(
new LogException(Pointer2LogBaseStack.peek(), fpsMessage) );
101 public void LogSourceLocation( String Start, String End, String featureName, String sourceType )
105 Pointer2LogBaseStack.peek().myLogs.add(
new LogSourceLocation(Pointer2LogBaseStack.peek(), Start, End, featureName, sourceType) );
113 LogBase myLog =
new LogFunction( Pointer2LogBaseStack.peek(), fps_FunctionName, fpsParameter);
116 myLog.myDuration.startTimer();
118 Pointer2LogBaseStack.peek().myLogs.add(myLog);
119 Pointer2LogBaseStack.push(myLog);
131 myLog.myDuration.startTimer();
133 Pointer2LogBaseStack.peek().myLogs.add(myLog);
134 Pointer2LogBaseStack.push(myLog);
140 LogBase myLog = Pointer2LogBaseStack.pop();
142 myLog.myDuration.stopTimer();
144 @SuppressWarnings(
"unused" )
147 if ( !(myLog.bError || myLog.bException) )
156 LogBase myLog = Pointer2LogBaseStack.pop();
158 myLog.myDuration.stopTimer();
160 @SuppressWarnings(
"unused" )
163 if ( !(myLog.bError || myLog.bException) )
172 LogBase myLog = Pointer2LogBaseStack.pop();
174 myLog.myDuration.stopTimer();
177 myLogFunction.setReturn( fpb_Return.toString());
179 if ( !(myLog.bError || myLog.bException) )
188 LogBase myLog = Pointer2LogBaseStack.pop();
190 myLog.myDuration.stopTimer();
193 myLogFunction.setReturn( Return.toString());
195 if ( !(myLog.bError || myLog.bException) )
204 LogBase myLog = Pointer2LogBaseStack.pop();
206 myLog.myDuration.stopTimer();
209 myLogFunction.setReturn( fps_Return);
211 if ( !(myLog.bError || myLog.bException) )
220 LogBase myLog = Pointer2LogBaseStack.pop();
222 myLog.myDuration.stopTimer();
225 myLogFunction.setReturn( fps_Return);
227 if ( !(myLog.bError || myLog.bException) )
236 LogBase myLog = Pointer2LogBaseStack.pop();
238 myLog.myDuration.stopTimer();
243 myLogFunction.setReturn( fps_Return.toString());
245 if ( !(myLog.bError || myLog.bException) )
253 LogBase myLog = Pointer2LogBaseStack.pop();
255 myLog.myDuration.stopTimer();
260 myLogFunction.setReturn( fps_Return.toString());
262 if ( !(myLog.bError || myLog.bException) )
273 StopAllTimerAndEmptyStack();
274 Pointer2LogBaseStack.push(
this );
279 myLog.myDuration.startTimer();
281 Pointer2LogBaseStack.peek().myLogs.add(myLog);
282 Pointer2LogBaseStack.push(myLog);
287 LogBase myLog = Pointer2LogBaseStack.pop();
289 myLog.myDuration.stopTimer();
291 @SuppressWarnings(
"unused" )
294 if ( !(myLog.bError || myLog.bException))
299 StopAllTimerAndEmptyStack();
307 LogBase myLog =
new LogKeyword( Pointer2LogBaseStack.peek(), fps_FunctionName, fpsParameter);
310 myLog.myDuration.startTimer();
312 Pointer2LogBaseStack.peek().myLogs.add(myLog);
313 Pointer2LogBaseStack.push(myLog);
319 LogBase myLog = Pointer2LogBaseStack.peek();
321 myLog.myDuration.stopTimer();
323 @SuppressWarnings(
"unused" )
326 if ( !(myLog.bError || myLog.bException))
328 myLog.KeyWordPass( );
331 Pointer2LogBaseStack.pop();
343 myLog.myDuration.startTimer();
345 Pointer2LogBaseStack.peek().myLogs.add(myLog);
346 Pointer2LogBaseStack.push(myLog);
352 LogBase myLog = Pointer2LogBaseStack.peek();
354 myLog.myDuration.stopTimer();
356 @SuppressWarnings(
"unused" )
359 if ( !(myLog.bError || myLog.bException))
361 myLog.LocalACCallPass( );
364 Pointer2LogBaseStack.pop();
397 String choiceValue, String featureName,
398 String localCategoryName, String sourceExcerpt,
403 LogBase myLog =
new LogStep( Pointer2LogBaseStack.peek(), categoryName, categoryType, choiceValue, featureName, localCategoryName, sourceExcerpt, type );
406 myLog.myDuration.startTimer();
408 Pointer2LogBaseStack.peek().myLogs.add( myLog );
409 Pointer2LogBaseStack.push( myLog );
415 LogBase myLog = Pointer2LogBaseStack.peek();
417 myLog.myDuration.stopTimer();
419 @SuppressWarnings(
"unused" )
422 if ( !(myLog.bError || myLog.bException))
427 Pointer2LogBaseStack.pop();
440 myLog.myDuration.startTimer();
442 Pointer2LogBaseStack.peek().myLogs.add(myLog);
443 Pointer2LogBaseStack.push(myLog);
449 LogBase myLog = Pointer2LogBaseStack.peek();
451 myLog.myDuration.stopTimer();
453 @SuppressWarnings(
"unused" )
456 if ( !(myLog.bError || myLog.bException))
461 Pointer2LogBaseStack.pop();
465 public void LogSequenceStart( String fpsKeywordName, String fpsWindowFN, String fpsSequenceName, String... fpsParameter)
469 LogBase myLog =
new LogSequence( Pointer2LogBaseStack.peek(), fpsWindowFN, fpsSequenceName, fpsParameter);
472 myLog.myDuration.startTimer();
474 Pointer2LogBaseStack.peek().myLogs.add(myLog);
475 Pointer2LogBaseStack.push(myLog);
481 LogBase myLog = Pointer2LogBaseStack.peek();
483 myLog.myDuration.stopTimer();
485 @SuppressWarnings(
"unused" )
488 if ( !(myLog.bError || myLog.bException))
490 myLog.SequencePass();
493 Pointer2LogBaseStack.pop();
497 private String getHTMLFooter()
499 StringBuilder myResult =
new StringBuilder();
501 myResult.append(
"</body>\n");
502 myResult.append(
"</html>\n");
504 return myResult.toString();
508 private String getHTMLHeader() throws IOException
510 StringBuilder myResult =
new StringBuilder();
512 myResult.append(
"<!DOCTYPE html>\n");
513 myResult.append(
"<html lang=\"en\">\n");
514 myResult.append(
"<head>\n");
515 myResult.append(
"\t<title>TestPage Titel</title>\n");
519 myResult.append(
"\t<meta charset=\"utf-8\"/>\n");
524 myResult.append(
"\t<style>\n" );
525 myResult.append( getStyleSheet() );
526 myResult.append(
"\t</style>\n" );
528 myResult.append(
"</head>\n");
529 myResult.append(
"<body>\n");
530 myResult.append( getFoldScript() );
531 myResult.append(
"<div class=OKW_Logo title='www.openkeyword.de'></div>\n");
532 myResult.append(
"<h1>OpenKeyWord Testlog</h1>\n");
533 return myResult.toString();
536 private String getStyleSheet() throws IOException
538 StringBuilder myResult =
new StringBuilder();
540 ClassLoader loader = Thread.currentThread().getContextClassLoader();
541 InputStream is = loader.getResourceAsStream(
"Log2HTML.css");
543 byte[] buffer =
new byte[2048];
546 while ((length = is.read(buffer)) != -1)
548 myResult.append(
new String(buffer, 0, length));
552 return myResult.toString();
555 private String getFoldScript() throws IOException
557 StringBuilder myResult =
new StringBuilder();
559 ClassLoader loader = Thread.currentThread().getContextClassLoader();
560 InputStream is = loader.getResourceAsStream(
"folder.script");
562 byte[] buffer =
new byte[2048];
565 while ((length = is.read(buffer)) != -1)
567 myResult.append(
new String(buffer, 0, length));
571 return myResult.toString();
575 private String getHTMLStatistics()
577 StringBuilder myResult =
new StringBuilder();
579 myResult.append(
"<h2>Test Statistics</h2>\n");
582 myResult.append(
"<table class='statistics'>\n");
584 myResult.append(
"\t<thead class='statistics'>\n");
585 myResult.append(
"\t\t<tr class='statistics'>\n");
586 myResult.append(
"\t\t\t<th></th>\n");
587 myResult.append(
"\t\t\t<th>Count</th>\n");
588 myResult.append(
"\t\t\t<th colspan='3'></th>\n");
589 myResult.append(
"\t\t</tr>\n");
590 myResult.append(
"\t</thead>\n");
595 myResult.append(
"\t\t<tr>\n");
596 myResult.append(
"\t\t\t<td class='right'>Errors:</td>\n");
597 myResult.append(
"\t\t\t<td class='center'>" + ErrorCount.toString() +
"</td>\n");
598 myResult.append(
"\t\t\t<td colspan='3'></td>\n");
599 myResult.append(
"\t\t</tr>\n");
601 myResult.append(
"\t\t<tr>\n");
602 myResult.append(
"\t\t\t<td class='right'>Exceptions:</td>\n");
603 myResult.append(
"\t\t\t<td class='center'>" + ExceptionCount.toString() +
"</td>\n");
604 myResult.append(
"\t\t\t<td colspan='3'></td>\n"); myResult.append(
"\t\t</tr>\n");
606 myResult.append(
"\t\t<tr>\n");
607 myResult.append(
"\t\t\t<td class='right'>Warnings:</td>\n");
608 myResult.append(
"\t\t\t<td class='center'>" + WarningCount.toString() +
"</td>\n");
609 myResult.append(
"\t\t\t<td colspan='3'></td>\n"); myResult.append(
"\t\t</tr>\n");
611 myResult.append(
"\t\t<tr>\n");
612 myResult.append(
"\t\t\t<td class='right'>Passed:</td>\n");
613 myResult.append(
"\t\t\t<td class='center'>" + PassedCount.toString() +
"</td>\n");
614 myResult.append(
"\t\t\t<td colspan='3'></td>\n"); myResult.append(
"\t\t</tr>\n");
617 myResult.append(
"\t\t<tr class='statistics'>\n");
618 myResult.append(
"\t\t\t<th></th>\n");
619 myResult.append(
"\t\t\t<th class='widthfix'>Count</th>\n");
620 myResult.append(
"\t\t\t<th class='widthfix'>Pass</th>\n");
621 myResult.append(
"\t\t\t<th class='widthfix'>Fail</th>\n");
622 myResult.append(
"\t\t\t<th>Pass-Fail-Rate</th>\n");
623 myResult.append(
"\t\t</tr>\n");
625 myResult.append(
"\t\t<tr>\n");
626 myResult.append(
"\t\t\t<td class='right'>Test cases:</td>\n");
627 myResult.append(
"\t\t\t<td class='center'>" + TestcaseCount.toString() +
"</td>\n");
628 myResult.append(
"\t\t\t<td class='center'>" + TestcasePass.toString() +
"</td>\n");
629 myResult.append(
"\t\t\t<td class='center'>" + TestcaseFail.toString() +
"</td>\n");
630 myResult.append(
"\t\t\t<td>" + getFailPassBar(TestcaseFail, TestcaseCount - TestcaseFail) +
"</td>\n");
631 myResult.append(
"\t\t</tr>\n");
634 myResult.append(
"\t\t<tr>\n");
635 myResult.append(
"\t\t\t<td class='right'>Sequences:</td>\n");
636 myResult.append(
"\t\t\t<td class='center'>" + SequenceCount.toString() +
"</td>\n");
637 myResult.append(
"\t\t\t<td class='center'>" + SequencePass.toString() +
"</td>\n");
638 myResult.append(
"\t\t\t<td class='center'>" + SequenceFail.toString() +
"</td>\n");
639 myResult.append(
"\t\t\t<td >" + getFailPassBar(SequenceFail, SequenceCount - SequenceFail) +
"</td>\n");
640 myResult.append(
"\t\t</tr>\n");
642 myResult.append(
"\t\t<tr>\n");
643 myResult.append(
"\t\t\t<td class='right'>Keywords:</td>\n");
644 myResult.append(
"\t\t\t<td class='center'>" + KeyWordCount.toString() +
"</td>\n");
645 myResult.append(
"\t\t\t<td class='center'>" + KeyWordPass.toString() +
"</td>\n");
646 myResult.append(
"\t\t\t<td class='center'>" + KeyWordFail.toString() +
"</td>\n");
647 myResult.append(
"\t\t\t<td>" + getFailPassBar(KeyWordFail, KeyWordCount-KeyWordFail) +
"</td>\n");
648 myResult.append(
"\t\t</tr>\n");
650 myResult.append(
"\t\t<tr class='statistics'>\n");
651 myResult.append(
"\t\t\t<th colspan='5'>Timer</th>\n");
652 myResult.append(
"\t\t</tr>\n");
655 myResult.append(
"\t\t<tr>\n");
656 myResult.append(
"\t\t\t<td class='right'>Start time:</td>\n");
657 myResult.append(
"\t\t\t<td class='center' colspan='4'>" + this.myDuration.getStartTime() +
"</td>\n");
658 myResult.append(
"\t\t</tr>\n");
660 myResult.append(
"\t\t<tr>\n");
661 myResult.append(
"\t\t\t<td class='right'>End time:</td>\n");
662 myResult.append(
"\t\t\t<td class='center' colspan='4'>" + this.myDuration.getEndTime() +
"</td>\n");
663 myResult.append(
"\t\t</tr>\n");
664 myResult.append(
"</table>\n");
666 return myResult.toString();
670 private String getFailPassBar(
int FailCount,
int PassCount)
672 StringBuilder myResult =
new StringBuilder();
674 if (FailCount+PassCount > 0)
676 float lfFailRate = FailCount * 100f / (FailCount + PassCount );
677 float lfPassRate = 100f - lfFailRate;
679 myResult.append(
"<div class='pass-fail-graph'>\n");
680 myResult.append(
"\t<div class='pass-bar' style='width: " + String.format (Locale.ENGLISH,
"%.2f", lfPassRate) +
"%'></div>\n");
681 myResult.append(
"\t<div class='fail-bar' style='width: " + String.format (Locale.ENGLISH,
"%.2f", lfFailRate) +
"%'></div>\n");
682 myResult.append(
"</div>\n");
685 return myResult.toString();
689 public void old_Result2HTML(String fpsFilename)
692 StringBuilder myResult =
new StringBuilder();
696 StopAllTimerAndEmptyStack();
698 myResult.append(getHTMLHeader());
699 myResult.append(getHTMLStatistics());
701 myResult.append(
"<h2>Result Log</h2>\n");
702 myResult.append(getHTMLResult());
703 myResult.append(getHTMLFooter());
705 File fileDir =
new File( fpsFilename );
707 Writer out =
new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(fileDir),
"UTF8"));
709 out.append(myResult.toString());
716 System.out.print(e.getMessage());
720 public void Result2HTML( String fpsFilename )
723 StringBuilder myResult =
new StringBuilder();
728 StopAllTimerAndEmptyStack();
730 myResult.append( getHTMLHeader() );
731 myResult.append( getHTMLStatistics() );
733 myResult.append(
"<h2>Result Log</h2>\n" );
734 myResult.append( getHTMLResult() );
735 myResult.append( getHTMLFooter() );
737 FileWriter fw =
new FileWriter( fpsFilename );
738 BufferedWriter bw =
new BufferedWriter( fw );
740 bw.write( myResult.toString() );
746 System.out.print( e.getMessage() );
750 protected String getHTMLResult()
752 StringBuilder sbResult =
new StringBuilder();
754 for( LogBase myLog: this.myLogs )
756 sbResult.append( myLog.getHTMLResult() );
759 return sbResult.toString();
763 public String Result2JSON( String fpsFileName )
765 StringBuilder myJSON =
new StringBuilder();
766 String myJSONReturn =
"";
770 StopAllTimerAndEmptyStack();
772 myJSON.append( getJSONHeader() );
773 myJSON.append( this.jsonStructureComma(
"statistics", this.getJSONStatistics() ) );
775 myJSON.append( this.jsonArray(
"features", this.jsonArrayElement( this.getJSONResult() )));
776 myJSON.append( getJSONFooter());
778 myJSONReturn = this.beautify( myJSON.toString() );
780 System.out.print( myJSON.toString() );
783 FileWriter fw =
new FileWriter( fpsFileName );
784 BufferedWriter bw =
new BufferedWriter(fw);
786 bw.write( myJSONReturn );
792 System.out.print(e.getMessage());
799 private String getJSONHeader()
801 StringBuilder myResult =
new StringBuilder();
803 myResult.append(
"{");
805 return myResult.toString();
809 protected String getJSONResult()
811 StringBuilder myJSON =
new StringBuilder();
812 StringBuilder myJSONForLoop =
new StringBuilder();
815 myJSON.append( this.jsonElementComma(
"name", this.name ) );
816 myJSON.append( this.jsonElement(
"result", this.result ) );
818 Boolean GreaterOne =
false;
820 for( LogBase myLog: this.myLogs )
822 if (GreaterOne) myJSONForLoop.append(
", " );
823 else GreaterOne =
true;
824 myJSONForLoop.append( this.jsonArrayElement( myLog.getJSONResult() ) ) ;
829 myJSON.append(
", " + this.jsonArray(
"tests", myJSONForLoop.toString() ) );
834 return myJSON.toString();
837 private String getJSONFooter()
839 StringBuilder myResult =
new StringBuilder();
841 myResult.append(
"}");
843 return myResult.toString();
846 String beautify(String json)
849 String myReturn =
"";
851 ObjectMapper mapper =
new ObjectMapper();
852 mapper.configure(SerializationFeature.INDENT_OUTPUT,
true);
856 obj = mapper.readValue(json, Object.class);
857 myReturn = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
869 protected void abort()
881 myLog.myDuration.startTimer();
883 Pointer2LogBaseStack.peek().myLogs.add(myLog);
884 Pointer2LogBaseStack.push(myLog);
895 myLog.myDuration.startTimer();
897 Pointer2LogBaseStack.peek().myLogs.add(myLog);
898 Pointer2LogBaseStack.push(myLog);
902 private void StopAllTimerAndEmptyStack()
905 if (Pointer2LogBaseStack.size() > 1 )
907 Pointer2LogBaseStack.peek().abort();
910 while (!Pointer2LogBaseStack.isEmpty())
912 Pointer2LogBaseStack.pop().myDuration.stopTimer();
919 LogBase myLog = Pointer2LogBaseStack.pop();
922 myLog.myDuration.stopTimer();
924 @SuppressWarnings(
"unused" )
927 if ( (!myLog.bError) || (!myLog.bException))
936 LogBase myLog = Pointer2LogBaseStack.peek();
938 myLog.myDuration.stopTimer();
940 @SuppressWarnings(
"unused" )
943 if ( (!myLog.bError) || (!myLog.bException))
948 Pointer2LogBaseStack.pop();
959 protected void TestcaseCount()
961 this.TestcaseCount++;
965 protected void TestcaseFail()
971 protected void TestcasePass()
977 protected void FunctionCount()
979 this.FunctionCount++;
983 protected void FunctionFail()
989 protected void FunctionPass()
995 protected void KeyWordCount()
1001 protected void KeyWordFail()
1007 protected void KeyWordPass()
1013 protected void SequenceCount()
1015 this.SequenceCount++;
1019 protected void SequenceFail()
1021 this.SequenceFail++;
1025 protected void SequencePass()
1027 this.SequencePass++;
1032 protected void StepCount()
1038 protected void StepFail()
1044 protected void StepPass()
1052 protected void LocalACCallCount()
1054 this.LocalACCallCount++;
1058 protected void LocalACCallFail()
1060 this.LocalACCallFail++;
1064 protected void LocalACCallPass()
1066 this.LocalACCallPass++;
1071 protected void RemoteACCallCount()
1073 this.RemoteACCallCount++;
1077 protected void RemoteACCallFail()
1079 this.RemoteACCallFail++;
1083 protected void RemoteACCallPass()
1085 this.RemoteACCallPass++;