FIX: TypeError exception when running on Google App Engine. (#12)

* Fix TypeError exception “__init__() got an unexpected keyword argument 'ssl_version’”
* Add additional Google App Engine environment checks
* Fix broken App Engine test cases
diff --git a/python2/httplib2test_appengine.py b/python2/httplib2test_appengine.py
old mode 100644
new mode 100755
index 0c0bdc2..9fad05a
--- a/python2/httplib2test_appengine.py
+++ b/python2/httplib2test_appengine.py
@@ -1,22 +1,11 @@
-"""
-httplib2test_appengine
+"""Tests for httplib2 on Google App Engine."""
 
-A set of unit tests for httplib2.py on Google App Engine
-
-"""
-
-__author__ = "Joe Gregorio (joe@bitworking.org)"
-__copyright__ = "Copyright 2011, Joe Gregorio"
-
+import mock
 import os
 import sys
 import unittest
 
-# The test resources base uri
-base = 'http://bitworking.org/projects/httplib2/test/'
-#base = 'http://localhost/projects/httplib2/test/'
-cacheDirName = ".cache"
-APP_ENGINE_PATH='../../google_appengine'
+APP_ENGINE_PATH='/usr/local/google_appengine'
 
 sys.path.insert(0, APP_ENGINE_PATH)
 
@@ -24,71 +13,66 @@
 dev_appserver.fix_sys_path()
 
 from google.appengine.ext import testbed
-testbed = testbed.Testbed()
-testbed.activate()
-testbed.init_urlfetch_stub()
 
-import google.appengine.api
-
-import httplib2
-
-class AppEngineHttpTest(unittest.TestCase):
-    def setUp(self):
-        if os.path.exists(cacheDirName):
-            [os.remove(os.path.join(cacheDirName, file)) for file in os.listdir(cacheDirName)]
-
-    def test(self):
-        h = httplib2.Http()
-        response, content = h.request("http://bitworking.org")
-        self.assertEqual(httplib2.SCHEME_TO_CONNECTION['https'],
-                         httplib2.AppEngineHttpsConnection)
-        self.assertEquals(1, len(h.connections))
-        self.assertEquals(response.status, 200)
-        self.assertEquals(response['status'], '200')
-
-    # It would be great to run the test below, but it really tests the
-    # aberrant behavior of httplib on App Engine, but that special aberrant
-    # httplib only appears when actually running on App Engine and not when
-    # running via the SDK. When running via the SDK the httplib in std lib is
-    # loaded, which throws a different error when a timeout occurs.
-    #
-    #def test_timeout(self):
-    #    # The script waits 3 seconds, so a timeout of more than that should succeed.
-    #    h = httplib2.Http(timeout=7)
-    #    r, c = h.request('http://bitworking.org/projects/httplib2/test/timeout/timeout.cgi')
-    #
-    #    import httplib
-    #    print httplib.__file__
-    #    h = httplib2.Http(timeout=1)
-    #    try:
-    #      r, c = h.request('http://bitworking.org/projects/httplib2/test/timeout/timeout.cgi')
-    #      self.fail('Timeout should have raised an exception.')
-    #    except DeadlineExceededError:
-    #      pass
-
-    def test_proxy_info_ignored(self):
-        h = httplib2.Http(proxy_info='foo.txt')
-        response, content = h.request("http://bitworking.org")
-        self.assertEquals(response.status, 200)
+# Ensure that we are not loading the httplib2 version included in the Google
+# App Engine SDK.
+sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)))
 
 
 class AberrationsTest(unittest.TestCase):
-    def setUp(self):
-        self.orig_apiproxy_stub_map = google.appengine.api.apiproxy_stub_map
 
-        # Force apiproxy_stub_map to None to trigger the test condition.
-        google.appengine.api.apiproxy_stub_map = None
-        reload(httplib2)
+  def setUp(self):
+    self.testbed = testbed.Testbed()
+    self.testbed.activate()
+    self.testbed.init_urlfetch_stub()
 
-    def tearDown(self):
-        google.appengine.api.apiproxy_stub_map = self.orig_apiproxy_stub_map
-        reload(httplib2)
+  def tearDown(self):
+    self.testbed.deactivate()
 
-    def test(self):
-        self.assertNotEqual(httplib2.SCHEME_TO_CONNECTION['https'],
-                            httplib2.AppEngineHttpsConnection)
-        self.assertNotEqual(httplib2.SCHEME_TO_CONNECTION['http'],
-                            httplib2.AppEngineHttpConnection)
+  @mock.patch.dict('os.environ', {'SERVER_SOFTWARE': ''})
+  def testConnectionInit(self):
+    global httplib2
+    import httplib2
+    self.assertNotEqual(
+      httplib2.SCHEME_TO_CONNECTION['https'], httplib2.AppEngineHttpsConnection)
+    self.assertNotEqual(
+      httplib2.SCHEME_TO_CONNECTION['http'], httplib2.AppEngineHttpConnection)
+    del globals()['httplib2']
+
+
+class AppEngineHttpTest(unittest.TestCase):
+
+  def setUp(self):
+    self.testbed = testbed.Testbed()
+    self.testbed.activate()
+    self.testbed.init_urlfetch_stub()
+    global httplib2
+    import httplib2
+    reload(httplib2)
+
+  def tearDown(self):
+    self.testbed.deactivate()
+    del globals()['httplib2']
+
+  def testConnectionInit(self):
+    self.assertEqual(
+      httplib2.SCHEME_TO_CONNECTION['https'], httplib2.AppEngineHttpsConnection)
+    self.assertEqual(
+      httplib2.SCHEME_TO_CONNECTION['http'], httplib2.AppEngineHttpConnection)
+
+  def testGet(self):
+    http = httplib2.Http()
+    response, content = http.request("http://www.google.com")
+    self.assertEqual(httplib2.SCHEME_TO_CONNECTION['https'],
+                     httplib2.AppEngineHttpsConnection)
+    self.assertEquals(1, len(http.connections))
+    self.assertEquals(response.status, 200)
+    self.assertEquals(response['status'], '200')
+
+  def testProxyInfoIgnored(self):
+    http = httplib2.Http(proxy_info=mock.MagicMock())
+    response, content = http.request("http://www.google.com")
+    self.assertEquals(response.status, 200)
 
 
 if __name__ == '__main__':