bpo-41490: Update ensurepip to install pip 20.2.1 and setuptools 49.2.1 (GH-21774)

diff --git a/.github/workflows/build_msi.yml b/.github/workflows/build_msi.yml
index 182eb7c..3664ccb 100644
--- a/.github/workflows/build_msi.yml
+++ b/.github/workflows/build_msi.yml
@@ -9,6 +9,7 @@
     - 3.7
     paths:
     - 'Tools/msi/**'
+    - 'Lib/ensurepip/**'
   pull_request:
     branches:
     - master
@@ -17,6 +18,7 @@
     - 3.7
     paths:
     - 'Tools/msi/**'
+    - 'Lib/ensurepip/**'
 
 jobs:
   build_win32:
diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
index 21320a8..8f504e7 100644
--- a/Lib/ensurepip/__init__.py
+++ b/Lib/ensurepip/__init__.py
@@ -12,9 +12,9 @@
 __all__ = ["version", "bootstrap"]
 
 
-_SETUPTOOLS_VERSION = "47.1.0"
+_SETUPTOOLS_VERSION = "49.2.1"
 
-_PIP_VERSION = "20.1.1"
+_PIP_VERSION = "20.2.1"
 
 _PROJECTS = [
     ("setuptools", _SETUPTOOLS_VERSION, "py3"),
diff --git a/Lib/ensurepip/_bundled/pip-20.1.1-py2.py3-none-any.whl b/Lib/ensurepip/_bundled/pip-20.1.1-py2.py3-none-any.whl
deleted file mode 100644
index ea1d0f7..0000000
--- a/Lib/ensurepip/_bundled/pip-20.1.1-py2.py3-none-any.whl
+++ /dev/null
Binary files differ
diff --git a/Lib/ensurepip/_bundled/pip-20.2.1-py2.py3-none-any.whl b/Lib/ensurepip/_bundled/pip-20.2.1-py2.py3-none-any.whl
new file mode 100644
index 0000000..3d0d3f8
--- /dev/null
+++ b/Lib/ensurepip/_bundled/pip-20.2.1-py2.py3-none-any.whl
Binary files differ
diff --git a/Lib/ensurepip/_bundled/setuptools-47.1.0-py3-none-any.whl b/Lib/ensurepip/_bundled/setuptools-47.1.0-py3-none-any.whl
deleted file mode 100644
index f87867f..0000000
--- a/Lib/ensurepip/_bundled/setuptools-47.1.0-py3-none-any.whl
+++ /dev/null
Binary files differ
diff --git a/Lib/ensurepip/_bundled/setuptools-49.2.1-py3-none-any.whl b/Lib/ensurepip/_bundled/setuptools-49.2.1-py3-none-any.whl
new file mode 100644
index 0000000..308e2f2
--- /dev/null
+++ b/Lib/ensurepip/_bundled/setuptools-49.2.1-py3-none-any.whl
Binary files differ
diff --git a/Lib/test/test_importlib/test_resource.py b/Lib/test/test_importlib/test_resource.py
index f88d92d..e132c57 100644
--- a/Lib/test/test_importlib/test_resource.py
+++ b/Lib/test/test_importlib/test_resource.py
@@ -1,10 +1,13 @@
 import sys
 import unittest
+import uuid
 
 from . import data01
 from . import zipdata01, zipdata02
 from . import util
 from importlib import resources, import_module
+from pathlib import Path
+from test import support
 
 
 class ResourceTests:
@@ -162,5 +165,71 @@
             'test.test_importlib.data03.namespace', 'resource1.txt')
 
 
+class DeletingZipsTest(unittest.TestCase):
+    """Having accessed resources in a zip file should not keep an open
+    reference to the zip.
+    """
+    ZIP_MODULE = zipdata01
+
+    def setUp(self):
+        modules = support.modules_setup()
+        self.addCleanup(support.modules_cleanup, *modules)
+
+        data_path = Path(self.ZIP_MODULE.__file__)
+        data_dir = data_path.parent
+        self.source_zip_path = data_dir / 'ziptestdata.zip'
+        self.zip_path = Path.cwd() / '{}.zip'.format(uuid.uuid4())
+        self.zip_path.write_bytes(self.source_zip_path.read_bytes())
+        sys.path.append(str(self.zip_path))
+        self.data = import_module('ziptestdata')
+
+    def tearDown(self):
+        try:
+            sys.path.remove(str(self.zip_path))
+        except ValueError:
+            pass
+
+        try:
+            del sys.path_importer_cache[str(self.zip_path)]
+            del sys.modules[self.data.__name__]
+        except KeyError:
+            pass
+
+        try:
+            support.unlink(self.zip_path)
+        except OSError:
+            # If the test fails, this will probably fail too
+            pass
+
+    def test_contents_does_not_keep_open(self):
+        c = resources.contents('ziptestdata')
+        self.zip_path.unlink()
+
+    def test_is_resource_does_not_keep_open(self):
+        c = resources.is_resource('ziptestdata', 'binary.file')
+        self.zip_path.unlink()
+
+    def test_is_resource_failure_does_not_keep_open(self):
+        c = resources.is_resource('ziptestdata', 'not-present')
+        self.zip_path.unlink()
+
+    def test_path_does_not_keep_open(self):
+        c = resources.path('ziptestdata', 'binary.file')
+        self.zip_path.unlink()
+
+    def test_entered_path_does_not_keep_open(self):
+        # This is what certifi does on import to make its bundle
+        # available for the process duration.
+        c = resources.path('ziptestdata', 'binary.file').__enter__()
+        self.zip_path.unlink()
+
+    def test_read_binary_does_not_keep_open(self):
+        c = resources.read_binary('ziptestdata', 'binary.file')
+        self.zip_path.unlink()
+
+    def test_read_text_does_not_keep_open(self):
+        c = resources.read_text('ziptestdata', 'utf-8.file', encoding='utf-8')
+        self.zip_path.unlink()
+
 if __name__ == '__main__':
     unittest.main()
diff --git a/Misc/NEWS.d/next/Library/2020-08-05-23-16-39.bpo-41490.6z47A_.rst b/Misc/NEWS.d/next/Library/2020-08-05-23-16-39.bpo-41490.6z47A_.rst
new file mode 100644
index 0000000..e89180d
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-08-05-23-16-39.bpo-41490.6z47A_.rst
@@ -0,0 +1 @@
+Update :mod:`ensurepip` to install pip 20.2.1 and setuptools 49.2.1.