/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
#include <inttypes.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <memory>
#include "Log.h"
#include "FileUtil.h"
#include "Report.h"
#include "StringUtil.h"
#include "task/TaskCase.h"
#include "task/TaskGeneric.h"
#include "task/TaskSave.h"
static const android::String8 STR_FILE("file");
static const android::String8 STR_REPORT("report");
TaskSave::TaskSave()
: TaskGeneric(TaskGeneric::ETaskSave)
{
const android::String8* list[] = {&STR_FILE, &STR_REPORT, NULL};
registerSupportedStringAttributes(list);
}
TaskSave::~TaskSave()
{
}
bool TaskSave::handleFile()
{
android::String8 fileValue;
if (!findStringAttribute(STR_FILE, fileValue)) {
LOGI("no saving to file");
return true; // true as there is no need to save
}
std::unique_ptr<std::vector<android::String8> > list(StringUtil::split(fileValue, ','));
std::vector<android::String8>* listp = list.get();
if (listp == NULL) {
LOGE("alloc failed");
return false;
}
android::String8 dirName;
if (!FileUtil::prepare(dirName)) {
LOGE("cannot prepare report dir");
return false;
}
android::String8 caseName;
if (!getTestCase()->getCaseName(caseName)) {
return false;
}
dirName.appendPath(caseName);
int result = mkdir(dirName.string(), S_IRWXU);
if ((result == -1) && (errno != EEXIST)) {
LOGE("mkdir of save dir %s failed, error %d", dirName.string(), errno);
return false;
}
for (size_t i = 0; i < listp->size(); i++) {
std::unique_ptr<std::list<TaskCase::BufferPair> > buffers(
getTestCase()->findAllBuffers((*listp)[i]));
std::list<TaskCase::BufferPair>* buffersp = buffers.get();
if (buffersp == NULL) {
LOGE("no buffer for given pattern %s", ((*listp)[i]).string());
return false;
}
std::list<TaskCase::BufferPair>::iterator it = buffersp->begin();
std::list<TaskCase::BufferPair>::iterator end = buffersp->end();
for (; it != end; it++) {
android::String8 fileName(dirName);
fileName.appendPath(it->first);
if (!it->second->saveToFile(fileName)) {
LOGE("save failed");
return false;
}
}
}
return true;
}
bool TaskSave::handleReport()
{
android::String8 reportValue;
if (!findStringAttribute(STR_REPORT, reportValue)) {
LOGI("no saving to report");
return true; // true as there is no need to save
}
std::unique_ptr<std::vector<android::String8> > list(StringUtil::split(reportValue, ','));
std::vector<android::String8>* listp = list.get();
if (listp == NULL) {
LOGE("alloc failed");
return false;
}
MSG("=== Values stored ===");
android::String8 details;
for (size_t i = 0; i < listp->size(); i++) {
std::unique_ptr<std::list<TaskCase::ValuePair> > values(
getTestCase()->findAllValues((*listp)[i]));
std::list<TaskCase::ValuePair>* valuesp = values.get();
if (valuesp == NULL) {
LOGE("no value for given pattern %s", ((*listp)[i]).string());
return false;
}
std::list<TaskCase::ValuePair>::iterator it = values->begin();
std::list<TaskCase::ValuePair>::iterator end = values->end();
for (; it != end; it++) {
if (it->second.getType() == TaskCase::Value::ETypeDouble) {
details.appendFormat(" %s: %f\n", it->first.string(), it->second.getDouble());
} else { //64bit int
details.appendFormat(" %s: %" PRId64 "\n", it->first.string(),
it->second.getInt64());
}
}
MSG("%s", details.string());
}
getTestCase()->setDetails(details);
return true;
}
TaskGeneric::ExecutionResult TaskSave::run()
{
bool failed = false;
if (!handleFile()) {
failed = true;
}
if (!handleReport()) {
failed = true;
}
if (failed) {
return TaskGeneric::EResultError;
} else {
return TaskGeneric::EResultOK;
}
}