blob: 410cf5dadcd4f8a62435fad3c6b50faa378b9758 [file] [log] [blame]
saul-romero-armce968d62021-05-18 15:01:12 +00001/*##############################################################################
2
3# Copyright (c) 2021, ARM Limited and Contributors. All rights reserved.
4
5#
6
7# SPDX-License-Identifier: BSD-3-Clause
8
9##############################################################################*/
10const capitalize = (s) => {
11 if (typeof s !== 'string') return ''
12 return s.charAt(0).toUpperCase() + s.slice(1)
13}
14
15function isValidHttpUrl(str) {
16 var regex = /(http|https):\/\/(\w+:{0,1}\w*)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%!\-\/]))?/;
17 if(!regex .test(str)) {
18 return false;
19 } else {
20 return true;
21 }
22}
23
24const slideDown = element => element.style.height = `${element.scrollHeight}px`;
25
26function show(elemId) {
27 let elem = document.getElementById(elemId)
28
29 if (elem.style.display == "none") {
30 elem.style.display = "block"
31 setTimeout(function() {elem.classList.toggle('hide')}, 50)
32 } else {
33 elem.classList.toggle('hide')
34 setTimeout(function() {elem.style.display = "none"}, 750)
35 }
36
37}
38
39var counter = 0
40
41class TableReport {
42
43 constructor(data, summary) {
44 this.data = data
45 this.summary = summary
46 this.container = document.createElement("div")
47 this.header = document.createElement("div")
48 this.container.classList.add("table-wrap")
49 this.table = document.createElement("table")
50 this.table.classList.add("styled-table")
51 this.container.appendChild(this.header)
52 this.container.appendChild(this.table)
53 this.generateHeader()
54 this.generateTable() // generate the table first
55 this.generateTableHead() // then the head
56 }
57
58 generateHeader() {
59 this.header.innerHTML = "<h2>Test results: " + this.summary["total"] + " tests, " +
60 "<label style='color:green'>" + this.summary["pass"] + " passed,</label> " +
61 "<label style='color:red'>" + this.summary["fail"] +" failed</label></h2>"
62 }
63
64 generateTableHead() {
65 let table = this.table
66 let thead = table.createTHead();
67 let row = thead.insertRow();
68 for (let key in this.data[0]) {
69 let th = document.createElement("th");
70 let text = document.createTextNode(capitalize(key));
71 th.appendChild(text);
72 row.appendChild(th);
73 }
74 }
75
76 generateTable() {
77 let table = this.table
78 for (let element of this.data) {
79 let row = table.insertRow();
80 for (let key in element) {
81 let cell = row.insertCell();
82 let text = document.createTextNode(element[key]);
83 cell.appendChild(text);
84 }
85 }
86 }
87}
88
89class Report {
90
91 constructor(reportObj) {
92 this.reportObj = reportObj
93 this.reportName = Object.keys(this.reportObj)[0]
94 this.report = this.reportObj[this.reportName]
95 this.testSuites = this.report["test-suites"]
96 this.testAssets = this.report["test-config"]["test-assets"]
97 this.metadata = this.report["metadata"]
98 this.target = this.report["target"]
99 this.testConfig = this.report["test-config"]
100 this.testEnvironments = this.report["test-environments"]
101 this.testSuitesData = {}
102 }
103
104 generateSuitesTables() {
105 this.suitesDivs = {}
106 var results = []
107 var index = 0
108 for (const [testSuiteName, testSuite] of Object.entries(this.testSuites)) {
109 ++index
110 results = []
111 var status = "PASS"
112 var failCount = 0
113 var passCount = 0
114 var counter = 0
115 var metCols = []
116 for (const [testResultName, testResult] of Object.entries(testSuite["test-results"])) {
117 results.push({name: testResultName, status: testResult["status"],
118 ...testResult["metadata"]})
119 if (testResult["status"] == "FAIL") {
120 status = "FAIL"
121 failCount++
122 } else if (testResult["status"] == "PASS") {
123 passCount++
124 }
125 metCols = Object.keys(testResult["metadata"])
126 ++counter
127 }
128 let summary = {"pass": passCount, "fail": failCount, "total": counter}
129 var tableReport = new TableReport(results, summary)
130 this.testSuitesData[testSuiteName] = {tableReport: tableReport, metadata: testSuite['metadata']}
131 }
132 }
133}
134
135function link(url) {
136 window.open(url, '_blank');
137}
138
139function generateItems(obj, container) {
140 let i = 0
141 let click=""
142 for (var [name, value] of Object.entries(obj)) {
143 if ((i++ % 3) == 0) {
144 divGroup = document.createElement("div")
145 divGroup.classList.add("item-parent")
146 container.appendChild(divGroup)
147 }
148 divElem = document.createElement("div")
149 divElem.classList.add("item")
150 style = ' class=item'
151 if (isValidHttpUrl(value))
152 style = ' class="link" onclick=link("' + value + '")'
153 divElem.innerHTML = "<span style='color:black'>" + name + ": </span>" + "<span" + style +">" + value + "</span>"
154 divGroup.appendChild(divElem)
155 }
156}
157
158function generateBlock(obj, title, expanded, extra) {
159 var divBlock = 0
160 var divGroup = 0
161 var divElem = 0
162 var divData = 0
163
164 if (expanded === undefined)
165 expanded = true
166 let id = title.replace(/\s+/g, '-') + counter++
167 let checked = expanded ? "checked" : ""
168 divBlock = document.createElement("div")
169 divBlock.classList.add("block-report")
170 let divTitle = document.createElement("div")
171 divTitle.innerHTML = '<label>' + title + '</div>' +
172 '<label class="switch"><input ' +
173 '" type="checkbox" ' + checked + ' onclick=' +
174 "show('data-" + id + "')>" +
175 '<span class="slider"></span></label>'
176 divBlock.appendChild(divTitle)
177 if (obj.tagName == 'DIV')
178 divData = obj
179 else
180 divData = document.createElement("div")
181 divData.id = "data-" + id
182 divData.classList.add("box")
183 divBlock.setAttribute('data-items-container', divData.id)
184 if (expanded == false) {
185 divData.style.display = 'none'
186 divData.classList.add("hide")
187 }
188
189 divBlock.appendChild(divData)
190 generateItems(obj, divData)
191 if (!(extra === undefined))
192 divData.appendChild(extra)
193 return divBlock
194}
195
196function generateReport(containerName, yamlString) {
197 const jsObject = JSON.parse(yamlString)
198 const report = new Report(jsObject)
199 document.getElementById("report-name").innerHTML = report.reportName
200 var divContent = document.getElementById("report-content")
201
202 var metadata = generateBlock(report.metadata, "Metadata", false)
203 divContent.appendChild(metadata)
204
205 divContent.appendChild(generateBlock(report.target, "Target", false))
206
207 var div = document.createElement("div")
208 divAssets = generateBlock(div, "Test assets", false)
209 for (const [name, data] of Object.entries(report.testConfig['test-assets'])) {
210 var divAsset = generateBlock(data, name, false)
211 div.appendChild(divAsset)
212 }
213
214 divConfig = generateBlock(divAssets, "Test configuration", false)
215 divContent.appendChild(divConfig)
216
217 div = document.createElement("div")
218 divEnvs = generateBlock(div, "Test environments", false)
219 for (const [name, data] of Object.entries(report.testEnvironments)) {
220 var divEnv = generateBlock(data, name, false)
221 div.appendChild(divEnv)
222 }
223 divContent.appendChild(divEnvs)
224
225 div = document.createElement("div")
226 divSuites = generateBlock(div, "Test suites")
227 report.generateSuitesTables()
228 var visible = true
229 for (const [name, suiteData] of Object.entries(report.testSuitesData)) {
230 var divSuite = generateBlock(suiteData['metadata'], name, visible, suiteData['tableReport'].container)
231 div.appendChild(divSuite)
232 if (visible)
233 visible = false
234 }
235
236 divContent.appendChild(divSuites)
237 return report
238}