From 2cacf6885cafa276985324924a038618b0bb10fd Mon Sep 17 00:00:00 2001 From: Peter Andersson Date: Tue, 8 Nov 2011 08:55:08 +0100 Subject: Add CSS stylesheet for the text and tables in Common Test and Test Server Also make general improvements of presentation of results. OTP-9706 --- lib/common_test/src/ct_framework.erl | 32 +-- lib/common_test/src/ct_logs.erl | 494 +++++++++++++++++++++++------------ 2 files changed, 336 insertions(+), 190 deletions(-) (limited to 'lib/common_test/src') diff --git a/lib/common_test/src/ct_framework.erl b/lib/common_test/src/ct_framework.erl index 482c5242ce..26c71dfb42 100644 --- a/lib/common_test/src/ct_framework.erl +++ b/lib/common_test/src/ct_framework.erl @@ -27,7 +27,7 @@ -export([init_tc/3, end_tc/3, end_tc/4, get_suite/2, get_all_cases/1]). -export([report/2, warn/1, error_notification/4]). --export([get_logopts/0, format_comment/1, overview_html_header/1]). +-export([get_logopts/0, format_comment/1, get_html_wrapper/2]). -export([error_in_suite/1, ct_init_per_group/2, ct_end_per_group/2]). @@ -1411,30 +1411,6 @@ format_comment(Comment) -> "" ++ Comment ++ "". %%%----------------------------------------------------------------- -%%% @spec overview_html_header(TestName) -> Header -overview_html_header(TestName) -> - TestName1 = lists:flatten(io_lib:format("~p", [TestName])), - Label = case application:get_env(common_test, test_label) of - {ok,Lbl} when Lbl =/= undefined -> - "

" ++ Lbl ++ "

\n"; - _ -> - "" - end, - Bgr = case ct_logs:basic_html() of - true -> - ""; - false -> - CTPath = code:lib_dir(common_test), - TileFile = filename:join(filename:join(CTPath,"priv"),"tile1.jpg"), - " background=\"" ++ TileFile ++ "\"" - end, - - ["\n", - "Test ", TestName1, " results\n", - "\n", - "\n", - "\n", - Label, - "

Results from test ", TestName1, "

\n"]. - +%%% @spec get_html_wrapper(TestName, PrintLabel) -> Header +get_html_wrapper(TestName, PrintLabel) -> + ct_logs:get_ts_html_wrapper(TestName, PrintLabel). diff --git a/lib/common_test/src/ct_logs.erl b/lib/common_test/src/ct_logs.erl index c1523509a5..af45ecf235 100644 --- a/lib/common_test/src/ct_logs.erl +++ b/lib/common_test/src/ct_logs.erl @@ -29,11 +29,13 @@ -module(ct_logs). -export([init/1,close/2,init_tc/1,end_tc/1]). --export([get_log_dir/0,log/3,start_log/1,cont_log/2,end_log/0]). +-export([get_log_dir/0,get_log_dir/1]). +-export([log/3,start_log/1,cont_log/2,end_log/0]). -export([set_stylesheet/2,clear_stylesheet/1]). -export([add_external_logs/1,add_link/3]). -export([make_last_run_index/0]). -export([make_all_suites_index/1,make_all_runs_index/1]). +-export([get_ts_html_wrapper/2]). %% Logging stuff directly from testcase -export([tc_log/3,tc_print/3,tc_pal/3,ct_log/3, @@ -162,7 +164,12 @@ clear_stylesheet(TC) -> %%%----------------------------------------------------------------- %%% @spec get_log_dir() -> {ok,Dir} | {error,Reason} get_log_dir() -> - call(get_log_dir). + call({get_log_dir,false}). + +%%%----------------------------------------------------------------- +%%% @spec get_log_dir(Abs) -> {ok,Dir} | {error,Reason} +get_log_dir(Abs) -> + call({get_log_dir,Abs}). %%%----------------------------------------------------------------- %%% make_last_run_index() -> ok @@ -437,6 +444,8 @@ log_timestamp({MS,S,US}) -> logger(Parent,Mode) -> register(?MODULE,self()), + put(basic_html, basic_html()), + %%! Below is a temporary workaround for the limitation of %%! max one test run per second. %%! ---> @@ -456,8 +465,9 @@ logger(Parent,Mode) -> %%! <--- file:make_dir(Dir), + AbsDir = ?abs(Dir), ct_event:notify(#event{name=start_logging,node=node(), - data=?abs(Dir)}), + data=AbsDir}), make_all_runs_index(start), make_all_suites_index(start), case Mode of @@ -472,7 +482,7 @@ logger(Parent,Mode) -> Parent ! {started,self(),{Time,filename:absname("")}}, set_evmgr_gl(CtLogFd), logger_loop(#logger_state{parent=Parent, - log_dir=Dir, + log_dir=AbsDir, start_time=Time, orig_GL=group_leader(), ct_log_fd=CtLogFd, @@ -536,12 +546,15 @@ logger_loop(State) -> set_evmgr_gl(State#logger_state.ct_log_fd), return(From,ok), logger_loop(State#logger_state{tc_groupleaders=rm_tc_gl(TCPid,State)}); - {get_log_dir,From} -> + {{get_log_dir,true},From} -> return(From,{ok,State#logger_state.log_dir}), logger_loop(State); + {{get_log_dir,false},From} -> + return(From,{ok,filename:basename(State#logger_state.log_dir)}), + logger_loop(State); {make_last_run_index,From} -> make_last_run_index(State#logger_state.start_time), - return(From,State#logger_state.log_dir), + return(From,filename:basename(State#logger_state.log_dir)), logger_loop(State); {set_stylesheet,_,SSFile} when State#logger_state.stylesheet == SSFile -> logger_loop(State); @@ -657,7 +670,7 @@ set_evmgr_gl(GL) -> open_ctlog() -> {ok,Fd} = file:open(?ct_log_name,[write]), - io:format(Fd,header("Common Test Framework"),[]), + io:format(Fd,header("Common Test Framework Log"),[]), case file:consult(ct_run:variables_file_name("../")) of {ok,Vars} -> io:format(Fd, config_table(Vars), []); @@ -672,17 +685,22 @@ open_ctlog() -> end, print_style(Fd,undefined), io:format(Fd, - "

Progress Log

\n" - "
\n",[]),
+	      xhtml("

Progress Log

\n
\n",
+		    "

PROGRESS LOG

\n
\n"), []),
     Fd.
 
 print_style(Fd,undefined) ->
-    io:format(Fd,
-	      "\n",
-	      []);
+    case basic_html() of
+	true ->
+	    io:format(Fd,
+		      "\n",
+		      []);
+	_ ->
+	    ok
+    end;
 
 print_style(Fd,StyleSheet) ->
     case file:read_file(StyleSheet) of
@@ -854,8 +872,8 @@ make_one_index_entry1(SuiteName, Link, Label, Success, Fail, UserSkip, AutoSkip,
 			    CrashDumpName = SuiteName ++ "_erl_crash.dump",
 			    case filelib:is_file(CrashDumpName) of
 				true ->
-				    [" (CrashDump)"];
+				    [" (CrashDump)"];
 				false ->
 				    ""
 			    end
@@ -869,32 +887,41 @@ make_one_index_entry1(SuiteName, Link, Label, Success, Fail, UserSkip, AutoSkip,
 			    0 -> "-";
 			    _ -> NodeOrDate
 			end,
-		N = ["",Node1,"\n"],
-		L = ["",Label,"\n"],
-		T = ["",timestamp(CtRunDir),"\n"],
+		TS = timestamp(CtRunDir),
+		N = xhtml(["",Node1,
+			   "\n"],
+			  ["",Node1,"\n"]),
+		L = xhtml(["",Label,
+			   "\n"],
+			  ["",Label,"\n"]),
+		T = xhtml(["",TS,"\n"],
+			  ["",TS,"\n"]),
 		CtLogFile = filename:join(CtRunDir,?ct_log_name),
 		OldRunsLink = 
 		    case OldRuns of
 			[] -> "none";
-			_ ->  "Old Runs"
+			_ ->  "Old Runs"
 		    end,
-		A=["CT Log\n",
-		   "",OldRunsLink,"\n"],
+		A = xhtml(["CT Log\n",
+			   "",OldRunsLink,"\n"],
+			  ["CT Log\n",
+			   "",OldRunsLink,"\n"]),
 		{L,T,N,A};
 	    false ->
 		{"","","",""}
 	end,
     NotBuiltStr =
 	if NotBuilt == 0 ->
-		["",integer_to_list(NotBuilt),"\n"];
+		["",integer_to_list(NotBuilt),"\n"];
 	   true ->
-		["",
-		integer_to_list(NotBuilt),"\n"]
+		["",
+		integer_to_list(NotBuilt),"\n"]
 	end,
     FailStr =
 	if Fail > 0 ->  
-		["",
-		 integer_to_list(Fail),""];
+		["",
+		 integer_to_list(Fail),""];
 	   true ->
 		integer_to_list(Fail)
 	end,
@@ -902,31 +929,33 @@ make_one_index_entry1(SuiteName, Link, Label, Success, Fail, UserSkip, AutoSkip,
 	if AutoSkip == undefined -> {UserSkip,"?","?"};
 	   true ->
 		ASStr = if AutoSkip > 0 ->
-				["",
-				 integer_to_list(AutoSkip),""];
+				["",
+				 integer_to_list(AutoSkip),""];
 			   true -> integer_to_list(AutoSkip)
 			end,
 		{UserSkip+AutoSkip,integer_to_list(UserSkip),ASStr}
 	end,
-    ["\n",
-     "",SuiteName,"",CrashDumpLink,"\n",
-     Lbl,
-     Timestamp,
-     "",integer_to_list(Success),"\n",
-     "",FailStr,"\n",
-     "",integer_to_list(AllSkip),
-     " (",UserSkipStr,"/",AutoSkipStr,")\n",  
-     NotBuiltStr,
-     Node,
-     AllInfo,
-     "\n"].
+    [xhtml("\n",
+	   ["\n"]),
+     xhtml("",SuiteName,"", CrashDumpLink,
+     xhtml("\n", "\n"),
+     Lbl, Timestamp,
+     "",integer_to_list(Success),"\n",
+     "",FailStr,"\n",
+     "",integer_to_list(AllSkip),
+     " (",UserSkipStr,"/",AutoSkipStr,")\n",  
+     NotBuiltStr, Node, AllInfo, "\n"].
+
 total_row(Success, Fail, UserSkip, AutoSkip, NotBuilt, All) ->
     {Label,TimestampCell,AllInfo} =
 	case All of
 	    true ->
-		{" \n",
-		 " \n",
-		 " \n \n"};
+		{" \n",
+		 " \n",
+		 " \n"
+		 " \n"
+		 " \n"};
 	    false ->
 		{"","",""}
 	end,
@@ -936,17 +965,15 @@ total_row(Success, Fail, UserSkip, AutoSkip, NotBuilt, All) ->
 	   true -> {UserSkip+AutoSkip,
 		    integer_to_list(UserSkip),integer_to_list(AutoSkip)}
 	end,
-    ["\n",
-     "Total",
-     Label,
-     TimestampCell,
-     "",integer_to_list(Success),"\n",
-     "",integer_to_list(Fail),"\n",
-     "",integer_to_list(AllSkip),
-     " (",UserSkipStr,"/",AutoSkipStr,")\n",  
-     "",integer_to_list(NotBuilt),"\n",
-     AllInfo,
-     "\n"].
+    [xhtml("\n", 
+	   ["\n"]),
+     "Total\n", Label, TimestampCell,
+     "",integer_to_list(Success),"\n",
+     "",integer_to_list(Fail),"\n",
+     "",integer_to_list(AllSkip),
+     " (",UserSkipStr,"/",AutoSkipStr,")\n",  
+     "",integer_to_list(NotBuilt),"\n",
+     AllInfo, "\n"].
 
 not_built(_BaseName,_LogDir,_All,[]) ->
     0;
@@ -1005,41 +1032,52 @@ index_header(Label, StartTime) ->
 	    undefined ->
 		header("Test Results", format_time(StartTime));
 	    _ ->
-		header("Test Results for \"" ++ Label ++ "\"",
+		header("Test Results for '" ++ Label ++ "'",
 		       format_time(StartTime))
 	end,
     [Head |
-     ["
\n", - "

Common Test Framework Log

", - "\n" - "\n", - "\n" + ["
\n", + xhtml(["

Common Test Framework Log

"], + ["
" + ""]), + xhtml("
\n", "


\n"), + xhtml(["
Test Name_Ok" - "_
\n"], "
\n"), + "\n", + xhtml(["\n"], + "\n"), "\n", - "\n" - "\n" + "\n" + "\n" "\n"]]. - all_suites_index_header() -> {ok,Cwd} = file:get_cwd(), all_suites_index_header(Cwd). all_suites_index_header(IndexDir) -> LogDir = filename:basename(IndexDir), - AllRuns = "All test runs in \"" ++ LogDir ++ "\"", + AllRuns = xhtml(["All test runs in \"" ++ LogDir ++ "\""], + "ALL RUNS"), + AllRunsLink = xhtml(["",AllRuns,"\n"], + ["
\n" + "",AllRuns,"\n
"]), [header("Test Results") | - ["
\n", - "",AllRuns,"\n", - "

\n", - "
Test Name_Ok" + "_OkFailedSkipped
(User/Auto)
Missing
Suites
Skipped", xhtml("
", "
"), "(User/Auto)
Missing", xhtml("
", "
"), "Suites
\n" + ["
\n", + AllRunsLink, + xhtml("

\n", "

\n"), + xhtml(["
\n"], "
\n"), "\n", "\n", "\n", - "\n" + xhtml(["\n"], + "\n"), "\n", "\n" "\n" @@ -1052,17 +1090,25 @@ all_runs_header() -> {ok,Cwd} = file:get_cwd(), LogDir = filename:basename(Cwd), Title = "All test runs in \"" ++ LogDir ++ "\"", + IxLink = [xhtml(["

Test Index Page

"], + [""]), + xhtml("
\n", "

\n")], [header(Title) | - ["
Test NameLabelTest Run Started_Ok" - "__Ok" + "_OkFailedSkipped
(User/Auto)
Missing
Suites
\n" - "\n" - "\n" - "\n" + ["
\n", IxLink, + xhtml(["
HistoryNodeLabel
\n"], "
\n"), + "\n" + "\n" + "\n" "\n" - "\n" - "\n" - "\n" + "\n" + "\n", + xhtml(["\n"], + "\n"), "\n" "\n" "\n" @@ -1075,60 +1121,56 @@ header(Title, SubTitle) -> header1(Title, SubTitle) -> SubTitleHTML = if SubTitle =/= "" -> - ["
\n", - "

" ++ SubTitle ++ "

\n", - "
\n
\n"]; - true -> "
\n" + ["
\n", + "

" ++ SubTitle ++ "

\n", + xhtml("
\n
\n", "\n
\n")]; + true -> xhtml("
\n", "
\n") end, - ["\n" - "\n" - "\n", - "\n", - - "" ++ Title ++ " " ++ SubTitle ++ "\n", - "\n", - - "\n", - - body_tag(), - - "\n", - - "
\n", - "

" ++ Title ++ "

\n", - "
\n", - SubTitleHTML, - - "\n"]. + CTPath = code:lib_dir(common_test), + CSSFile = filename:join(filename:join(CTPath, "priv"), "ct_default.css"), + [xhtml(["\n", + "\n"], + ["\n", + "\n"]), + "\n", + "\n", + "" ++ Title ++ " " ++ SubTitle ++ "\n", + "\n", + xhtml("", + [""]), + "\n", + body_tag(), + "
\n", + "

" ++ Title ++ "

\n", + "
\n", + SubTitleHTML,"\n"]. index_footer() -> - ["
HistoryNodeLabelTestsTest NamesTotal_Ok" - "_Test NamesTotal_Ok" + "_OkFailedSkipped
(User/Auto)
Missing
Suites
\n" - "
\n" | footer()]. + ["\n" + "\n" | footer()]. footer() -> - ["

\n" - "

\n" - "
\n" - "

\n" + ["

\n", + xhtml("

\n
\n", "

\n"), + xhtml("

\n", "

"), "Copyright © ", year(), - " Open Telecom Platform
\n" - "Updated: ", current_time(), "
\n" - "
\n" - "
\n" + " Open Telecom Platform", + xhtml("
\n", "
\n"), + "Updated: ", current_time(), "", + xhtml("
\n", "
\n"), + xhtml("

\n", "\n"), + "
\n" "\n"]. body_tag() -> - case basic_html() of - true -> - "\n"; - false -> - CTPath = code:lib_dir(common_test), - TileFile = filename:join(filename:join(CTPath,"priv"),"tile1.jpg"), - "\n" - end. + CTPath = code:lib_dir(common_test), + TileFile = filename:join(filename:join(CTPath,"priv"),"tile1.jpg"), + xhtml("\n", + "\n"). current_time() -> format_time(calendar:local_time()). @@ -1258,20 +1300,25 @@ config_table(Vars) -> [config_table_header()|config_table1(Vars)]. config_table_header() -> - ["

Configuration

\n", - "Configuration\n" + "
CONFIGURATION\n
\n"), "\n"]. config_table1([{Key,Value}|Vars]) -> - ["\n", - "\n" | + [xhtml(["\n", + "\n"], + ["\n", + "\n", + "\n\n"]) | config_table1(Vars)]; config_table1([]) -> ["
KeyValue
", atom_to_list(Key), "
",io_lib:format("~p",[Value]),"
", atom_to_list(Key), "
",io_lib:format("~p",[Value]),"
", atom_to_list(Key), "", io_lib:format("~p",[Value]), "
\n"]. make_all_runs_index(When) -> + put(basic_html, basic_html()), AbsName = ?abs(?all_runs_name), notify_and_lock_file(AbsName), if When == start -> ok; @@ -1280,8 +1327,7 @@ make_all_runs_index(When) -> Dirs = filelib:wildcard(logdir_prefix()++"*.*"), DirsSorted = (catch sort_all_runs(Dirs)), Header = all_runs_header(), - BasicHtml = basic_html(), - Index = [runentry(Dir, BasicHtml) || Dir <- DirsSorted], + Index = [runentry(Dir) || Dir <- DirsSorted], Result = file:write_file(AbsName,Header++Index++index_footer()), if When == start -> ok; true -> io:put_chars("done\n") @@ -1309,22 +1355,22 @@ sort_all_runs(Dirs) -> interactive_link() -> [Dir|_] = lists:reverse(filelib:wildcard(logdir_prefix()++"*.*")), CtLog = filename:join(Dir,"ctlog.html"), - Body = ["Log from last interactive run: ", - timestamp(Dir),""], + Body = ["Log from last interactive run: ", + timestamp(Dir),""], file:write_file("last_interactive.html",Body), io:format("~n~nUpdated ~s\n" "Any CT activities will be logged here\n", [?abs("last_interactive.html")]). -runentry(Dir, BasicHtml) -> +runentry(Dir) -> TotalsFile = filename:join(Dir,?totals_name), TotalsStr = case read_totals_file(TotalsFile) of {Node,Label,Logs,{TotSucc,TotFail,UserSkip,AutoSkip,NotBuilt}} -> TotFailStr = if TotFail > 0 -> - ["", - integer_to_list(TotFail),""]; + ["", + integer_to_list(TotFail),""]; true -> integer_to_list(TotFail) end, @@ -1332,8 +1378,8 @@ runentry(Dir, BasicHtml) -> if AutoSkip == undefined -> {UserSkip,"?","?"}; true -> ASStr = if AutoSkip > 0 -> - ["", - integer_to_list(AutoSkip),""]; + ["", + integer_to_list(AutoSkip),""]; true -> integer_to_list(AutoSkip) end, {UserSkip+AutoSkip,integer_to_list(UserSkip),ASStr} @@ -1365,30 +1411,49 @@ runentry(Dir, BasicHtml) -> lists:flatten(io_lib:format("~s...",[Trunc])) end, Total = TotSucc+TotFail+AllSkip, - A = ["",Node,"\n", - "",Label,"\n", - "",NoOfTests,"\n"], - B = if BasicHtml -> - ["",TestNamesTrunc,"\n"]; - true -> - [" ", - TestNamesTrunc,"\n"] - end, - C = ["",integer_to_list(Total),"\n", - "",integer_to_list(TotSucc),"\n", - "",TotFailStr,"\n", - "",integer_to_list(AllSkip), - " (",UserSkipStr,"/",AutoSkipStr,")\n", - "",integer_to_list(NotBuilt),"\n"], + A = xhtml(["",Node, + "\n", + "",Label, + "\n", + "",NoOfTests,"\n"], + ["",Node,"\n", + "",Label,"\n", + "",NoOfTests,"\n"]), + B = xhtml([" ", + TestNamesTrunc,"\n"], + [" ", + TestNamesTrunc,"\n"]), + C = ["",integer_to_list(Total),"\n", + "",integer_to_list(TotSucc),"\n", + "",TotFailStr,"\n", + "",integer_to_list(AllSkip), + " (",UserSkipStr,"/",AutoSkipStr,")\n", + "",integer_to_list(NotBuilt),"\n"], A++B++C; _ -> - ["", - "Test data missing or corrupt","\n"] + A = xhtml(["" + "Test data missing or corrupt\n", + "?\n", + "?\n"], + ["" + "Test data missing or corrupt\n", + "?\n", + "?\n"]), + B = xhtml(["?\n"], + ["?\n"]), + C = ["?\n", + "?\n", + "?\n", + "?\n", + "?\n"], + A++B++C end, Index = filename:join(Dir,?index_name), - ["\n" - "",timestamp(Dir),"",TotalsStr,"\n" - "\n"]. + [xhtml("\n", ["\n"]), + xhtml(["",timestamp(Dir),"", + TotalsStr,"\n"], + ["",timestamp(Dir),"",TotalsStr,"\n"]), + "\n"]. write_totals_file(Name,Label,Logs,Totals) -> AbsName = ?abs(Name), @@ -1482,6 +1547,7 @@ timestamp(Dir) -> %% Creates the top level index file. When == start | refresh. %% A copy of the dir tree under logdir is cached as a result. make_all_suites_index(When) when is_atom(When) -> + put(basic_html, basic_html()), AbsIndexName = ?abs(?index_name), notify_and_lock_file(AbsIndexName), LogDirs = filelib:wildcard(logdir_prefix()++".*/*"++?logdir_ext), @@ -1493,6 +1559,7 @@ make_all_suites_index(When) when is_atom(When) -> %% This updates the top level index file using cached data from %% the initial index file creation. make_all_suites_index(NewTestData = {_TestName,DirName}) -> + put(basic_html, basic_html()), %% AllLogDirs = [{TestName,Label,Missing,{LastLogDir,Summary},OldDirs}|...] {AbsIndexName,LogDirData} = ct_util:get_testdata(test_index), @@ -1849,6 +1916,32 @@ last_test([_|Rest], Latest) -> last_test([], Latest) -> Latest. +%%%----------------------------------------------------------------- +%%% @spec xhtml(HTML, XHTML) -> HTML | XHTML +%%% +%%% @doc +%%% +xhtml(HTML, XHTML) -> + case get(basic_html) of + true -> HTML; + _ -> XHTML + end. + +%%%----------------------------------------------------------------- +%%% @spec odd_or_even() -> "odd" | "even" +%%% +%%% @doc +%%% +odd_or_even() -> + case get(odd_or_even) of + even -> + put(odd_or_even, odd), + "even"; + _ -> + put(odd_or_even, even), + "odd" + end. + %%%----------------------------------------------------------------- %%% @spec basic_html() -> true | false %%% @@ -1861,3 +1954,80 @@ basic_html() -> _ -> false end. + +%%%----------------------------------------------------------------- +%%% @spec get_ts_html_wrapper(TestName, PrintLabel) -> {Mode,Header,Footer} +%%% +%%% @doc +%%% +get_ts_html_wrapper(TestName, PrintLabel) -> + TestName1 = lists:flatten(io_lib:format("~p", [TestName])), + Basic = basic_html(), + LabelStr = + if not PrintLabel -> + ""; + true -> + case {Basic,application:get_env(common_test, test_label)} of + {true,{ok,Lbl}} when Lbl =/= undefined -> + "

" ++ Lbl ++ "

\n"; + {_,{ok,Lbl}} when Lbl =/= undefined -> + "
'" ++ Lbl ++ "'
\n"; + _ -> + "" + end + end, + CTPath = code:lib_dir(common_test), + {ok,CtLogdir} = get_log_dir(true), + AllRuns = filename:join(filename:dirname(CtLogdir), ?all_runs_name), + TestIndex = filename:join(filename:dirname(CtLogdir), ?index_name), + case Basic of + true -> + TileFile = filename:join(filename:join(CTPath,"priv"),"tile1.jpg"), + Bgr = " background=\"" ++ TileFile ++ "\"", + Copyright = + ["

\n", + "Copyright © ", year(), + " ", + "Open Telecom Platform
\n", + "Updated: ", current_time(), "", + "
\n

\n"], + {basic_html, + ["\n", + "\n", + "Test ", TestName1, " results\n", + "\n", + "\n", + "\n", + LabelStr, "\n"], + ["
\n

\n", + "Test run history\n | ", + "Top level test index\n\n

\n", + Copyright,"
\n\n\n"]}; + _ -> + Copyright = + ["
", + "Copyright © ", year(), + " ", + "Open Telecom Platform
\n", + "Updated: ", current_time(), "", + "
\n
\n"], + CSSFile = filename:join(filename:join(CTPath, "priv"), "ct_default.css"), + {xhtml, + ["\n", + "\n", + "\nTest ", TestName1, " results\n", + "\n", + "", + "\n","\n", + LabelStr, "\n"], + ["
\n

\n", + "Test run history\n | ", + "Top level test index\n\n

\n", + Copyright,"
\n\n\n"]} + end. -- cgit v1.2.3