Convert digest_test to GTest.

BUG=129

Change-Id: I7ce961f136b9c63cd02a364d6a78fd875c240d25
Reviewed-on: https://boringssl-review.googlesource.com/16446
Commit-Queue: Steven Valdez <svaldez@google.com>
Reviewed-by: Steven Valdez <svaldez@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt
index 557246c..2bce08e 100644
--- a/crypto/CMakeLists.txt
+++ b/crypto/CMakeLists.txt
@@ -249,6 +249,7 @@
   curve25519/spake25519_test.cc
   curve25519/x25519_test.cc
   dh/dh_test.cc
+  digest_extra/digest_test.cc
   dsa/dsa_test.cc
   err/err_test.cc
   evp/evp_extra_test.cc
diff --git a/crypto/digest_extra/CMakeLists.txt b/crypto/digest_extra/CMakeLists.txt
index f083a16..2efb832 100644
--- a/crypto/digest_extra/CMakeLists.txt
+++ b/crypto/digest_extra/CMakeLists.txt
@@ -7,14 +7,3 @@
 
   digest_extra.c
 )
-
-add_executable(
-  digest_test
-
-  digest_test.cc
-
-  $<TARGET_OBJECTS:test_support>
-)
-
-target_link_libraries(digest_test crypto)
-add_dependencies(all_tests digest_test)
diff --git a/crypto/digest_extra/digest_test.cc b/crypto/digest_extra/digest_test.cc
index 15c48e0..96fa778 100644
--- a/crypto/digest_extra/digest_test.cc
+++ b/crypto/digest_extra/digest_test.cc
@@ -18,6 +18,8 @@
 
 #include <memory>
 
+#include <gtest/gtest.h>
+
 #include <openssl/asn1.h>
 #include <openssl/crypto.h>
 #include <openssl/digest.h>
@@ -139,7 +141,7 @@
       "900150983cd24fb0d6963f7d28e17f72a9993e364706816aba3e25717850c26c9cd0d89d" },
 };
 
-static bool CompareDigest(const TestVector *test,
+static void CompareDigest(const TestVector *test,
                           const uint8_t *digest,
                           size_t digest_len) {
   static const char kHexTable[] = "0123456789abcdef";
@@ -151,125 +153,65 @@
   }
   digest_hex[2*digest_len] = '\0';
 
-  if (strcmp(digest_hex, test->expected_hex) != 0) {
-    fprintf(stderr, "%s(\"%s\" * %d) = %s; want %s\n",
-            test->md.name, test->input, (int)test->repeat,
-            digest_hex, test->expected_hex);
-    return false;
-  }
-
-  return true;
+  EXPECT_STREQ(test->expected_hex, digest_hex);
 }
 
-static int TestDigest(const TestVector *test) {
+static void TestDigest(const TestVector *test) {
   bssl::ScopedEVP_MD_CTX ctx;
 
   // Test the input provided.
-  if (!EVP_DigestInit_ex(ctx.get(), test->md.func(), NULL)) {
-    fprintf(stderr, "EVP_DigestInit_ex failed\n");
-    return false;
-  }
+  ASSERT_TRUE(EVP_DigestInit_ex(ctx.get(), test->md.func(), NULL));
   for (size_t i = 0; i < test->repeat; i++) {
-    if (!EVP_DigestUpdate(ctx.get(), test->input, strlen(test->input))) {
-      fprintf(stderr, "EVP_DigestUpdate failed\n");
-      return false;
-    }
+    ASSERT_TRUE(EVP_DigestUpdate(ctx.get(), test->input, strlen(test->input)));
   }
   std::unique_ptr<uint8_t[]> digest(new uint8_t[EVP_MD_size(test->md.func())]);
   unsigned digest_len;
-  if (!EVP_DigestFinal_ex(ctx.get(), digest.get(), &digest_len)) {
-    fprintf(stderr, "EVP_DigestFinal_ex failed\n");
-    return false;
-  }
-  if (!CompareDigest(test, digest.get(), digest_len)) {
-    return false;
-  }
+  ASSERT_TRUE(EVP_DigestFinal_ex(ctx.get(), digest.get(), &digest_len));
+  CompareDigest(test, digest.get(), digest_len);
 
   // Test the input one character at a time.
-  if (!EVP_DigestInit_ex(ctx.get(), test->md.func(), NULL)) {
-    fprintf(stderr, "EVP_DigestInit_ex failed\n");
-    return false;
-  }
-  if (!EVP_DigestUpdate(ctx.get(), NULL, 0)) {
-    fprintf(stderr, "EVP_DigestUpdate failed\n");
-    return false;
-  }
+  ASSERT_TRUE(EVP_DigestInit_ex(ctx.get(), test->md.func(), NULL));
+  ASSERT_TRUE(EVP_DigestUpdate(ctx.get(), NULL, 0));
   for (size_t i = 0; i < test->repeat; i++) {
     for (const char *p = test->input; *p; p++) {
-      if (!EVP_DigestUpdate(ctx.get(), p, 1)) {
-        fprintf(stderr, "EVP_DigestUpdate failed\n");
-        return false;
-      }
+      ASSERT_TRUE(EVP_DigestUpdate(ctx.get(), p, 1));
     }
   }
-  if (!EVP_DigestFinal_ex(ctx.get(), digest.get(), &digest_len)) {
-    fprintf(stderr, "EVP_DigestFinal_ex failed\n");
-    return false;
-  }
-  if (digest_len != EVP_MD_size(test->md.func())) {
-    fprintf(stderr, "EVP_MD_size output incorrect\n");
-    return false;
-  }
-  if (!CompareDigest(test, digest.get(), digest_len)) {
-    return false;
-  }
+  ASSERT_TRUE(EVP_DigestFinal_ex(ctx.get(), digest.get(), &digest_len));
+  EXPECT_EQ(EVP_MD_size(test->md.func()), digest_len);
+  CompareDigest(test, digest.get(), digest_len);
 
   // Test the one-shot function.
   if (test->md.one_shot_func && test->repeat == 1) {
     uint8_t *out = test->md.one_shot_func((const uint8_t *)test->input,
                                           strlen(test->input), digest.get());
-    if (out != digest.get()) {
-      fprintf(stderr, "one_shot_func gave incorrect return\n");
-      return false;
-    }
-    if (!CompareDigest(test, digest.get(), EVP_MD_size(test->md.func()))) {
-      return false;
-    }
+    // One-shot functions return their supplied buffers.
+    EXPECT_EQ(digest.get(), out);
+    CompareDigest(test, digest.get(), EVP_MD_size(test->md.func()));
   }
-
-  return true;
 }
 
-static int TestGetters() {
-  if (EVP_get_digestbyname("RSA-SHA512") != EVP_sha512() ||
-      EVP_get_digestbyname("sha512WithRSAEncryption") != EVP_sha512() ||
-      EVP_get_digestbyname("nonsense") != NULL ||
-      EVP_get_digestbyname("SHA512") != EVP_sha512() ||
-      EVP_get_digestbyname("sha512") != EVP_sha512()) {
-    return false;
+TEST(DigestTest, TestVectors) {
+  for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kTestVectors); i++) {
+    SCOPED_TRACE(i);
+    TestDigest(&kTestVectors[i]);
   }
+}
 
-  if (EVP_get_digestbynid(NID_sha512) != EVP_sha512() ||
-      EVP_get_digestbynid(NID_sha512WithRSAEncryption) != NULL ||
-      EVP_get_digestbynid(NID_undef) != NULL) {
-    return false;
-  }
+TEST(DigestTest, Getters) {
+  EXPECT_EQ(EVP_sha512(), EVP_get_digestbyname("RSA-SHA512"));
+  EXPECT_EQ(EVP_sha512(), EVP_get_digestbyname("sha512WithRSAEncryption"));
+  EXPECT_EQ(nullptr, EVP_get_digestbyname("nonsense"));
+  EXPECT_EQ(EVP_sha512(), EVP_get_digestbyname("SHA512"));
+  EXPECT_EQ(EVP_sha512(), EVP_get_digestbyname("sha512"));
+
+  EXPECT_EQ(EVP_sha512(), EVP_get_digestbynid(NID_sha512));
+  EXPECT_EQ(nullptr, EVP_get_digestbynid(NID_sha512WithRSAEncryption));
+  EXPECT_EQ(nullptr, EVP_get_digestbynid(NID_undef));
 
   bssl::UniquePtr<ASN1_OBJECT> obj(OBJ_txt2obj("1.3.14.3.2.26", 0));
-  if (!obj ||
-      EVP_get_digestbyobj(obj.get()) != EVP_sha1() ||
-      EVP_get_digestbyobj(OBJ_nid2obj(NID_md5_sha1)) != EVP_md5_sha1() ||
-      EVP_get_digestbyobj(OBJ_nid2obj(NID_sha1)) != EVP_sha1()) {
-    return false;
-  }
-
-  return true;
-}
-
-int main() {
-  CRYPTO_library_init();
-
-  for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kTestVectors); i++) {
-    if (!TestDigest(&kTestVectors[i])) {
-      fprintf(stderr, "Test %d failed\n", (int)i);
-      return 1;
-    }
-  }
-
-  if (!TestGetters()) {
-    return 1;
-  }
-
-  printf("PASS\n");
-  return 0;
+  ASSERT_TRUE(obj);
+  EXPECT_EQ(EVP_sha1(), EVP_get_digestbyobj(obj.get()));
+  EXPECT_EQ(EVP_md5_sha1(), EVP_get_digestbyobj(OBJ_nid2obj(NID_md5_sha1)));
+  EXPECT_EQ(EVP_sha1(), EVP_get_digestbyobj(OBJ_nid2obj(NID_sha1)));
 }
diff --git a/util/all_tests.json b/util/all_tests.json
index c9cddc0..49cb428 100644
--- a/util/all_tests.json
+++ b/util/all_tests.json
@@ -33,7 +33,6 @@
 	["crypto/cipher_extra/cipher_test", "crypto/cipher_extra/test/nist_cavp/tdes_ecb.txt"],
 	["crypto/crypto_test"],
 	["crypto/curve25519/ed25519_test", "crypto/curve25519/ed25519_tests.txt"],
-	["crypto/digest_extra/digest_test"],
 	["crypto/ecdh/ecdh_test", "crypto/ecdh/ecdh_tests.txt"],
 	["crypto/evp/evp_test", "crypto/evp/evp_tests.txt"],
 	["crypto/evp/pbkdf_test"],