FRDM K64F Metronome

Committer:
ram54288
Date:
Sun May 14 18:37:05 2017 +0000
Revision:
0:dbad57390bd1
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ram54288 0:dbad57390bd1 1 #============================================================
ram54288 0:dbad57390bd1 2 # Author: John Theofanopoulos
ram54288 0:dbad57390bd1 3 # A simple parser. Takes the output files generated during the build process and
ram54288 0:dbad57390bd1 4 # extracts information relating to the tests.
ram54288 0:dbad57390bd1 5 #
ram54288 0:dbad57390bd1 6 # Notes:
ram54288 0:dbad57390bd1 7 # To capture an output file under VS builds use the following:
ram54288 0:dbad57390bd1 8 # devenv [build instructions] > Output.txt & type Output.txt
ram54288 0:dbad57390bd1 9 #
ram54288 0:dbad57390bd1 10 # To capture an output file under GCC/Linux builds use the following:
ram54288 0:dbad57390bd1 11 # make | tee Output.txt
ram54288 0:dbad57390bd1 12 #
ram54288 0:dbad57390bd1 13 # To use this parser use the following command
ram54288 0:dbad57390bd1 14 # ruby parseOutput.rb [options] [file]
ram54288 0:dbad57390bd1 15 # options: -xml : produce a JUnit compatible XML file
ram54288 0:dbad57390bd1 16 # file : file to scan for results
ram54288 0:dbad57390bd1 17 #============================================================
ram54288 0:dbad57390bd1 18
ram54288 0:dbad57390bd1 19
ram54288 0:dbad57390bd1 20 class ParseOutput
ram54288 0:dbad57390bd1 21 # The following flag is set to true when a test is found or false otherwise.
ram54288 0:dbad57390bd1 22 @testFlag
ram54288 0:dbad57390bd1 23 @xmlOut
ram54288 0:dbad57390bd1 24 @arrayList
ram54288 0:dbad57390bd1 25 @totalTests
ram54288 0:dbad57390bd1 26 @classIndex
ram54288 0:dbad57390bd1 27
ram54288 0:dbad57390bd1 28 # Set the flag to indicate if there will be an XML output file or not
ram54288 0:dbad57390bd1 29 def setXmlOutput()
ram54288 0:dbad57390bd1 30 @xmlOut = true
ram54288 0:dbad57390bd1 31 end
ram54288 0:dbad57390bd1 32
ram54288 0:dbad57390bd1 33 # if write our output to XML
ram54288 0:dbad57390bd1 34 def writeXmlOuput()
ram54288 0:dbad57390bd1 35 output = File.open("report.xml", "w")
ram54288 0:dbad57390bd1 36 output << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
ram54288 0:dbad57390bd1 37 @arrayList.each do |item|
ram54288 0:dbad57390bd1 38 output << item << "\n"
ram54288 0:dbad57390bd1 39 end
ram54288 0:dbad57390bd1 40 output << "</testsuite>\n"
ram54288 0:dbad57390bd1 41 end
ram54288 0:dbad57390bd1 42
ram54288 0:dbad57390bd1 43 # This function will try and determine when the suite is changed. This is
ram54288 0:dbad57390bd1 44 # is the name that gets added to the classname parameter.
ram54288 0:dbad57390bd1 45 def testSuiteVerify(testSuiteName)
ram54288 0:dbad57390bd1 46 if @testFlag == false
ram54288 0:dbad57390bd1 47 @testFlag = true;
ram54288 0:dbad57390bd1 48 # Split the path name
ram54288 0:dbad57390bd1 49 testName = testSuiteName.split("/")
ram54288 0:dbad57390bd1 50 # Remove the extension
ram54288 0:dbad57390bd1 51 baseName = testName[testName.size - 1].split(".")
ram54288 0:dbad57390bd1 52 @testSuite = "test." + baseName[0]
ram54288 0:dbad57390bd1 53 printf "New Test: %s\n", @testSuite
ram54288 0:dbad57390bd1 54 end
ram54288 0:dbad57390bd1 55 end
ram54288 0:dbad57390bd1 56
ram54288 0:dbad57390bd1 57
ram54288 0:dbad57390bd1 58 # Test was flagged as having passed so format the output
ram54288 0:dbad57390bd1 59 def testPassed(array)
ram54288 0:dbad57390bd1 60 lastItem = array.length - 1
ram54288 0:dbad57390bd1 61 testName = array[lastItem - 1]
ram54288 0:dbad57390bd1 62 testSuiteVerify(array[@className])
ram54288 0:dbad57390bd1 63 printf "%-40s PASS\n", testName
ram54288 0:dbad57390bd1 64 if @xmlOut == true
ram54288 0:dbad57390bd1 65 @arrayList.push " <testcase classname=\"" + @testSuite + "\" name=\"" + testName + "\"/>"
ram54288 0:dbad57390bd1 66 end
ram54288 0:dbad57390bd1 67 end
ram54288 0:dbad57390bd1 68
ram54288 0:dbad57390bd1 69 # Test was flagged as being ingored so format the output
ram54288 0:dbad57390bd1 70 def testIgnored(array)
ram54288 0:dbad57390bd1 71 lastItem = array.length - 1
ram54288 0:dbad57390bd1 72 testName = array[lastItem - 2]
ram54288 0:dbad57390bd1 73 reason = array[lastItem].chomp
ram54288 0:dbad57390bd1 74 testSuiteVerify(array[@className])
ram54288 0:dbad57390bd1 75 printf "%-40s IGNORED\n", testName
ram54288 0:dbad57390bd1 76 if @xmlOut == true
ram54288 0:dbad57390bd1 77 @arrayList.push " <testcase classname=\"" + @testSuite + "\" name=\"" + testName + "\">"
ram54288 0:dbad57390bd1 78 @arrayList.push " <skipped type=\"TEST IGNORED\"> " + reason + " </skipped>"
ram54288 0:dbad57390bd1 79 @arrayList.push " </testcase>"
ram54288 0:dbad57390bd1 80 end
ram54288 0:dbad57390bd1 81 end
ram54288 0:dbad57390bd1 82
ram54288 0:dbad57390bd1 83 # Test was flagged as having failed so format the line
ram54288 0:dbad57390bd1 84 def testFailed(array)
ram54288 0:dbad57390bd1 85 lastItem = array.length - 1
ram54288 0:dbad57390bd1 86 testName = array[lastItem - 2]
ram54288 0:dbad57390bd1 87 reason = array[lastItem].chomp + " at line: " + array[lastItem - 3]
ram54288 0:dbad57390bd1 88 testSuiteVerify(array[@className])
ram54288 0:dbad57390bd1 89 printf "%-40s FAILED\n", testName
ram54288 0:dbad57390bd1 90 if @xmlOut == true
ram54288 0:dbad57390bd1 91 @arrayList.push " <testcase classname=\"" + @testSuite + "\" name=\"" + testName + "\">"
ram54288 0:dbad57390bd1 92 @arrayList.push " <failure type=\"ASSERT FAILED\"> " + reason + " </failure>"
ram54288 0:dbad57390bd1 93 @arrayList.push " </testcase>"
ram54288 0:dbad57390bd1 94 end
ram54288 0:dbad57390bd1 95 end
ram54288 0:dbad57390bd1 96
ram54288 0:dbad57390bd1 97
ram54288 0:dbad57390bd1 98 # Figure out what OS we are running on. For now we are assuming if it's not Windows it must
ram54288 0:dbad57390bd1 99 # be Unix based.
ram54288 0:dbad57390bd1 100 def detectOS()
ram54288 0:dbad57390bd1 101 myOS = RUBY_PLATFORM.split("-")
ram54288 0:dbad57390bd1 102 if myOS.size == 2
ram54288 0:dbad57390bd1 103 if myOS[1] == "mingw32"
ram54288 0:dbad57390bd1 104 @className = 1
ram54288 0:dbad57390bd1 105 else
ram54288 0:dbad57390bd1 106 @className = 0
ram54288 0:dbad57390bd1 107 end
ram54288 0:dbad57390bd1 108 else
ram54288 0:dbad57390bd1 109 @className = 0
ram54288 0:dbad57390bd1 110 end
ram54288 0:dbad57390bd1 111
ram54288 0:dbad57390bd1 112 end
ram54288 0:dbad57390bd1 113
ram54288 0:dbad57390bd1 114 # Main function used to parse the file that was captured.
ram54288 0:dbad57390bd1 115 def process(name)
ram54288 0:dbad57390bd1 116 @testFlag = false
ram54288 0:dbad57390bd1 117 @arrayList = Array.new
ram54288 0:dbad57390bd1 118
ram54288 0:dbad57390bd1 119 detectOS()
ram54288 0:dbad57390bd1 120
ram54288 0:dbad57390bd1 121 puts "Parsing file: " + name
ram54288 0:dbad57390bd1 122
ram54288 0:dbad57390bd1 123
ram54288 0:dbad57390bd1 124 testPass = 0
ram54288 0:dbad57390bd1 125 testFail = 0
ram54288 0:dbad57390bd1 126 testIgnore = 0
ram54288 0:dbad57390bd1 127 puts ""
ram54288 0:dbad57390bd1 128 puts "=================== RESULTS ====================="
ram54288 0:dbad57390bd1 129 puts ""
ram54288 0:dbad57390bd1 130 File.open(name).each do |line|
ram54288 0:dbad57390bd1 131 # Typical test lines look like this:
ram54288 0:dbad57390bd1 132 # <path>/<test_file>.c:36:test_tc1000_opsys:FAIL: Expected 1 Was 0
ram54288 0:dbad57390bd1 133 # <path>/<test_file>.c:112:test_tc5004_initCanChannel:IGNORE: Not Yet Implemented
ram54288 0:dbad57390bd1 134 # <path>/<test_file>.c:115:test_tc5100_initCanVoidPtrs:PASS
ram54288 0:dbad57390bd1 135 #
ram54288 0:dbad57390bd1 136 # where path is different on Unix vs Windows devices (Windows leads with a drive letter)
ram54288 0:dbad57390bd1 137 lineArray = line.split(":")
ram54288 0:dbad57390bd1 138 lineSize = lineArray.size
ram54288 0:dbad57390bd1 139 # If we were able to split the line then we can look to see if any of our target words
ram54288 0:dbad57390bd1 140 # were found. Case is important.
ram54288 0:dbad57390bd1 141 if lineSize >= 4
ram54288 0:dbad57390bd1 142 # Determine if this test passed
ram54288 0:dbad57390bd1 143 if line.include? ":PASS"
ram54288 0:dbad57390bd1 144 testPassed(lineArray)
ram54288 0:dbad57390bd1 145 testPass += 1
ram54288 0:dbad57390bd1 146 elsif line.include? ":FAIL:"
ram54288 0:dbad57390bd1 147 testFailed(lineArray)
ram54288 0:dbad57390bd1 148 testFail += 1
ram54288 0:dbad57390bd1 149 elsif line.include? ":IGNORE:"
ram54288 0:dbad57390bd1 150 testIgnored(lineArray)
ram54288 0:dbad57390bd1 151 testIgnore += 1
ram54288 0:dbad57390bd1 152 # If none of the keywords are found there are no more tests for this suite so clear
ram54288 0:dbad57390bd1 153 # the test flag
ram54288 0:dbad57390bd1 154 else
ram54288 0:dbad57390bd1 155 @testFlag = false
ram54288 0:dbad57390bd1 156 end
ram54288 0:dbad57390bd1 157 else
ram54288 0:dbad57390bd1 158 @testFlag = false
ram54288 0:dbad57390bd1 159 end
ram54288 0:dbad57390bd1 160 end
ram54288 0:dbad57390bd1 161 puts ""
ram54288 0:dbad57390bd1 162 puts "=================== SUMMARY ====================="
ram54288 0:dbad57390bd1 163 puts ""
ram54288 0:dbad57390bd1 164 puts "Tests Passed : " + testPass.to_s
ram54288 0:dbad57390bd1 165 puts "Tests Failed : " + testFail.to_s
ram54288 0:dbad57390bd1 166 puts "Tests Ignored : " + testIgnore.to_s
ram54288 0:dbad57390bd1 167 @totalTests = testPass + testFail + testIgnore
ram54288 0:dbad57390bd1 168 if @xmlOut == true
ram54288 0:dbad57390bd1 169 heading = "<testsuite tests=\"" + @totalTests.to_s + "\" failures=\"" + testFail.to_s + "\"" + " skips=\"" + testIgnore.to_s + "\">"
ram54288 0:dbad57390bd1 170 @arrayList.insert(0, heading)
ram54288 0:dbad57390bd1 171 writeXmlOuput()
ram54288 0:dbad57390bd1 172 end
ram54288 0:dbad57390bd1 173
ram54288 0:dbad57390bd1 174 # return result
ram54288 0:dbad57390bd1 175 end
ram54288 0:dbad57390bd1 176
ram54288 0:dbad57390bd1 177 end
ram54288 0:dbad57390bd1 178
ram54288 0:dbad57390bd1 179 # If the command line has no values in, used a default value of Output.txt
ram54288 0:dbad57390bd1 180 parseMyFile = ParseOutput.new
ram54288 0:dbad57390bd1 181
ram54288 0:dbad57390bd1 182 if ARGV.size >= 1
ram54288 0:dbad57390bd1 183 ARGV.each do |a|
ram54288 0:dbad57390bd1 184 if a == "-xml"
ram54288 0:dbad57390bd1 185 parseMyFile.setXmlOutput();
ram54288 0:dbad57390bd1 186 else
ram54288 0:dbad57390bd1 187 parseMyFile.process(a)
ram54288 0:dbad57390bd1 188 break
ram54288 0:dbad57390bd1 189 end
ram54288 0:dbad57390bd1 190 end
ram54288 0:dbad57390bd1 191 end