| Index: tools/image_expectations.cpp
 | 
| diff --git a/tools/image_expectations.cpp b/tools/image_expectations.cpp
 | 
| index 24c91755415d62e4e292cbd72d0af0b76f4045cc..ac232e9f30daf4eba7f8f04c59db01e3f3b80998 100644
 | 
| --- a/tools/image_expectations.cpp
 | 
| +++ b/tools/image_expectations.cpp
 | 
| @@ -95,12 +95,43 @@ namespace sk_tools {
 | 
|      // ImageResultsAndExpectations class...
 | 
|  
 | 
|      bool ImageResultsAndExpectations::readExpectationsFile(const char *jsonPath) {
 | 
| -        if (Parse(jsonPath, &fExpectedJsonRoot)) {
 | 
| -            fExpectedResults = fExpectedJsonRoot[kJsonKey_ExpectedResults];
 | 
| +        if (NULL == jsonPath) {
 | 
| +            SkDebugf("JSON expectations filename not specified\n");
 | 
| +            return false;
 | 
| +        }
 | 
| +        SkFILE* filePtr = sk_fopen(jsonPath, kRead_SkFILE_Flag);
 | 
| +        if (NULL == filePtr) {
 | 
| +            SkDebugf("JSON expectations file '%s' does not exist\n", jsonPath);
 | 
| +            return false;
 | 
| +        }
 | 
| +        size_t size = sk_fgetsize(filePtr);
 | 
| +        if (0 == size) {
 | 
| +            SkDebugf("JSON expectations file '%s' is empty, so no expectations\n", jsonPath);
 | 
| +            sk_fclose(filePtr);
 | 
| +            fExpectedResults.clear();
 | 
|              return true;
 | 
| -        } else {
 | 
| +        }
 | 
| +        bool parsedJson = Parse(filePtr, &fExpectedJsonRoot);
 | 
| +        sk_fclose(filePtr);
 | 
| +        if (!parsedJson) {
 | 
| +            SkDebugf("Failed to parse JSON expectations file '%s'\n", jsonPath);
 | 
|              return false;
 | 
|          }
 | 
| +        Json::Value header = fExpectedJsonRoot[kJsonKey_Header];
 | 
| +        Json::Value headerType = header[kJsonKey_Header_Type];
 | 
| +        Json::Value headerRevision = header[kJsonKey_Header_Revision];
 | 
| +        if (strcmp(headerType.asCString(), kJsonValue_Header_Type)) {
 | 
| +            SkDebugf("JSON expectations file '%s': expected headerType '%s', found '%s'\n",
 | 
| +                     jsonPath, kJsonValue_Header_Type, headerType.asCString());
 | 
| +            return false;
 | 
| +        }
 | 
| +        if (headerRevision.asInt() != kJsonValue_Header_Revision) {
 | 
| +            SkDebugf("JSON expectations file '%s': expected headerRevision %d, found %d\n",
 | 
| +                     jsonPath, kJsonValue_Header_Revision, headerRevision.asInt());
 | 
| +            return false;
 | 
| +        }
 | 
| +        fExpectedResults = fExpectedJsonRoot[kJsonKey_ExpectedResults];
 | 
| +        return true;
 | 
|      }
 | 
|  
 | 
|      void ImageResultsAndExpectations::add(const char *sourceName, const char *fileName,
 | 
| @@ -181,11 +212,10 @@ namespace sk_tools {
 | 
|          stream.write(jsonStdString.c_str(), jsonStdString.length());
 | 
|      }
 | 
|  
 | 
| -    /*static*/ bool ImageResultsAndExpectations::Parse(const char *jsonPath,
 | 
| +    /*static*/ bool ImageResultsAndExpectations::Parse(SkFILE *filePtr,
 | 
|                                                         Json::Value *jsonRoot) {
 | 
| -        SkAutoDataUnref dataRef(SkData::NewFromFileName(jsonPath));
 | 
| +        SkAutoDataUnref dataRef(SkData::NewFromFILE(filePtr));
 | 
|          if (NULL == dataRef.get()) {
 | 
| -            SkDebugf("error reading JSON file %s\n", jsonPath);
 | 
|              return false;
 | 
|          }
 | 
|  
 | 
| @@ -193,7 +223,6 @@ namespace sk_tools {
 | 
|          size_t size = dataRef.get()->size();
 | 
|          Json::Reader reader;
 | 
|          if (!reader.parse(bytes, bytes+size, *jsonRoot)) {
 | 
| -            SkDebugf("error parsing JSON file %s\n", jsonPath);
 | 
|              return false;
 | 
|          }
 | 
|  
 | 
| 
 |