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