diff --git a/crypto/test/gtest_main.cc b/crypto/test/gtest_main.cc
index ea1135c..4071040 100644
--- a/crypto/test/gtest_main.cc
+++ b/crypto/test/gtest_main.cc
@@ -14,58 +14,11 @@
 
 #include <gtest/gtest.h>
 
-#include <stdio.h>
+#include "gtest_main.h"
 
-#include <openssl/err.h>
-#include <openssl/crypto.h>
-
-#if defined(OPENSSL_WINDOWS)
-OPENSSL_MSVC_PRAGMA(warning(push, 3))
-#include <winsock2.h>
-OPENSSL_MSVC_PRAGMA(warning(pop))
-#endif
-
-
-namespace {
-
-class ErrorTestEventListener : public testing::EmptyTestEventListener {
- public:
-  ErrorTestEventListener() {}
-  ~ErrorTestEventListener() override {}
-
-  void OnTestEnd(const testing::TestInfo &test_info) override {
-    // If the test failed, print any errors left in the error queue.
-    if (test_info.result()->Failed()) {
-      ERR_print_errors_fp(stdout);
-    }
-
-    // Clean up the error queue for the next run.
-    ERR_clear_error();
-  }
-};
-
-}  // namespace
 
 int main(int argc, char **argv) {
-  CRYPTO_library_init();
-
-#if defined(OPENSSL_WINDOWS)
-  // Initialize Winsock.
-  WORD wsa_version = MAKEWORD(2, 2);
-  WSADATA wsa_data;
-  int wsa_err = WSAStartup(wsa_version, &wsa_data);
-  if (wsa_err != 0) {
-    fprintf(stderr, "WSAStartup failed: %d\n", wsa_err);
-    return 1;
-  }
-  if (wsa_data.wVersion != wsa_version) {
-    fprintf(stderr, "Didn't get expected version: %x\n", wsa_data.wVersion);
-    return 1;
-  }
-#endif
-
   testing::InitGoogleTest(&argc, argv);
-  testing::UnitTest::GetInstance()->listeners().Append(
-      new ErrorTestEventListener);
+  bssl::SetupGoogleTest();
   return RUN_ALL_TESTS();
 }
diff --git a/crypto/test/gtest_main.h b/crypto/test/gtest_main.h
new file mode 100644
index 0000000..395b281
--- /dev/null
+++ b/crypto/test/gtest_main.h
@@ -0,0 +1,78 @@
+/* Copyright (c) 2017, Google Inc.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
+
+#ifndef OPENSSL_HEADER_CRYPTO_TEST_GTEST_MAIN_H
+#define OPENSSL_HEADER_CRYPTO_TEST_GTEST_MAIN_H
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <gtest/gtest.h>
+
+#include <openssl/crypto.h>
+#include <openssl/err.h>
+
+#if defined(OPENSSL_WINDOWS)
+OPENSSL_MSVC_PRAGMA(warning(push, 3))
+#include <winsock2.h>
+OPENSSL_MSVC_PRAGMA(warning(pop))
+#endif
+
+
+namespace bssl {
+
+class ErrorTestEventListener : public testing::EmptyTestEventListener {
+ public:
+  ErrorTestEventListener() {}
+  ~ErrorTestEventListener() override {}
+
+  void OnTestEnd(const testing::TestInfo &test_info) override {
+    // If the test failed, print any errors left in the error queue.
+    if (test_info.result()->Failed()) {
+      ERR_print_errors_fp(stdout);
+    }
+
+    // Clean up the error queue for the next run.
+    ERR_clear_error();
+  }
+};
+
+// SetupGoogleTest should be called by the test runner after
+// testing::InitGoogleTest has been called and before RUN_ALL_TESTS.
+inline void SetupGoogleTest() {
+  CRYPTO_library_init();
+
+#if defined(OPENSSL_WINDOWS)
+  // Initialize Winsock.
+  WORD wsa_version = MAKEWORD(2, 2);
+  WSADATA wsa_data;
+  int wsa_err = WSAStartup(wsa_version, &wsa_data);
+  if (wsa_err != 0) {
+    fprintf(stderr, "WSAStartup failed: %d\n", wsa_err);
+    exit(1);
+  }
+  if (wsa_data.wVersion != wsa_version) {
+    fprintf(stderr, "Didn't get expected version: %x\n", wsa_data.wVersion);
+    exit(1);
+  }
+#endif
+
+  testing::UnitTest::GetInstance()->listeners().Append(
+      new ErrorTestEventListener);
+}
+
+}  // namespace bssl
+
+
+#endif /* OPENSSL_HEADER_CRYPTO_TEST_GTEST_MAIN_H */
