From d2cfca68d03e0ab5723f17750b2dfe517d0cf06f Mon Sep 17 00:00:00 2001
From: Jan Hruban <jan.hruban@gooddata.com>
Date: Thu, 28 Apr 2016 15:43:20 +0200
Subject: [PATCH] Make the kerberos support python3 ready

urllib.request.Request.get_host() is removed in python >=3.4 in favor of
urllib.request.Request.host. It works in python 2.7 too.

Update the test to use Mock with spec where applicable, to ensure that
only available attributes are accessed.

Change-Id: I0e6a4e1539f9db329b6f113207d52f171cc600a7
---
 jenkins/urllib_kerb.py |  2 +-
 tests/test_kerberos.py | 14 +++++++++++---
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/jenkins/urllib_kerb.py b/jenkins/urllib_kerb.py
index a58ac35..490dc77 100644
--- a/jenkins/urllib_kerb.py
+++ b/jenkins/urllib_kerb.py
@@ -52,7 +52,7 @@ class HTTPNegotiateHandler(request.BaseHandler):
 
             self.tries += 1
             try:
-                krb_resp = self._krb_response(req.get_host(), krb_req)
+                krb_resp = self._krb_response(req.host, krb_req)
 
                 req.add_unredirected_header('Authorization',
                                             "Negotiate %s" % krb_resp)
diff --git a/tests/test_kerberos.py b/tests/test_kerberos.py
index d8c4c83..dc73a06 100644
--- a/tests/test_kerberos.py
+++ b/tests/test_kerberos.py
@@ -1,6 +1,7 @@
 import kerberos
 assert kerberos  # pyflakes
 from mock import patch, Mock
+from six.moves.urllib.request import Request
 import testtools
 
 from jenkins import urllib_kerb
@@ -23,7 +24,7 @@ class KerberosTests(testtools.TestCase):
         parent_return_mock.headers = {'www-authenticate': "Negotiate bar"}
         parent_mock.open.return_value = parent_return_mock
 
-        request_mock = Mock()
+        request_mock = Mock(spec=self._get_dummy_request())
         h = urllib_kerb.HTTPNegotiateHandler()
         h.add_parent(parent_mock)
         rv = h.http_error_401(request_mock, "", "", "", headers_from_server)
@@ -48,7 +49,8 @@ class KerberosTests(testtools.TestCase):
         init_mock.side_effect = kerberos.GSSError
 
         h = urllib_kerb.HTTPNegotiateHandler()
-        rv = h.http_error_401(Mock(), "", "", "", headers_from_server)
+        rv = h.http_error_401(Mock(spec=self._get_dummy_request()), "", "", "",
+                              headers_from_server)
         self.assertEqual(rv, None)
 
     @patch('kerberos.authGSSClientResponse')
@@ -59,7 +61,8 @@ class KerberosTests(testtools.TestCase):
         headers_from_server = {}
 
         h = urllib_kerb.HTTPNegotiateHandler()
-        rv = h.http_error_401(Mock(), "", "", "", headers_from_server)
+        rv = h.http_error_401(Mock(spec=self._get_dummy_request()), "", "", "",
+                              headers_from_server)
         self.assertEqual(rv, None)
 
     @patch('kerberos.authGSSClientResponse')
@@ -114,3 +117,8 @@ class KerberosTests(testtools.TestCase):
         h = urllib_kerb.HTTPNegotiateHandler()
         with testtools.ExpectedException(ValueError):
             h._extract_krb_value(headers_from_server)
+
+    def _get_dummy_request(self):
+        r = Request('http://example.com')
+        r.timeout = 10
+        return r