Check dimensions and content of bitmaps in EmbedderTests.

Review-Url: https://codereview.chromium.org/2514173002
diff --git a/BUILD.gn b/BUILD.gn
index 4b37bbc..13c40d6 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -193,6 +193,7 @@
     "testing/test_support.cpp",
     "testing/test_support.h",
     "testing/utils/path_service.cpp",
+    "testing/utils/path_service.h",
   ]
   deps = [
     ":pdfium",
diff --git a/core/fpdfapi/page/fpdf_page_func_embeddertest.cpp b/core/fpdfapi/page/fpdf_page_func_embeddertest.cpp
index 2892036..6a1b87b 100644
--- a/core/fpdfapi/page/fpdf_page_func_embeddertest.cpp
+++ b/core/fpdfapi/page/fpdf_page_func_embeddertest.cpp
@@ -15,6 +15,7 @@
   FPDF_PAGE page = LoadPage(0);
   EXPECT_NE(nullptr, page);
   FPDF_BITMAP bitmap = RenderPage(page);
+  CompareBitmap(bitmap, 612, 792, "1940568c9ba33bac5d0b1ee9558c76b3");
   FPDFBitmap_Destroy(bitmap);
   UnloadPage(page);
 }
diff --git a/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp b/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp
index 639dcbf..9dfc26e 100644
--- a/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp
+++ b/core/fpdfapi/parser/fpdf_parser_decode_embeddertest.cpp
@@ -92,6 +92,7 @@
   EXPECT_TRUE(OpenDocument("bug_552046.pdf"));
   FPDF_PAGE page = LoadPage(0);
   FPDF_BITMAP bitmap = RenderPage(page);
+  CompareBitmap(bitmap, 612, 792, "1940568c9ba33bac5d0b1ee9558c76b3");
   FPDFBitmap_Destroy(bitmap);
   UnloadPage(page);
 }
@@ -102,6 +103,7 @@
   EXPECT_TRUE(OpenDocument("bug_555784.pdf"));
   FPDF_PAGE page = LoadPage(0);
   FPDF_BITMAP bitmap = RenderPage(page);
+  CompareBitmap(bitmap, 612, 792, "1940568c9ba33bac5d0b1ee9558c76b3");
   FPDFBitmap_Destroy(bitmap);
   UnloadPage(page);
 }
@@ -112,6 +114,13 @@
   EXPECT_TRUE(OpenDocument("bug_455199.pdf"));
   FPDF_PAGE page = LoadPage(0);
   FPDF_BITMAP bitmap = RenderPage(page);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+  // Rendering on Mac is inconsistent, so skip this check.
+  const char* const kExpectedMd5sum = nullptr;
+#else
+  const char kExpectedMd5sum[] = "6f9f0fd903da177babb24dd50a806a56";
+#endif
+  CompareBitmap(bitmap, 200, 200, kExpectedMd5sum);
   FPDFBitmap_Destroy(bitmap);
   UnloadPage(page);
 }
diff --git a/core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp b/core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp
index 5c6a8c5..5b7cbc6 100644
--- a/core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp
+++ b/core/fpdfapi/render/fpdf_render_loadimage_embeddertest.cpp
@@ -14,6 +14,7 @@
   FPDF_PAGE page = LoadPage(0);
   EXPECT_NE(nullptr, page);
   FPDF_BITMAP bitmap = RenderPage(page);
+  CompareBitmap(bitmap, 612, 792, "a14d7ee573c1b2456d7bf6b7762823cf");
   FPDFBitmap_Destroy(bitmap);
   UnloadPage(page);
 }
@@ -24,6 +25,7 @@
   FPDF_PAGE page = LoadPage(0);
   EXPECT_NE(nullptr, page);
   FPDF_BITMAP bitmap = RenderPage(page);
+  CompareBitmap(bitmap, 24, 24, "dc0ea1b743c2edb22c597cadc8537f7b");
   FPDFBitmap_Destroy(bitmap);
   UnloadPage(page);
 }
@@ -34,6 +36,7 @@
   FPDF_PAGE page = LoadPage(0);
   EXPECT_NE(nullptr, page);
   FPDF_BITMAP bitmap = RenderPage(page);
+  CompareBitmap(bitmap, 749, 749, "b9e75190cdc5edf0069a408744ca07dc");
   FPDFBitmap_Destroy(bitmap);
   UnloadPage(page);
 }
diff --git a/core/fpdfapi/render/fpdf_render_pattern_embeddertest.cpp b/core/fpdfapi/render/fpdf_render_pattern_embeddertest.cpp
index 176c923..ed6da46 100644
--- a/core/fpdfapi/render/fpdf_render_pattern_embeddertest.cpp
+++ b/core/fpdfapi/render/fpdf_render_pattern_embeddertest.cpp
@@ -12,6 +12,7 @@
   EXPECT_TRUE(OpenDocument("bug_547706.pdf"));
   FPDF_PAGE page = LoadPage(0);
   FPDF_BITMAP bitmap = RenderPage(page);
+  CompareBitmap(bitmap, 612, 792, "1940568c9ba33bac5d0b1ee9558c76b3");
   FPDFBitmap_Destroy(bitmap);
   UnloadPage(page);
 }
diff --git a/core/fxcodec/codec/fx_codec_embeddertest.cpp b/core/fxcodec/codec/fx_codec_embeddertest.cpp
index 441494c..fd02f97 100644
--- a/core/fxcodec/codec/fx_codec_embeddertest.cpp
+++ b/core/fxcodec/codec/fx_codec_embeddertest.cpp
@@ -14,6 +14,7 @@
   FPDF_PAGE page = LoadPage(0);
   EXPECT_NE(nullptr, page);
   FPDF_BITMAP bitmap = RenderPage(page);
+  CompareBitmap(bitmap, 691, 432, "24d75af646f8772c5ee7ced260452ae4");
   FPDFBitmap_Destroy(bitmap);
   UnloadPage(page);
 }
diff --git a/testing/DEPS b/testing/DEPS
index 4110b9b..5adeb41 100644
--- a/testing/DEPS
+++ b/testing/DEPS
@@ -1,14 +1,6 @@
 include_rules = [
-  '+core/fpdfapi',
-  '+core/fxcodec',
-  '+core/fxcrt',
-  '+core/fxge',
   '+core',
   '+fxjs',
   '+public',
   '+v8',
-  '+xfa/fde',
-  '+xfa/fgas',
-  '+xfa/fxfa/fm2js',
-  '+xfa/fxfa/parser',
 ]
diff --git a/testing/embedder_test.cpp b/testing/embedder_test.cpp
index c23b5c8..bc4c027 100644
--- a/testing/embedder_test.cpp
+++ b/testing/embedder_test.cpp
@@ -11,6 +11,7 @@
 #include <utility>
 #include <vector>
 
+#include "core/fdrm/crypto/fx_crypt.h"
 #include "public/fpdf_dataavail.h"
 #include "public/fpdf_edit.h"
 #include "public/fpdf_text.h"
@@ -35,14 +36,26 @@
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 #endif  // PDF_ENABLE_V8
 
-}  // namespace
-
 FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) {
   return true;
 }
 
 void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {}
 
+std::string CRYPT_ToBase16(const uint8_t* digest) {
+  static char const zEncode[] = "0123456789abcdef";
+  std::string ret;
+  ret.resize(32);
+  for (int i = 0, j = 0; i < 16; i++, j += 2) {
+    uint8_t a = digest[i];
+    ret[j] = zEncode[(a >> 4) & 0xf];
+    ret[j + 1] = zEncode[a & 0xf];
+  }
+  return ret;
+}
+
+}  // namespace
+
 EmbedderTest::EmbedderTest()
     : default_delegate_(new EmbedderTest::Delegate()),
       document_(nullptr),
@@ -323,6 +336,25 @@
                                                               page_index);
 }
 
+// static
+void EmbedderTest::CompareBitmap(FPDF_BITMAP bitmap,
+                                 int expected_width,
+                                 int expected_height,
+                                 const char* expected_md5sum) {
+  ASSERT_EQ(expected_width, FPDFBitmap_GetWidth(bitmap));
+  ASSERT_EQ(expected_height, FPDFBitmap_GetHeight(bitmap));
+  const int expected_stride = expected_width * 4;
+  ASSERT_EQ(expected_stride, FPDFBitmap_GetStride(bitmap));
+
+  if (!expected_md5sum)
+    return;
+
+  uint8_t digest[16];
+  CRYPT_MD5Generate(static_cast<uint8_t*>(FPDFBitmap_GetBuffer(bitmap)),
+                    expected_stride * expected_height, digest);
+  EXPECT_EQ(expected_md5sum, CRYPT_ToBase16(digest));
+}
+
 // Can't use gtest-provided main since we need to stash the path to the
 // executable in order to find the external V8 binary data files.
 int main(int argc, char** argv) {
diff --git a/testing/embedder_test.h b/testing/embedder_test.h
index dc4ca0d..cc0caec 100644
--- a/testing/embedder_test.h
+++ b/testing/embedder_test.h
@@ -105,6 +105,12 @@
   // is prohibited after this call is made.
   virtual void UnloadPage(FPDF_PAGE page);
 
+  // Check |bitmap| to make sure it has the right dimensions and content.
+  static void CompareBitmap(FPDF_BITMAP bitmap,
+                            int expected_width,
+                            int expected_height,
+                            const char* expected_md5sum);
+
  protected:
   void SetupFormFillEnvironment();
 
diff --git a/testing/libfuzzer/DEPS b/testing/libfuzzer/DEPS
new file mode 100644
index 0000000..b1d034e
--- /dev/null
+++ b/testing/libfuzzer/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  '+xfa',
+]