• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<?xml version="1.0" encoding="UTF-8"?>
2
3<!--
4   Copyright (c) 2009, 2021 Mountainminds GmbH & Co. KG and Contributors
5   This program and the accompanying materials are made available under
6   the terms of the Eclipse Public License 2.0 which is available at
7   http://www.eclipse.org/legal/epl-2.0
8
9   SPDX-License-Identifier: EPL-2.0
10
11   Contributors:
12      Brock Janiczak - initial API and implementation
13      Dominik Stadler - source folder support
14-->
15
16<project name="JaCoCo Report Task Tests" xmlns:au="antlib:org.apache.ant.antunit" xmlns:jacoco="antlib:org.jacoco.ant">
17
18	<target name="setUp">
19		<tempfile property="temp.dir" prefix="jacocoTest" destdir="${java.io.tmpdir}" />
20		<mkdir dir="${temp.dir}"/>
21	</target>
22
23	<target name="tearDown">
24		<delete dir="${temp.dir}" quiet="false" failonerror="true" />
25	</target>
26
27
28	<target name="testReportNoStructureElement">
29		<au:expectfailure expectedMessage="Group name must be supplied">
30			<jacoco:report/>
31		</au:expectfailure>
32	</target>
33
34	<target name="testReportNoStructureName">
35		<au:expectfailure expectedMessage="Group name must be supplied">
36			<jacoco:report>
37				<structure/>
38			</jacoco:report>
39		</au:expectfailure>
40	</target>
41
42	<target name="testReportNoGroupName">
43		<au:expectfailure expectedMessage="Group name must be supplied">
44			<jacoco:report>
45				<structure name="root">
46					<group/>
47				</structure>
48			</jacoco:report>
49		</au:expectfailure>
50	</target>
51
52	<target name="testReportWithExecutiondataFiles">
53		<jacoco:report>
54			<executiondata>
55				<fileset dir="${basedir}/data" includes="*.exec"/>
56			</executiondata>
57			<structure name="root"/>
58		</jacoco:report>
59	</target>
60
61	<target name="testReportInvalidExecutionDataFile">
62		<property name="doesnotexist.file" location="doesnotexist.exec"/>
63		<au:expectfailure expectedMessage="Unable to read execution data file ${doesnotexist.file}">
64			<jacoco:report>
65				<executiondata>
66					<file file="doesnotexist.exec"/>
67				</executiondata>
68				<structure name="root"/>
69			</jacoco:report>
70		</au:expectfailure>
71	</target>
72
73	<target name="testReportWithSourceButNoDebug">
74		<java classname="org.jacoco.ant.RemoveDebugInfos" classpath="${java.class.path}" failonerror="true">
75			<arg value="${org.jacoco.ant.reportTaskTest.classes.dir}/org/jacoco/ant/TestTarget.class" />
76			<arg value="${temp.dir}/TestTarget.class" />
77		</java>
78		<jacoco:report>
79			<structure name="root">
80				<classfiles>
81					<fileset dir="${temp.dir}" id="*.class" />
82				</classfiles>
83				<sourcefiles encoding="UTF-8">
84					<fileset dir="${org.jacoco.ant.reportTaskTest.sources.dir}" />
85				</sourcefiles>
86			</structure>
87		</jacoco:report>
88		<au:assertLogContains level="warn" text="To enable source code annotation class files for bundle 'root' have to be compiled with debug information"/>
89	</target>
90
91	<target name="testReportWithSourceDirButNoDebug">
92		<java classname="org.jacoco.ant.RemoveDebugInfos" classpath="${java.class.path}" failonerror="true">
93			<arg value="${org.jacoco.ant.reportTaskTest.classes.dir}/org/jacoco/ant/TestTarget.class" />
94			<arg value="${temp.dir}/TestTarget.class" />
95		</java>
96		<jacoco:report>
97			<structure name="root">
98				<classfiles>
99					<fileset dir="${temp.dir}" id="*.class" />
100				</classfiles>
101				<sourcefiles encoding="UTF-8">
102					<dirset file="${org.jacoco.ant.reportTaskTest.sources.dir}" />
103				</sourcefiles>
104			</structure>
105		</jacoco:report>
106		<au:assertLogContains level="warn" text="To enable source code annotation class files for bundle 'root' have to be compiled with debug information"/>
107	</target>
108
109	<target name="testReportWithSourceButNoClasses">
110		<jacoco:report>
111			<structure name="root">
112				<sourcefiles encoding="UTF-8">
113					<fileset dir="${org.jacoco.ant.reportTaskTest.sources.dir}" />
114				</sourcefiles>
115			</structure>
116		</jacoco:report>
117		<au:assertLogDoesntContain level="warn" text="source code annotation"/>
118	</target>
119
120	<target name="testReportWithNoMatch">
121		<property name="nomatch.file" location="${basedir}/data/nomatch.exec"/>
122		<jacoco:report>
123			<executiondata>
124				<file file="${nomatch.file}"/>
125			</executiondata>
126			<structure name="root">
127				<classfiles>
128					<path location="${org.jacoco.ant.reportTaskTest.classes.dir}"/>
129				</classfiles>
130			</structure>
131		</jacoco:report>
132		<au:assertLogContains level="warn" text="Classes in bundle 'root' do not match with execution data."/>
133		<au:assertLogContains level="warn" text="For report generation the same class files must be used as at runtime."/>
134		<au:assertLogContains level="warn" text="Execution data for class org/jacoco/ant/TestTarget does not match."/>
135	</target>
136
137
138	<!-- HTML Output -->
139
140	<target name="testReportHtmlNoDestdirOrDestfile">
141		<au:expectfailure expectedMessage="Destination directory or file must be supplied for html report">
142			<jacoco:report>
143				<structure name="root"/>
144				<html/>
145			</jacoco:report>
146		</au:expectfailure>
147	</target>
148
149	<target name="testReportHtmlBothDestdirAndDestfile">
150		<au:expectfailure expectedMessage="Either destination directory or file must be supplied, not both">
151			<jacoco:report>
152				<structure name="root"/>
153				<html destdir="${temp.dir}" destfile="${temp.dir}/report.zip"/>
154			</jacoco:report>
155		</au:expectfailure>
156	</target>
157
158	<target name="testReportHtmlWithClassFileSet">
159		<jacoco:report>
160			<structure name="Test">
161				<group name="Group">
162					<classfiles>
163						<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
164					</classfiles>
165				</group>
166			</structure>
167			<html destdir="${temp.dir}"/>
168		</jacoco:report>
169
170		<au:assertFileExists file="${temp.dir}/Group/org.jacoco.ant/TestTarget.html"/>
171	</target>
172
173	<target name="testReportHtmlWithPath">
174		<jacoco:report>
175			<structure name="Test">
176				<group name="Group">
177					<classfiles>
178						<path location="${org.jacoco.ant.reportTaskTest.classes.dir}"/>
179					</classfiles>
180				</group>
181			</structure>
182			<html destdir="${temp.dir}"/>
183		</jacoco:report>
184
185		<au:assertFileExists file="${temp.dir}/Group/org.jacoco.ant/TestTarget.html"/>
186	</target>
187
188	<target name="testReportHtmlWithJAR">
189		<property name="testReportHtmlWithJAR.jarfile" location="${temp.dir}/testclasses.jar"/>
190		<jar destfile="${testReportHtmlWithJAR.jarfile}">
191			<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
192		</jar>
193		<jacoco:report>
194			<structure name="Test">
195				<group name="Group">
196					<classfiles>
197						<file file="${testReportHtmlWithJAR.jarfile}"/>
198					</classfiles>
199				</group>
200			</structure>
201			<html destdir="${temp.dir}"/>
202		</jacoco:report>
203
204		<au:assertFileExists file="${temp.dir}/Group/org.jacoco.ant/TestTarget.html"/>
205	</target>
206
207	<target name="testReportHtmlFooter">
208		<jacoco:report>
209			<structure name="Test"/>
210			<html footer="ExampleFooter" destdir="${temp.dir}"/>
211		</jacoco:report>
212
213		<loadfile property="testReportHtmlFooter.content" srcfile="${temp.dir}/index.html" encoding="UTF-8"/>
214		<au:assertTrue message="Footer not included in ${testReportHtmlFooter.content}">
215			<contains string="${testReportHtmlFooter.content}" substring="ExampleFooter"/>
216		</au:assertTrue>
217	</target>
218
219	<target name="testReportHtmlEncoding">
220		<jacoco:report>
221			<structure name="Test"/>
222			<html encoding="UTF-16" destdir="${temp.dir}"/>
223		</jacoco:report>
224
225		<loadfile property="testReportHtmlEncoding.content" srcfile="${temp.dir}/index.html" encoding="UTF-16"/>
226		<au:assertTrue message="Encoding not set in ${testReportHtmlEncoding.content}">
227			<contains string="${testReportHtmlEncoding.content}" substring="encoding=&quot;UTF-16&quot;"/>
228		</au:assertTrue>
229	</target>
230
231	<target name="testReportHtmlDefaultTabWidth">
232		<jacoco:report>
233			<structure name="Test">
234				<classfiles>
235					<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
236				</classfiles>
237				<sourcefiles encoding="UTF-8">
238					<fileset dir="${org.jacoco.ant.reportTaskTest.sources.dir}" />
239				</sourcefiles>
240			</structure>
241			<html destdir="${temp.dir}"/>
242		</jacoco:report>
243
244		<loadfile property="testReportHtmlTabWidth.content" srcfile="${temp.dir}/org.jacoco.ant/TestTarget.java.html"/>
245		<au:assertTrue message="Tab width not set in ${testReportHtmlTabWidth.content}">
246			<contains string="${testReportHtmlTabWidth.content}" substring="window['PR_TAB_WIDTH']=4"/>
247		</au:assertTrue>
248	</target>
249
250	<target name="testReportHtmlTabWidth">
251		<jacoco:report>
252			<structure name="Test">
253				<classfiles>
254					<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
255				</classfiles>
256				<sourcefiles encoding="UTF-8" tabwidth="13">
257					<fileset dir="${org.jacoco.ant.reportTaskTest.sources.dir}" />
258				</sourcefiles>
259			</structure>
260			<html destdir="${temp.dir}"/>
261		</jacoco:report>
262
263		<loadfile property="testReportHtmlTabWidth.content" srcfile="${temp.dir}/org.jacoco.ant/TestTarget.java.html"/>
264		<au:assertTrue message="Tab width not set in ${testReportHtmlTabWidth.content}">
265			<contains string="${testReportHtmlTabWidth.content}" substring="window['PR_TAB_WIDTH']=13"/>
266		</au:assertTrue>
267	</target>
268
269	<target name="testReportHtmlInvalidTabWidth">
270		<au:expectfailure expectedMessage="Tab width must be greater than 0">
271			<jacoco:report>
272				<structure name="Test">
273					<classfiles>
274						<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
275					</classfiles>
276					<sourcefiles encoding="UTF-8" tabwidth="0">
277						<fileset dir="${org.jacoco.ant.reportTaskTest.sources.dir}" />
278					</sourcefiles>
279				</structure>
280				<html destdir="${temp.dir}"/>
281			</jacoco:report>
282		</au:expectfailure>
283	</target>
284
285	<target name="testReportHtmlZipFile">
286		<jacoco:report>
287			<structure name="Test">
288				<classfiles>
289					<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
290				</classfiles>
291			</structure>
292			<html destfile="${temp.dir}/report.zip"/>
293		</jacoco:report>
294
295		<au:assertFileExists file="${temp.dir}/report.zip"/>
296	</target>
297
298	<target name="testReportHtmlWithSources">
299		<jacoco:report>
300			<structure name="Test">
301				<classfiles>
302					<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
303				</classfiles>
304				<sourcefiles encoding="UTF-8">
305					<fileset dir="${org.jacoco.ant.reportTaskTest.sources.dir}" />
306				</sourcefiles>
307			</structure>
308			<html destdir="${temp.dir}"/>
309		</jacoco:report>
310
311		<au:assertFileExists file="${temp.dir}/org.jacoco.ant/TestTarget.java.html"/>
312		<au:assertFileExists file="${temp.dir}/default/TestTargetInDefault.java.html"/>
313	</target>
314
315	<target name="testReportHtmlWithSourcesDir">
316		<jacoco:report>
317			<structure name="Test">
318				<classfiles>
319					<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
320				</classfiles>
321				<sourcefiles encoding="UTF-8">
322					<dirset dir="${org.jacoco.ant.reportTaskTest.sources.dir}/.." includes="src" />
323				</sourcefiles>
324			</structure>
325			<html destdir="${temp.dir}"/>
326		</jacoco:report>
327
328		<au:assertFileExists file="${temp.dir}/org.jacoco.ant/TestTarget.java.html"/>
329		<au:assertFileExists file="${temp.dir}/default/TestTargetInDefault.java.html"/>
330	</target>
331
332	<target name="testReportHtmlWithSourceEncoding">
333		<mkdir dir="${temp.dir}/org/jacoco/ant"/>
334		<echo file="${temp.dir}/org/jacoco/ant/TestTarget.java" encoding="UTF-16">Source Code</echo>
335		<jacoco:report>
336			<structure name="Test">
337				<classfiles>
338					<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
339				</classfiles>
340				<sourcefiles encoding="UTF-16">
341					<fileset dir="${temp.dir}" />
342				</sourcefiles>
343			</structure>
344			<html destdir="${temp.dir}"/>
345		</jacoco:report>
346
347		<loadfile property="testReportHtmlWithSourceEncoding.content" srcfile="${temp.dir}/org.jacoco.ant/TestTarget.java.html" encoding="UTF-8"/>
348		<au:assertTrue message="Report does not contain expected text.">
349			<contains string="${testReportHtmlWithSourceEncoding.content}" substring="Source Code"/>
350		</au:assertTrue>
351	</target>
352
353	<target name="testReportHtmlLocale">
354		<jacoco:report>
355			<structure name="Test">
356				<classfiles>
357					<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
358				</classfiles>
359				<sourcefiles encoding="UTF-8">
360					<fileset dir="${org.jacoco.ant.reportTaskTest.sources.dir}" />
361				</sourcefiles>
362			</structure>
363			<html destdir="${temp.dir}" locale="gr"/>
364		</jacoco:report>
365
366		<loadfile property="testReportHtmlLocale.content" srcfile="${temp.dir}/org.jacoco.ant/TestTarget.java.html" encoding="UTF-8"/>
367		<au:assertTrue message="Report does not contain expected language tag.">
368			<contains string="${testReportHtmlLocale.content}" substring="lang=&quot;gr&quot;"/>
369		</au:assertTrue>
370	</target>
371
372	<!-- CSV Output -->
373
374	<target name="testReportCsvNoDestfile">
375		<au:expectfailure expectedMessage="Destination file must be supplied for csv report">
376			<jacoco:report>
377				<structure name="root"/>
378				<csv/>
379			</jacoco:report>
380		</au:expectfailure>
381	</target>
382
383	<target name="testReportCsvEncoding">
384		<property name="testReportCsvEncoding.destfile" location="${temp.dir}/report.csv"/>
385		<jacoco:report>
386			<structure name="Test"/>
387			<csv encoding="UTF-16" destfile="${testReportCsvEncoding.destfile}"/>
388		</jacoco:report>
389
390		<au:assertFileExists file="${testReportCsvEncoding.destfile}"/>
391		<loadfile property="testReportCsvEncoding.content" srcfile="${testReportCsvEncoding.destfile}" encoding="UTF-16"/>
392		<au:assertTrue message="Encoding not set in ${testReportCsvEncoding.content}">
393			<contains string="${testReportCsvEncoding.content}" substring="METHOD_COVERED"/>
394		</au:assertTrue>
395	</target>
396
397
398	<!-- XML Output -->
399
400	<target name="testReportXmlNoDestfile">
401		<au:expectfailure expectedMessage="Destination file must be supplied for xml report">
402			<jacoco:report>
403				<structure name="root"/>
404				<xml/>
405			</jacoco:report>
406		</au:expectfailure>
407	</target>
408
409	<target name="testReportXmlInvalidDestfile">
410		<au:expectfailure expectedMessage="Error while creating report">
411			<jacoco:report>
412				<structure name="root"/>
413				<xml destfile="${temp.dir}"/>
414			</jacoco:report>
415		</au:expectfailure>
416	</target>
417
418	<target name="testReportXmlEncoding">
419		<property name="testReportXmlEncoding.destfile" location="${temp.dir}/report.xml"/>
420		<jacoco:report>
421			<structure name="Test"/>
422			<xml encoding="UTF-16" destfile="${testReportXmlEncoding.destfile}"/>
423		</jacoco:report>
424
425		<au:assertFileExists file="${testReportXmlEncoding.destfile}"/>
426		<loadfile property="testReportXmlEncoding.content" srcfile="${testReportXmlEncoding.destfile}" encoding="UTF-16"/>
427		<au:assertTrue message="Encoding not set in ${testReportXmlEncoding.content}">
428			<contains string="${testReportXmlEncoding.content}" substring="encoding=&quot;UTF-16&quot;"/>
429		</au:assertTrue>
430	</target>
431
432	<!-- Coverage Check -->
433
434	<target name="testReportCheckOk">
435		<jacoco:report>
436			<structure name="Test">
437				<classfiles>
438					<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
439				</classfiles>
440			</structure>
441			<check>
442				<rule element="CLASS">
443					<limit counter="METHOD" value="MISSEDCOUNT" maximum="100"/>
444				</rule>
445			</check>
446		</jacoco:report>
447	</target>
448
449	<target name="testReportCheckFailed">
450		<au:expectfailure expectedMessage="Coverage check failed due to violated rules.">
451			<jacoco:report>
452				<structure name="Test">
453					<classfiles>
454						<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
455					</classfiles>
456				</structure>
457				<check>
458					<rule element="BUNDLE">
459						<limit counter="INSTRUCTION" value="COVEREDRATIO" minimum="0.90"/>
460					</rule>
461				</check>
462			</jacoco:report>
463		</au:expectfailure>
464		<au:assertLogContains level="error" text="instructions covered ratio is 0.00, but expected minimum is 0.90"/>
465	</target>
466
467	<target name="testReportInvalidConfiguration">
468		<au:expectfailure expectedMessage="Coverage check failed due to violated rules.">
469			<jacoco:report>
470				<structure name="Test">
471					<classfiles>
472						<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
473					</classfiles>
474				</structure>
475				<check>
476					<rule element="BUNDLE">
477						<limit counter="INSTRUCTION" value="COVEREDRATIO" minimum="80"/>
478					</rule>
479				</check>
480			</jacoco:report>
481		</au:expectfailure>
482		<au:assertLogContains level="error" text="given minimum ratio is 80, but must be between 0.0 and 1.0"/>
483	</target>
484
485	<target name="testReportCheckSetPropertyOnly">
486		<jacoco:report>
487			<structure name="Test">
488				<classfiles>
489					<fileset dir="${org.jacoco.ant.reportTaskTest.classes.dir}" includes="**/*.class"/>
490				</classfiles>
491			</structure>
492			<check failonviolation="false" violationsproperty="violation">
493				<rule element="BUNDLE">
494					<limit counter="METHOD" value="COVEREDRATIO" minimum="0.50"/>
495					<limit counter="INSTRUCTION" value="COVEREDRATIO" minimum="0.90"/>
496				</rule>
497			</check>
498		</jacoco:report>
499		<au:assertLogContains level="error" text="methods covered ratio is 0.00, but expected minimum is 0.50"/>
500		<au:assertLogContains level="error" text="instructions covered ratio is 0.00, but expected minimum is 0.90"/>
501		<au:assertTrue message="Property is not set">
502			<contains string="${violation}" substring="methods covered ratio is 0.00, but expected minimum is 0.50"/>
503		</au:assertTrue>
504		<au:assertTrue message="Property is not set">
505			<contains string="${violation}" substring="instructions covered ratio is 0.00, but expected minimum is 0.90"/>
506		</au:assertTrue>
507	</target>
508
509
510</project>
511