#!/bin/bash

# sum2xml.sh -- convert a .sum file into XML.
#
# Copyright (C) 2016,2019, 2020 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=$(echo $1 | sed -e 's/.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

exit

# If compressed, uncompress it
type=$(file "$infile")
count=$(echo "$type" | grep -c "XZ compressed data")
if test "$count" -gt 0; then
  decomp="xz -d"
  comp="xz"
else
  count=$(echo "$type" | grep -c "XZ compressed data")
  if test "$count" -gt 0; then
    decomp="gzip"
    comp="gunzip"
  fi
fi

#
cat <<EOF > "$outfile"
<?xml version="1.0"?>
<!DOCTYPE testsuite [
<!-- testsuite.dtd -->
<!ELEMENT testsuite (test | summary)+>
<!ELEMENT test (input, output, result, name, prms_id )>
  <!ELEMENT input              (#PCDATA)>
  <!ELEMENT output             (#PCDATA)>
  <!ELEMENT result             (#PCDATA)>
  <!ELEMENT name               (#PCDATA)>
  <!ELEMENT prms_id            (#PCDATA)>
  <!ELEMENT summary     (result, description, total)>
  <!ELEMENT description        (#PCDATA)>
  <!ELEMENT total              (#PCDATA)>
]>
EOF

# Write the opening tag for the test results
echo "<testsuite>" >> "$outfile"

${decomp} "$infile"
infile=$(echo "$infile" | sed -e 's:\.xz::' -e 's:\.gz::')

while read -r line
do
  # ignore blank lines
    if test x"${line}" = x; then
	continue
    fi
  # # ignore the test case name
  # if test `echo ${line} | grep -c Running` -gt 0; then
  #   continue
  # fi
  # ignore the summary, we get this via SQL later
    if test "$(echo "$line" | grep -c Summary)" -gt 0; then
	break
    fi
    valid=$(echo "$line" | grep -E -c 'PASS|FAIL|UNTESTED|UNSUPPORTED|UNRESOLVED')
    if test "$valid" -eq 0; then
	continue
    fi
    echo -n "."
    { echo "<test>"; echo "  <input></input>"; echo "  <output></output>"; } >> "$outfile"
    result=${line/: *//}
    echo "  <result>${result}</result>" >> "$outfile"
    name=${line/^[A-Z]*: /}
    { echo "  <name>${name}</name>"; echo "  <prms_id></prms_id>"; echo "</test>"; } >> "$outfile"
done < "$infile"

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

# compress the file again
${comp} "$infile"

