DMJsonWriter.cpp revision 62bd1a69ea49318aa5022151262c842887e0ecf4
17a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo/*
27a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo * Copyright 2014 Google Inc.
37a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo *
47a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo * Use of this source code is governed by a BSD-style license that can be
57a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo * found in the LICENSE file.
67a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo */
77a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo
87a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo#include "DMJsonWriter.h"
97a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo
107a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo#include "SkCommonFlags.h"
1162bd1a69ea49318aa5022151262c842887e0ecf4mtklein#include "SkData.h"
127a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo#include "SkJSONCPP.h"
137a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo#include "SkOSFile.h"
147a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo#include "SkStream.h"
157a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo#include "SkTArray.h"
167a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo#include "SkThread.h"
177a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo
187a10fb6bead0f63623307a7ff71b1dd323534a7fscroggonamespace DM {
197a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo
207a10fb6bead0f63623307a7ff71b1dd323534a7fscroggoSkTArray<JsonWriter::BitmapResult> gBitmapResults;
217a10fb6bead0f63623307a7ff71b1dd323534a7fscroggoSK_DECLARE_STATIC_MUTEX(gBitmapResultLock);
227a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo
237a10fb6bead0f63623307a7ff71b1dd323534a7fscroggovoid JsonWriter::AddBitmapResult(const BitmapResult& result) {
247a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    SkAutoMutexAcquire lock(&gBitmapResultLock);
257a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    gBitmapResults.push_back(result);
267a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo}
277a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo
280ee2627026370bbb25e4efda490e14e468ac86fbscroggoSkTArray<skiatest::Failure> gFailures;
290ee2627026370bbb25e4efda490e14e468ac86fbscroggoSK_DECLARE_STATIC_MUTEX(gFailureLock);
300ee2627026370bbb25e4efda490e14e468ac86fbscroggo
310ee2627026370bbb25e4efda490e14e468ac86fbscroggovoid JsonWriter::AddTestFailure(const skiatest::Failure& failure) {
320ee2627026370bbb25e4efda490e14e468ac86fbscroggo    SkAutoMutexAcquire lock(gFailureLock);
330ee2627026370bbb25e4efda490e14e468ac86fbscroggo    gFailures.push_back(failure);
340ee2627026370bbb25e4efda490e14e468ac86fbscroggo}
350ee2627026370bbb25e4efda490e14e468ac86fbscroggo
367a10fb6bead0f63623307a7ff71b1dd323534a7fscroggovoid JsonWriter::DumpJson() {
377a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    if (FLAGS_writePath.isEmpty()) {
387a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo        return;
397a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    }
407a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo
417a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    Json::Value root;
427a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo
437a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    for (int i = 1; i < FLAGS_properties.count(); i += 2) {
447a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo        root[FLAGS_properties[i-1]] = FLAGS_properties[i];
457a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    }
467a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    for (int i = 1; i < FLAGS_key.count(); i += 2) {
477a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo        root["key"][FLAGS_key[i-1]] = FLAGS_key[i];
487a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    }
497a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo
507a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    {
517a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo        SkAutoMutexAcquire lock(&gBitmapResultLock);
527a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo        for (int i = 0; i < gBitmapResults.count(); i++) {
537a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo            Json::Value result;
543d8878caa74c58f95e0f4cb5ebd40c8771567c13mtklein            result["key"]["name"]        = gBitmapResults[i].name.c_str();
553d8878caa74c58f95e0f4cb5ebd40c8771567c13mtklein            result["key"]["config"]      = gBitmapResults[i].config.c_str();
563d8878caa74c58f95e0f4cb5ebd40c8771567c13mtklein            result["key"]["source_type"] = gBitmapResults[i].sourceType.c_str();
57748ca3bf2d170708f263693e8579e6722389d0efmtklein            result["ext"]                = gBitmapResults[i].ext.c_str();
583d8878caa74c58f95e0f4cb5ebd40c8771567c13mtklein            result["md5"]                = gBitmapResults[i].md5.c_str();
597a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo
607a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo            root["results"].append(result);
617a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo        }
627a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    }
637a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo
640ee2627026370bbb25e4efda490e14e468ac86fbscroggo    {
650ee2627026370bbb25e4efda490e14e468ac86fbscroggo        SkAutoMutexAcquire lock(gFailureLock);
660ee2627026370bbb25e4efda490e14e468ac86fbscroggo        for (int i = 0; i < gFailures.count(); i++) {
670ee2627026370bbb25e4efda490e14e468ac86fbscroggo            Json::Value result;
680ee2627026370bbb25e4efda490e14e468ac86fbscroggo            result["file_name"]     = gFailures[i].fileName;
690ee2627026370bbb25e4efda490e14e468ac86fbscroggo            result["line_no"]       = gFailures[i].lineNo;
700ee2627026370bbb25e4efda490e14e468ac86fbscroggo            result["condition"]     = gFailures[i].condition;
710ee2627026370bbb25e4efda490e14e468ac86fbscroggo            result["message"]       = gFailures[i].message.c_str();
720ee2627026370bbb25e4efda490e14e468ac86fbscroggo
730ee2627026370bbb25e4efda490e14e468ac86fbscroggo            root["test_results"]["failures"].append(result);
740ee2627026370bbb25e4efda490e14e468ac86fbscroggo        }
750ee2627026370bbb25e4efda490e14e468ac86fbscroggo    }
760ee2627026370bbb25e4efda490e14e468ac86fbscroggo
777a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    SkString path = SkOSPath::Join(FLAGS_writePath[0], "dm.json");
787a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    SkFILEWStream stream(path.c_str());
797a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    stream.writeText(Json::StyledWriter().write(root).c_str());
807a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo    stream.flush();
817a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo}
827a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo
8362bd1a69ea49318aa5022151262c842887e0ecf4mtkleinbool JsonWriter::ReadJson(const char* path, void(*callback)(BitmapResult)) {
8462bd1a69ea49318aa5022151262c842887e0ecf4mtklein    SkAutoTUnref<SkData> json(SkData::NewFromFileName(path));
8562bd1a69ea49318aa5022151262c842887e0ecf4mtklein    if (!json) {
8662bd1a69ea49318aa5022151262c842887e0ecf4mtklein        return false;
8762bd1a69ea49318aa5022151262c842887e0ecf4mtklein    }
8862bd1a69ea49318aa5022151262c842887e0ecf4mtklein
8962bd1a69ea49318aa5022151262c842887e0ecf4mtklein    Json::Reader reader;
9062bd1a69ea49318aa5022151262c842887e0ecf4mtklein    Json::Value root;
9162bd1a69ea49318aa5022151262c842887e0ecf4mtklein    const char* data = (const char*)json->data();
9262bd1a69ea49318aa5022151262c842887e0ecf4mtklein    if (!reader.parse(data, data+json->size(), root)) {
9362bd1a69ea49318aa5022151262c842887e0ecf4mtklein        return false;
9462bd1a69ea49318aa5022151262c842887e0ecf4mtklein    }
9562bd1a69ea49318aa5022151262c842887e0ecf4mtklein
9662bd1a69ea49318aa5022151262c842887e0ecf4mtklein    const Json::Value& results = root["results"];
9762bd1a69ea49318aa5022151262c842887e0ecf4mtklein    BitmapResult br;
9862bd1a69ea49318aa5022151262c842887e0ecf4mtklein    for (unsigned i = 0; i < results.size(); i++) {
9962bd1a69ea49318aa5022151262c842887e0ecf4mtklein        const Json::Value& r = results[i];
10062bd1a69ea49318aa5022151262c842887e0ecf4mtklein        br.name       = r["key"]["name"].asCString();
10162bd1a69ea49318aa5022151262c842887e0ecf4mtklein        br.config     = r["key"]["config"].asCString();
10262bd1a69ea49318aa5022151262c842887e0ecf4mtklein        br.sourceType = r["key"]["source_type"].asCString();
10362bd1a69ea49318aa5022151262c842887e0ecf4mtklein        br.ext        = r["ext"].asCString();
10462bd1a69ea49318aa5022151262c842887e0ecf4mtklein        br.md5        = r["md5"].asCString();
10562bd1a69ea49318aa5022151262c842887e0ecf4mtklein        callback(br);
10662bd1a69ea49318aa5022151262c842887e0ecf4mtklein    }
10762bd1a69ea49318aa5022151262c842887e0ecf4mtklein    return true;
10862bd1a69ea49318aa5022151262c842887e0ecf4mtklein}
10962bd1a69ea49318aa5022151262c842887e0ecf4mtklein
1107a10fb6bead0f63623307a7ff71b1dd323534a7fscroggo} // namespace DM
111