Fixes Issue #12059: Properly handle missing hash functions even when
the expected builtin modules are not present.

This includes a unittest for __get_builtin_constructor() in the face
of such an error.
diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py
index ed41672..855ecbf 100644
--- a/Lib/test/test_hashlib.py
+++ b/Lib/test/test_hashlib.py
@@ -115,6 +115,24 @@
         else:
             self.assertTrue(0 == "hashlib didn't reject bogus hash name")
 
+    def test_get_builtin_constructor(self):
+        get_builtin_constructor = hashlib.__dict__[
+                '__get_builtin_constructor']
+        self.assertRaises(ValueError, get_builtin_constructor, 'test')
+        try:
+            import _md5
+        except ImportError:
+            pass
+        # This forces an ImportError for "import _md5" statements
+        sys.modules['_md5'] = None
+        try:
+            self.assertRaises(ValueError, get_builtin_constructor, 'md5')
+        finally:
+            if '_md5' in locals():
+                sys.modules['_md5'] = _md5
+            else:
+                del sys.modules['_md5']
+
     def test_hexdigest(self):
         for name in self.supported_hash_names:
             h = hashlib.new(name)