fork

Fork of cpputest by Rohit Grover

Committer:
Kojto
Date:
Wed May 13 13:20:35 2015 +0000
Revision:
3:9e8c8907d9ee
Parent:
1:4769360130ed
Rename console to mbed_cpputest_console (as in mbed testrunner)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rohit Grover 1:4769360130ed 1 /*
Rohit Grover 1:4769360130ed 2 * Copyright (c) 2007, Michael Feathers, James Grenning and Bas Vodde
Rohit Grover 1:4769360130ed 3 * All rights reserved.
Rohit Grover 1:4769360130ed 4 *
Rohit Grover 1:4769360130ed 5 * Redistribution and use in source and binary forms, with or without
Rohit Grover 1:4769360130ed 6 * modification, are permitted provided that the following conditions are met:
Rohit Grover 1:4769360130ed 7 * * Redistributions of source code must retain the above copyright
Rohit Grover 1:4769360130ed 8 * notice, this list of conditions and the following disclaimer.
Rohit Grover 1:4769360130ed 9 * * Redistributions in binary form must reproduce the above copyright
Rohit Grover 1:4769360130ed 10 * notice, this list of conditions and the following disclaimer in the
Rohit Grover 1:4769360130ed 11 * documentation and/or other materials provided with the distribution.
Rohit Grover 1:4769360130ed 12 * * Neither the name of the <organization> nor the
Rohit Grover 1:4769360130ed 13 * names of its contributors may be used to endorse or promote products
Rohit Grover 1:4769360130ed 14 * derived from this software without specific prior written permission.
Rohit Grover 1:4769360130ed 15 *
Rohit Grover 1:4769360130ed 16 * THIS SOFTWARE IS PROVIDED BY THE EARLIER MENTIONED AUTHORS ``AS IS'' AND ANY
Rohit Grover 1:4769360130ed 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Rohit Grover 1:4769360130ed 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Rohit Grover 1:4769360130ed 19 * DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
Rohit Grover 1:4769360130ed 20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
Rohit Grover 1:4769360130ed 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
Rohit Grover 1:4769360130ed 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
Rohit Grover 1:4769360130ed 23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Rohit Grover 1:4769360130ed 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Rohit Grover 1:4769360130ed 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Rohit Grover 1:4769360130ed 26 */
Rohit Grover 1:4769360130ed 27
Rohit Grover 1:4769360130ed 28 #include "CppUTest/TestHarness.h"
Rohit Grover 1:4769360130ed 29 #include "CppUTest/JUnitTestOutput.h"
Rohit Grover 1:4769360130ed 30 #include "CppUTest/TestResult.h"
Rohit Grover 1:4769360130ed 31 #include "CppUTest/TestFailure.h"
Rohit Grover 1:4769360130ed 32 #include "CppUTest/PlatformSpecificFunctions.h"
Rohit Grover 1:4769360130ed 33
Rohit Grover 1:4769360130ed 34 struct JUnitTestCaseResultNode
Rohit Grover 1:4769360130ed 35 {
Rohit Grover 1:4769360130ed 36 JUnitTestCaseResultNode() :
Rohit Grover 1:4769360130ed 37 execTime_(0), failure_(0), next_(0)
Rohit Grover 1:4769360130ed 38 {
Rohit Grover 1:4769360130ed 39 }
Rohit Grover 1:4769360130ed 40
Rohit Grover 1:4769360130ed 41 SimpleString name_;
Rohit Grover 1:4769360130ed 42 long execTime_;
Rohit Grover 1:4769360130ed 43 TestFailure* failure_;
Rohit Grover 1:4769360130ed 44 JUnitTestCaseResultNode* next_;
Rohit Grover 1:4769360130ed 45 };
Rohit Grover 1:4769360130ed 46
Rohit Grover 1:4769360130ed 47 struct JUnitTestGroupResult
Rohit Grover 1:4769360130ed 48 {
Rohit Grover 1:4769360130ed 49 JUnitTestGroupResult() :
Rohit Grover 1:4769360130ed 50 testCount_(0), failureCount_(0), startTime_(0), groupExecTime_(0), head_(0), tail_(0)
Rohit Grover 1:4769360130ed 51 {
Rohit Grover 1:4769360130ed 52 }
Rohit Grover 1:4769360130ed 53
Rohit Grover 1:4769360130ed 54 int testCount_;
Rohit Grover 1:4769360130ed 55 int failureCount_;
Rohit Grover 1:4769360130ed 56 long startTime_;
Rohit Grover 1:4769360130ed 57 long groupExecTime_;
Rohit Grover 1:4769360130ed 58 SimpleString group_;
Rohit Grover 1:4769360130ed 59 JUnitTestCaseResultNode* head_;
Rohit Grover 1:4769360130ed 60 JUnitTestCaseResultNode* tail_;
Rohit Grover 1:4769360130ed 61 };
Rohit Grover 1:4769360130ed 62
Rohit Grover 1:4769360130ed 63 struct JUnitTestOutputImpl
Rohit Grover 1:4769360130ed 64 {
Rohit Grover 1:4769360130ed 65 JUnitTestGroupResult results_;
Rohit Grover 1:4769360130ed 66 PlatformSpecificFile file_;
Rohit Grover 1:4769360130ed 67 SimpleString package_;
Rohit Grover 1:4769360130ed 68 };
Rohit Grover 1:4769360130ed 69
Rohit Grover 1:4769360130ed 70 JUnitTestOutput::JUnitTestOutput() :
Rohit Grover 1:4769360130ed 71 impl_(new JUnitTestOutputImpl)
Rohit Grover 1:4769360130ed 72 {
Rohit Grover 1:4769360130ed 73 }
Rohit Grover 1:4769360130ed 74
Rohit Grover 1:4769360130ed 75 JUnitTestOutput::~JUnitTestOutput()
Rohit Grover 1:4769360130ed 76 {
Rohit Grover 1:4769360130ed 77 resetTestGroupResult();
Rohit Grover 1:4769360130ed 78 delete impl_;
Rohit Grover 1:4769360130ed 79 }
Rohit Grover 1:4769360130ed 80
Rohit Grover 1:4769360130ed 81 void JUnitTestOutput::resetTestGroupResult()
Rohit Grover 1:4769360130ed 82 {
Rohit Grover 1:4769360130ed 83 impl_->results_.testCount_ = 0;
Rohit Grover 1:4769360130ed 84 impl_->results_.failureCount_ = 0;
Rohit Grover 1:4769360130ed 85 impl_->results_.group_ = "";
Rohit Grover 1:4769360130ed 86 JUnitTestCaseResultNode* cur = impl_->results_.head_;
Rohit Grover 1:4769360130ed 87 while (cur) {
Rohit Grover 1:4769360130ed 88 JUnitTestCaseResultNode* tmp = cur->next_;
Rohit Grover 1:4769360130ed 89 ;
Rohit Grover 1:4769360130ed 90 delete cur->failure_;
Rohit Grover 1:4769360130ed 91 delete cur;
Rohit Grover 1:4769360130ed 92 cur = tmp;
Rohit Grover 1:4769360130ed 93 }
Rohit Grover 1:4769360130ed 94 impl_->results_.head_ = 0;
Rohit Grover 1:4769360130ed 95 impl_->results_.tail_ = 0;
Rohit Grover 1:4769360130ed 96 }
Rohit Grover 1:4769360130ed 97
Rohit Grover 1:4769360130ed 98 void JUnitTestOutput::printTestsStarted()
Rohit Grover 1:4769360130ed 99 {
Rohit Grover 1:4769360130ed 100 }
Rohit Grover 1:4769360130ed 101
Rohit Grover 1:4769360130ed 102 void JUnitTestOutput::printCurrentGroupStarted(const UtestShell& /*test*/)
Rohit Grover 1:4769360130ed 103 {
Rohit Grover 1:4769360130ed 104 }
Rohit Grover 1:4769360130ed 105
Rohit Grover 1:4769360130ed 106 void JUnitTestOutput::printCurrentTestEnded(const TestResult& result)
Rohit Grover 1:4769360130ed 107 {
Rohit Grover 1:4769360130ed 108 impl_->results_.tail_->execTime_
Rohit Grover 1:4769360130ed 109 = result.getCurrentTestTotalExecutionTime();
Rohit Grover 1:4769360130ed 110 }
Rohit Grover 1:4769360130ed 111
Rohit Grover 1:4769360130ed 112 void JUnitTestOutput::printTestsEnded(const TestResult& /*result*/)
Rohit Grover 1:4769360130ed 113 {
Rohit Grover 1:4769360130ed 114 }
Rohit Grover 1:4769360130ed 115
Rohit Grover 1:4769360130ed 116 void JUnitTestOutput::printCurrentGroupEnded(const TestResult& result)
Rohit Grover 1:4769360130ed 117 {
Rohit Grover 1:4769360130ed 118 impl_->results_.groupExecTime_ = result.getCurrentGroupTotalExecutionTime();
Rohit Grover 1:4769360130ed 119 writeTestGroupToFile();
Rohit Grover 1:4769360130ed 120 resetTestGroupResult();
Rohit Grover 1:4769360130ed 121 }
Rohit Grover 1:4769360130ed 122
Rohit Grover 1:4769360130ed 123 void JUnitTestOutput::printCurrentTestStarted(const UtestShell& test)
Rohit Grover 1:4769360130ed 124 {
Rohit Grover 1:4769360130ed 125 impl_->results_.testCount_++;
Rohit Grover 1:4769360130ed 126 impl_->results_.group_ = test.getGroup();
Rohit Grover 1:4769360130ed 127 impl_->results_.startTime_ = GetPlatformSpecificTimeInMillis();
Rohit Grover 1:4769360130ed 128
Rohit Grover 1:4769360130ed 129 if (impl_->results_.tail_ == 0) {
Rohit Grover 1:4769360130ed 130 impl_->results_.head_ = impl_->results_.tail_
Rohit Grover 1:4769360130ed 131 = new JUnitTestCaseResultNode;
Rohit Grover 1:4769360130ed 132 }
Rohit Grover 1:4769360130ed 133 else {
Rohit Grover 1:4769360130ed 134 impl_->results_.tail_->next_ = new JUnitTestCaseResultNode;
Rohit Grover 1:4769360130ed 135 impl_->results_.tail_ = impl_->results_.tail_->next_;
Rohit Grover 1:4769360130ed 136 }
Rohit Grover 1:4769360130ed 137 impl_->results_.tail_->name_ = test.getName();
Rohit Grover 1:4769360130ed 138 }
Rohit Grover 1:4769360130ed 139
Rohit Grover 1:4769360130ed 140 SimpleString JUnitTestOutput::createFileName(const SimpleString& group)
Rohit Grover 1:4769360130ed 141 {
Rohit Grover 1:4769360130ed 142 SimpleString fileName = "cpputest_";
Rohit Grover 1:4769360130ed 143 fileName += group;
Rohit Grover 1:4769360130ed 144 fileName.replace('/', '_');
Rohit Grover 1:4769360130ed 145 fileName += ".xml";
Rohit Grover 1:4769360130ed 146 return fileName;
Rohit Grover 1:4769360130ed 147 }
Rohit Grover 1:4769360130ed 148
Rohit Grover 1:4769360130ed 149 void JUnitTestOutput::setPackageName(const SimpleString& package)
Rohit Grover 1:4769360130ed 150 {
Rohit Grover 1:4769360130ed 151 if (impl_ != NULL) {
Rohit Grover 1:4769360130ed 152 impl_->package_ = package;
Rohit Grover 1:4769360130ed 153 }
Rohit Grover 1:4769360130ed 154 }
Rohit Grover 1:4769360130ed 155
Rohit Grover 1:4769360130ed 156 void JUnitTestOutput::writeXmlHeader()
Rohit Grover 1:4769360130ed 157 {
Rohit Grover 1:4769360130ed 158 writeToFile("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
Rohit Grover 1:4769360130ed 159 }
Rohit Grover 1:4769360130ed 160
Rohit Grover 1:4769360130ed 161 void JUnitTestOutput::writeTestSuiteSummery()
Rohit Grover 1:4769360130ed 162 {
Rohit Grover 1:4769360130ed 163 SimpleString
Rohit Grover 1:4769360130ed 164 buf =
Rohit Grover 1:4769360130ed 165 StringFromFormat(
Rohit Grover 1:4769360130ed 166 "<testsuite errors=\"0\" failures=\"%d\" hostname=\"localhost\" name=\"%s\" tests=\"%d\" time=\"%d.%03d\" timestamp=\"%s\">\n",
Rohit Grover 1:4769360130ed 167 impl_->results_.failureCount_,
Rohit Grover 1:4769360130ed 168 impl_->results_.group_.asCharString(),
Rohit Grover 1:4769360130ed 169 impl_->results_.testCount_,
Rohit Grover 1:4769360130ed 170 (int) (impl_->results_.groupExecTime_ / 1000), (int) (impl_->results_.groupExecTime_ % 1000),
Rohit Grover 1:4769360130ed 171 GetPlatformSpecificTimeString());
Rohit Grover 1:4769360130ed 172 writeToFile(buf.asCharString());
Rohit Grover 1:4769360130ed 173 }
Rohit Grover 1:4769360130ed 174
Rohit Grover 1:4769360130ed 175 void JUnitTestOutput::writeProperties()
Rohit Grover 1:4769360130ed 176 {
Rohit Grover 1:4769360130ed 177 writeToFile("<properties>\n");
Rohit Grover 1:4769360130ed 178 writeToFile("</properties>\n");
Rohit Grover 1:4769360130ed 179 }
Rohit Grover 1:4769360130ed 180
Rohit Grover 1:4769360130ed 181 void JUnitTestOutput::writeTestCases()
Rohit Grover 1:4769360130ed 182 {
Rohit Grover 1:4769360130ed 183 JUnitTestCaseResultNode* cur = impl_->results_.head_;
Rohit Grover 1:4769360130ed 184 while (cur) {
Rohit Grover 1:4769360130ed 185 SimpleString buf = StringFromFormat(
Rohit Grover 1:4769360130ed 186 "<testcase classname=\"%s%s%s\" name=\"%s\" time=\"%d.%03d\">\n",
Rohit Grover 1:4769360130ed 187 impl_->package_.asCharString(),
Rohit Grover 1:4769360130ed 188 impl_->package_.isEmpty() == true ? "" : ".",
Rohit Grover 1:4769360130ed 189 impl_->results_.group_.asCharString(),
Rohit Grover 1:4769360130ed 190 cur->name_.asCharString(), (int) (cur->execTime_ / 1000), (int)(cur->execTime_ % 1000));
Rohit Grover 1:4769360130ed 191 writeToFile(buf.asCharString());
Rohit Grover 1:4769360130ed 192
Rohit Grover 1:4769360130ed 193 if (cur->failure_) {
Rohit Grover 1:4769360130ed 194 writeFailure(cur);
Rohit Grover 1:4769360130ed 195 }
Rohit Grover 1:4769360130ed 196 writeToFile("</testcase>\n");
Rohit Grover 1:4769360130ed 197 cur = cur->next_;
Rohit Grover 1:4769360130ed 198 }
Rohit Grover 1:4769360130ed 199 }
Rohit Grover 1:4769360130ed 200
Rohit Grover 1:4769360130ed 201 void JUnitTestOutput::writeFailure(JUnitTestCaseResultNode* node)
Rohit Grover 1:4769360130ed 202 {
Rohit Grover 1:4769360130ed 203 SimpleString message = node->failure_->getMessage().asCharString();
Rohit Grover 1:4769360130ed 204 message.replace('"', '\'');
Rohit Grover 1:4769360130ed 205 message.replace('<', '[');
Rohit Grover 1:4769360130ed 206 message.replace('>', ']');
Rohit Grover 1:4769360130ed 207 message.replace("&", "&amp;");
Rohit Grover 1:4769360130ed 208 message.replace("\n", "{newline}");
Rohit Grover 1:4769360130ed 209 SimpleString buf = StringFromFormat(
Rohit Grover 1:4769360130ed 210 "<failure message=\"%s:%d: %s\" type=\"AssertionFailedError\">\n",
Rohit Grover 1:4769360130ed 211 node->failure_->getFileName().asCharString(),
Rohit Grover 1:4769360130ed 212 node->failure_->getFailureLineNumber(), message.asCharString());
Rohit Grover 1:4769360130ed 213 writeToFile(buf.asCharString());
Rohit Grover 1:4769360130ed 214 writeToFile("</failure>\n");
Rohit Grover 1:4769360130ed 215 }
Rohit Grover 1:4769360130ed 216
Rohit Grover 1:4769360130ed 217 void JUnitTestOutput::writeFileEnding()
Rohit Grover 1:4769360130ed 218 {
Rohit Grover 1:4769360130ed 219 writeToFile("<system-out></system-out>\n");
Rohit Grover 1:4769360130ed 220 writeToFile("<system-err></system-err>\n");
Rohit Grover 1:4769360130ed 221 writeToFile("</testsuite>");
Rohit Grover 1:4769360130ed 222 }
Rohit Grover 1:4769360130ed 223
Rohit Grover 1:4769360130ed 224 void JUnitTestOutput::writeTestGroupToFile()
Rohit Grover 1:4769360130ed 225 {
Rohit Grover 1:4769360130ed 226 openFileForWrite(createFileName(impl_->results_.group_));
Rohit Grover 1:4769360130ed 227 writeXmlHeader();
Rohit Grover 1:4769360130ed 228 writeTestSuiteSummery();
Rohit Grover 1:4769360130ed 229 writeProperties();
Rohit Grover 1:4769360130ed 230 writeTestCases();
Rohit Grover 1:4769360130ed 231 writeFileEnding();
Rohit Grover 1:4769360130ed 232 closeFile();
Rohit Grover 1:4769360130ed 233 }
Rohit Grover 1:4769360130ed 234
Rohit Grover 1:4769360130ed 235 void JUnitTestOutput::verbose()
Rohit Grover 1:4769360130ed 236 {
Rohit Grover 1:4769360130ed 237 }
Rohit Grover 1:4769360130ed 238
Rohit Grover 1:4769360130ed 239 void JUnitTestOutput::printBuffer(const char*)
Rohit Grover 1:4769360130ed 240 {
Rohit Grover 1:4769360130ed 241 }
Rohit Grover 1:4769360130ed 242
Rohit Grover 1:4769360130ed 243 void JUnitTestOutput::print(const char*)
Rohit Grover 1:4769360130ed 244 {
Rohit Grover 1:4769360130ed 245 }
Rohit Grover 1:4769360130ed 246
Rohit Grover 1:4769360130ed 247 void JUnitTestOutput::print(long)
Rohit Grover 1:4769360130ed 248 {
Rohit Grover 1:4769360130ed 249 }
Rohit Grover 1:4769360130ed 250
Rohit Grover 1:4769360130ed 251 void JUnitTestOutput::print(const TestFailure& failure)
Rohit Grover 1:4769360130ed 252 {
Rohit Grover 1:4769360130ed 253 if (impl_->results_.tail_->failure_ == 0) {
Rohit Grover 1:4769360130ed 254 impl_->results_.failureCount_++;
Rohit Grover 1:4769360130ed 255 impl_->results_.tail_->failure_ = new TestFailure(failure);
Rohit Grover 1:4769360130ed 256 }
Rohit Grover 1:4769360130ed 257 }
Rohit Grover 1:4769360130ed 258
Rohit Grover 1:4769360130ed 259 void JUnitTestOutput::printTestRun(int /*number*/, int /*total*/)
Rohit Grover 1:4769360130ed 260 {
Rohit Grover 1:4769360130ed 261 }
Rohit Grover 1:4769360130ed 262
Rohit Grover 1:4769360130ed 263 void JUnitTestOutput::flush()
Rohit Grover 1:4769360130ed 264 {
Rohit Grover 1:4769360130ed 265 }
Rohit Grover 1:4769360130ed 266
Rohit Grover 1:4769360130ed 267 void JUnitTestOutput::openFileForWrite(const SimpleString& fileName)
Rohit Grover 1:4769360130ed 268 {
Rohit Grover 1:4769360130ed 269 impl_->file_ = PlatformSpecificFOpen(fileName.asCharString(), "w");
Rohit Grover 1:4769360130ed 270 }
Rohit Grover 1:4769360130ed 271
Rohit Grover 1:4769360130ed 272 void JUnitTestOutput::writeToFile(const SimpleString& buffer)
Rohit Grover 1:4769360130ed 273 {
Rohit Grover 1:4769360130ed 274 PlatformSpecificFPuts(buffer.asCharString(), impl_->file_);
Rohit Grover 1:4769360130ed 275 }
Rohit Grover 1:4769360130ed 276
Rohit Grover 1:4769360130ed 277 void JUnitTestOutput::closeFile()
Rohit Grover 1:4769360130ed 278 {
Rohit Grover 1:4769360130ed 279 PlatformSpecificFClose(impl_->file_);
Rohit Grover 1:4769360130ed 280 }