Home | History | Annotate | Download | only in task
      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 <sys/stat.h>
     18 #include <sys/types.h>
     19 #include <errno.h>
     20 
     21 #include <UniquePtr.h>
     22 
     23 #include "Log.h"
     24 #include "FileUtil.h"
     25 #include "Report.h"
     26 #include "StringUtil.h"
     27 #include "task/TaskCase.h"
     28 #include "task/TaskGeneric.h"
     29 #include "task/TaskSave.h"
     30 
     31 static const android::String8 STR_FILE("file");
     32 static const android::String8 STR_REPORT("report");
     33 
     34 TaskSave::TaskSave()
     35     : TaskGeneric(TaskGeneric::ETaskSave)
     36 {
     37     const android::String8* list[] = {&STR_FILE, &STR_REPORT, NULL};
     38     registerSupportedStringAttributes(list);
     39 }
     40 
     41 TaskSave::~TaskSave()
     42 {
     43 
     44 }
     45 
     46 bool TaskSave::handleFile()
     47 {
     48     android::String8 fileValue;
     49     if (!findStringAttribute(STR_FILE, fileValue)) {
     50         LOGI("no saving to file");
     51         return true; // true as there is no need to save
     52     }
     53 
     54     UniquePtr<std::vector<android::String8> > list(StringUtil::split(fileValue, ','));
     55     std::vector<android::String8>* listp = list.get();
     56     if (listp == NULL) {
     57         LOGE("alloc failed");
     58         return false;
     59     }
     60 
     61     android::String8 dirName;
     62     if (!FileUtil::prepare(dirName)) {
     63         LOGE("cannot prepare report dir");
     64         return false;
     65     }
     66     android::String8 caseName;
     67     if (!getTestCase()->getCaseName(caseName)) {
     68         return false;
     69     }
     70     dirName.appendPath(caseName);
     71     int result = mkdir(dirName.string(), S_IRWXU);
     72     if ((result == -1) && (errno != EEXIST)) {
     73         LOGE("mkdir of save dir %s failed, error %d", dirName.string(), errno);
     74         return false;
     75     }
     76 
     77     for (size_t i = 0; i < listp->size(); i++) {
     78         UniquePtr<std::list<TaskCase::BufferPair> > buffers(
     79                 getTestCase()->findAllBuffers((*listp)[i]));
     80         std::list<TaskCase::BufferPair>* buffersp = buffers.get();
     81         if (buffersp == NULL) {
     82             LOGE("no buffer for given pattern %s", ((*listp)[i]).string());
     83             return false;
     84         }
     85         std::list<TaskCase::BufferPair>::iterator it = buffersp->begin();
     86         std::list<TaskCase::BufferPair>::iterator end = buffersp->end();
     87         for (; it != end; it++) {
     88             android::String8 fileName(dirName);
     89             fileName.appendPath(it->first);
     90             if (!it->second->saveToFile(fileName)) {
     91                 LOGE("save failed");
     92                 return false;
     93             }
     94         }
     95     }
     96     return true;
     97 }
     98 
     99 bool TaskSave::handleReport()
    100 {
    101     android::String8 reportValue;
    102     if (!findStringAttribute(STR_REPORT, reportValue)) {
    103         LOGI("no saving to report");
    104         return true; // true as there is no need to save
    105     }
    106 
    107     UniquePtr<std::vector<android::String8> > list(StringUtil::split(reportValue, ','));
    108     std::vector<android::String8>* listp = list.get();
    109     if (listp == NULL) {
    110         LOGE("alloc failed");
    111         return false;
    112     }
    113     MSG("=== Values stored ===");
    114     android::String8 details;
    115     for (size_t i = 0; i < listp->size(); i++) {
    116         UniquePtr<std::list<TaskCase::ValuePair> > values(
    117                 getTestCase()->findAllValues((*listp)[i]));
    118         std::list<TaskCase::ValuePair>* valuesp = values.get();
    119         if (valuesp == NULL) {
    120             LOGE("no value for given pattern %s", ((*listp)[i]).string());
    121             return false;
    122         }
    123         std::list<TaskCase::ValuePair>::iterator it = values->begin();
    124         std::list<TaskCase::ValuePair>::iterator end = values->end();
    125 
    126         for (; it != end; it++) {
    127             if (it->second.getType() == TaskCase::Value::ETypeDouble) {
    128                 details.appendFormat("   %s: %f\n", it->first.string(), it->second.getDouble());
    129             } else { //64bit int
    130                 details.appendFormat("   %s: %lld\n", it->first.string(), it->second.getInt64());
    131             }
    132         }
    133         MSG("%s", details.string());
    134     }
    135     getTestCase()->setDetails(details);
    136     return true;
    137 }
    138 
    139 TaskGeneric::ExecutionResult TaskSave::run()
    140 {
    141     bool failed = false;
    142     if (!handleFile()) {
    143         failed = true;
    144     }
    145     if (!handleReport()) {
    146         failed = true;
    147     }
    148     if (failed) {
    149         return TaskGeneric::EResultError;
    150     } else {
    151         return TaskGeneric::EResultOK;
    152     }
    153 }
    154 
    155 
    156