Add support for oauth2client 4.0.0
diff --git a/googleapiclient/discovery_cache/file_cache.py b/googleapiclient/discovery_cache/file_cache.py
index 31434db..e88e7dc 100644
--- a/googleapiclient/discovery_cache/file_cache.py
+++ b/googleapiclient/discovery_cache/file_cache.py
@@ -33,7 +33,12 @@
   from oauth2client.contrib.locked_file import LockedFile
 except ImportError:
   # oauth2client < 2.0.0
-  from oauth2client.locked_file import LockedFile
+  try:
+    from oauth2client.locked_file import LockedFile
+  except ImportError:
+    # oauth2client > 4.0.0
+    raise ImportError(
+      'file_cache is unavailable when using oauth2client >= 4.0.0')
 
 from . import base
 from ..discovery_cache import DISCOVERY_DOC_MAX_AGE
diff --git a/tests/__init__.py b/tests/__init__.py
index c4022b7..8f6d06b 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -15,8 +15,15 @@
 
 __author__ = 'afshar@google.com (Ali Afshar)'
 
-import oauth2client.util
+
+# Oauth2client < 3 has the positional helper in 'util', >= 3 has it
+# in '_helpers'.
+try:
+  from oauth2client import util
+except ImportError:
+  from oauth2client import _helpers as util
+
 
 def setup_package():
   """Run on testing package."""
-  oauth2client.util.positional_parameters_enforcement = 'EXCEPTION'
+  util.positional_parameters_enforcement = 'EXCEPTION'
diff --git a/tests/test_discovery.py b/tests/test_discovery.py
index dac581f..c43d9e4 100644
--- a/tests/test_discovery.py
+++ b/tests/test_discovery.py
@@ -70,16 +70,18 @@
 from googleapiclient.http import MediaUploadProgress
 from googleapiclient.http import tunnel_patch
 from oauth2client import GOOGLE_TOKEN_URI
-from oauth2client import util
 from oauth2client.client import OAuth2Credentials
 
+try:
+  from oauth2client import util
+except ImportError:
+  from oauth2client import _helpers as util
+
 import uritemplate
 
 
 DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')
 
-util.positional_parameters_enforcement = util.POSITIONAL_EXCEPTION
-
 
 def assertUrisEqual(testcase, expected, actual):
   """Test that URIs are the same, up to reordering of query parameters."""
@@ -501,8 +503,8 @@
 class DiscoveryFromFileCache(unittest.TestCase):
   def test_file_based_cache(self):
     cache = mock.Mock(wraps=DictCache())
-    with mock.patch('googleapiclient.discovery_cache.file_cache.cache',
-                    new=cache):
+    with mock.patch('googleapiclient.discovery_cache.autodetect',
+                    return_value=cache):
       self.http = HttpMock(datafile('plus.json'), {'status': '200'})
 
       plus = build('plus', 'v1', http=self.http)
diff --git a/tests/test_discovery_cache.py b/tests/test_discovery_cache.py
index a26a65b..1786406 100644
--- a/tests/test_discovery_cache.py
+++ b/tests/test_discovery_cache.py
@@ -24,9 +24,14 @@
 
 from googleapiclient.discovery_cache import DISCOVERY_DOC_MAX_AGE
 from googleapiclient.discovery_cache.base import Cache
-from googleapiclient.discovery_cache.file_cache import Cache as FileCache
+
+try:
+  from googleapiclient.discovery_cache.file_cache import Cache as FileCache
+except ImportError:
+  FileCache = None
 
 
+@unittest.skipIf(FileCache is None, 'FileCache unavailable.')
 class FileCacheTest(unittest.TestCase):
   @mock.patch('googleapiclient.discovery_cache.file_cache.FILENAME',
               new='google-api-python-client-discovery-doc-tests.cache')
diff --git a/tox.ini b/tox.ini
index a87dad3..dcd0243 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,11 +1,12 @@
 [tox]
-envlist = py{26,27,33,34}-oauth2client{1,2,3}
+envlist = py{26,27,33,34}-oauth2client{1,2,3,4}
 
 [testenv]
 deps =
-       oauth2client1: oauth2client<2
-       oauth2client2: oauth2client>=2,<=3
-       oauth2client3: oauth2client>=3,<=4
+       oauth2client1: oauth2client<2dev
+       oauth2client2: oauth2client>=2,<=3dev
+       oauth2client3: oauth2client>=3,<=4dev
+       oauth2client4: oauth2client>=4,<=5dev
        keyring
        mox
        pyopenssl