aboutsummaryrefslogtreecommitdiff
path: root/contrib/sum2junit.sh
blob: 7d3b0a48e688317ab9c73012937c95bd93745215 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/bin/bash

# sum2junit.sh -- convert a .sum file into Junit-compatible XML.
#
# Copyright (C) 2016 Free Software Foundation, Inc.
#
# This file is part of DejaGnu.
#
# DejaGnu is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.

if test x"$1" = x; then
  outfile="/tmp/testrun.xml"
  infile="/tmp/testrun.sum"
else
  outfile=${1//\.sum.*/.xml}
  infile=$1
fi

# Where to put the output file
if test x"$2" = x; then
  outfile=${outfile}
else
  outfile="/tmp/${outfile}"
fi

if test ! -e "$infile"; then
  echo "ERROR: no input file specified"
  exit
fi

tool=$(grep "tests ===" "$infile" | tr -s ' ' | cut -d ' ' -f 2)

# Get the counts for tests that didn't work properly
skipped=$(grep -E -c '^UNRESOLVED|^UNTESTED|^UNSUPPORTED' "$infile")
if test x"${skipped}" = x; then
    skipped=0
fi

# The total of successful results are PASS and XFAIL
passes=$(grep -E -c '^PASS|XFAIL' "$infile")
if test x"${passes}" = x; then
    passes=0
fi

# The total of failed results are FAIL and XPASS
failures=$(grep -E -c '^XFAIL|XPASS' "$infile")
if test x"${failures}" = x; then
    failures=0
fi

# Calculate the total number of test cases
total=$((passes + failures))
total=$((total + skipped))

cat <<EOF > "$outfile"
<?xml version="1.0"?>

<testsuites>
<testsuite name="DejaGnu" tests="${total}" failures="${failures}" skipped="${skipped}">

EOF

# Reduce the size of the file to be parsed to improve performance. Junit
# ignores sucessful test results, so we only grab the failures and test
# case problem results.
tmpfile="${infile}.tmp"
rm -f "$tmpfile"
grep -E 'XPASS|FAIL|UNTESTED|UNSUPPORTED|UNRESOLVED' "$infile" > "$tmpfile"

while read -r line
do
    echo -n "."
    result=$(echo "$line" | cut -d ' ' -f 1 | tr -d ':')
    name=$(echo "$line" | cut -d ' ' -f 2)
    message=$(echo "$line" | cut -d ' ' -f 3-50 | tr -d '\"><;:\[\]^\\&?@')

    echo "    <testcase name=\"${name}\" classname=\"${tool}-${result}\">" >> "$outfile"
    case "${result}" in
	UNSUPPORTED|UNTESTED|UNRESOLVED)
	    if test x"${message}" != x; then
		echo -n "        <skipped message=\"${message}" >> "$outfile"
	    else
		echo -n "        <skipped type=\"$result" >> "$outfile"
	    fi
	    ;;
	XPASS|XFAIL)
	    echo -n "        <failure message=\"$message" >> "$outfile"
	    ;;
	*)
	    echo -n "        <failure message=\"$message" >> "$outfile"
    esac
    echo "\"/>" >> "$outfile"

    echo "    </testcase>" >> "$outfile"
done < "$tmpfile"
rm -f "$tmpfile"

# Write the closing tag for the test results
echo "</testsuite>" >> "$outfile"
echo "</testsuites>" >> "$outfile"