1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 * use this file except in compliance with the License. You may obtain a copy of 6 * the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 17 #include "Log.h" 18 #include "Settings.h" 19 #include "StringUtil.h" 20 #include "Report.h" 21 #include "task/TaskCase.h" 22 23 24 Report* Report::mInstance = NULL; 25 26 Report* Report::Instance(const char* dirName) 27 { 28 if (mInstance == NULL) { 29 mInstance = new Report(); 30 ASSERT(mInstance->init(dirName)); 31 } 32 return mInstance; 33 } 34 void Report::Finalize() 35 { 36 delete mInstance; 37 mInstance = NULL; 38 } 39 40 41 Report::Report() 42 { 43 44 } 45 46 Report::~Report() 47 { 48 writeReport(); 49 mFailedCases.clear(); 50 mPassedCases.clear(); 51 } 52 53 bool Report::init(const char* dirName) 54 { 55 if (dirName == NULL) { 56 return true; 57 } 58 android::String8 report; 59 if (report.appendFormat("%s/report.xml", dirName) != 0) { 60 return false; 61 } 62 Settings::Instance()->addSetting(Settings::EREPORT_FILE, report); 63 return FileUtil::init(report.string()); 64 } 65 66 void Report::printf(const char* fmt, ...) 67 { 68 va_list ap; 69 va_start(ap, fmt); 70 FileUtil::doVprintf(false, -1, fmt, ap); 71 va_end(ap); 72 } 73 74 void Report::addCasePassed(const TaskCase* task) 75 { 76 android::String8 name(" "); 77 task->getCaseName(name); 78 StringPair pair(name, task->getDetails()); 79 mPassedCases.push_back(pair); 80 } 81 82 void Report::addCaseFailed(const TaskCase* task) 83 { 84 android::String8 name(" "); 85 task->getCaseName(name); 86 StringPair pair(name, task->getDetails()); 87 mFailedCases.push_back(pair); 88 } 89 90 void Report::writeResult(std::list<StringPair>::const_iterator begin, 91 std::list<StringPair>::const_iterator end, bool passed) 92 { 93 std::list<StringPair>::const_iterator it; 94 for (it = begin; it != end; it++) { 95 if (passed) { 96 printf(" <test title=\"%s\" result=\"pass\" >", it->first.string()); 97 } else { 98 printf(" <test title=\"%s\" result=\"fail\" >", it->first.string()); 99 } 100 printf(" <details>\n%s", it->second.string()); 101 printf(" </details>"); 102 printf(" </test>"); 103 } 104 } 105 106 void Report::writeReport() 107 { 108 printf("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"); 109 printf("<audio-test-results-report report-version=\"1\" creation-time=\"%s\">", 110 Settings::Instance()->getSetting(Settings::EREPORT_TIME).string()); 111 printf(" <verifier-info version-name=\"1\" version-code=\"1\" />"); 112 printf(" <device-info>"); 113 printf(" %s", Settings::Instance()->getSetting(Settings::EDEVICE_INFO).string()); 114 printf(" </device-info>"); 115 printf(" <audio-test-results xml=\"%s\">", 116 Settings::Instance()->getSetting(Settings::ETEST_XML).string()); 117 118 writeResult(mFailedCases.begin(), mFailedCases.end(), false); 119 writeResult(mPassedCases.begin(), mPassedCases.end(), true); 120 121 printf(" </audio-test-results>"); 122 printf("</audio-test-results-report>"); 123 } 124