Issue #19728: fix ensurepip name clash with submodule

Also added refactoring and added basic tests for the argument
parsing in both ensurepip._main and ensurepip._uninstall._main.
diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
index 090c410..0f43bc4 100644
--- a/Lib/ensurepip/__init__.py
+++ b/Lib/ensurepip/__init__.py
@@ -104,7 +104,7 @@
 
         _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
 
-def _uninstall(*, verbosity=0):
+def _uninstall_helper(*, verbosity=0):
     """Helper to support a clean default uninstall process on Windows
 
     Note that calling this function may alter os.environ.
@@ -129,3 +129,64 @@
         args += ["-" + "v" * verbosity]
 
     _run_pip(args + [p[0] for p in reversed(_PROJECTS)])
+
+
+def _main(argv=None):
+    import argparse
+    parser = argparse.ArgumentParser(prog="python -m ensurepip")
+    parser.add_argument(
+        "--version",
+        action="version",
+        version="pip {}".format(version()),
+        help="Show the version of pip that is bundled with this Python.",
+    )
+    parser.add_argument(
+        "-v", "--verbose",
+        action="count",
+        default=0,
+        dest="verbosity",
+        help=("Give more output. Option is additive, and can be used up to 3 "
+              "times."),
+    )
+    parser.add_argument(
+        "-U", "--upgrade",
+        action="store_true",
+        default=False,
+        help="Upgrade pip and dependencies, even if already installed.",
+    )
+    parser.add_argument(
+        "--user",
+        action="store_true",
+        default=False,
+        help="Install using the user scheme.",
+    )
+    parser.add_argument(
+        "--root",
+        default=None,
+        help="Install everything relative to this alternate root directory.",
+    )
+    parser.add_argument(
+        "--altinstall",
+        action="store_true",
+        default=False,
+        help=("Make an alternate install, installing only the X.Y versioned"
+              "scripts (Default: pipX, pipX.Y, easy_install-X.Y)"),
+    )
+    parser.add_argument(
+        "--default-pip",
+        action="store_true",
+        default=False,
+        help=("Make a default pip install, installing the unqualified pip "
+              "and easy_install in addition to the versioned scripts"),
+    )
+
+    args = parser.parse_args(argv)
+
+    bootstrap(
+        root=args.root,
+        upgrade=args.upgrade,
+        user=args.user,
+        verbosity=args.verbosity,
+        altinstall=args.altinstall,
+        default_pip=args.default_pip,
+    )
diff --git a/Lib/ensurepip/__main__.py b/Lib/ensurepip/__main__.py
index 53e8459..77527d7 100644
--- a/Lib/ensurepip/__main__.py
+++ b/Lib/ensurepip/__main__.py
@@ -1,66 +1,4 @@
-import argparse
 import ensurepip
 
-
-def main():
-    parser = argparse.ArgumentParser(prog="python -m ensurepip")
-    parser.add_argument(
-        "--version",
-        action="version",
-        version="pip {}".format(ensurepip.version()),
-        help="Show the version of pip that is bundled with this Python.",
-    )
-    parser.add_argument(
-        "-v", "--verbose",
-        action="count",
-        default=0,
-        dest="verbosity",
-        help=("Give more output. Option is additive, and can be used up to 3 "
-              "times."),
-    )
-    parser.add_argument(
-        "-U", "--upgrade",
-        action="store_true",
-        default=False,
-        help="Upgrade pip and dependencies, even if already installed.",
-    )
-    parser.add_argument(
-        "--user",
-        action="store_true",
-        default=False,
-        help="Install using the user scheme.",
-    )
-    parser.add_argument(
-        "--root",
-        default=None,
-        help="Install everything relative to this alternate root directory.",
-    )
-    parser.add_argument(
-        "--altinstall",
-        action="store_true",
-        default=False,
-        help=("Make an alternate install, installing only the X.Y versioned"
-              "scripts (Default: pipX, pipX.Y, easy_install-X.Y)"),
-    )
-    parser.add_argument(
-        "--default-pip",
-        action="store_true",
-        default=False,
-        help=("Make a default pip install, installing the unqualified pip "
-              "and easy_install in addition to the versioned scripts"),
-    )
-
-    args = parser.parse_args()
-
-    ensurepip.bootstrap(
-        root=args.root,
-        upgrade=args.upgrade,
-        user=args.user,
-        verbosity=args.verbosity,
-        altinstall=args.altinstall,
-        default_pip=args.default_pip,
-    )
-
-
 if __name__ == "__main__":
-    main()
+    ensurepip._main()
diff --git a/Lib/ensurepip/_uninstall.py b/Lib/ensurepip/_uninstall.py
index 38c486b..750365e 100644
--- a/Lib/ensurepip/_uninstall.py
+++ b/Lib/ensurepip/_uninstall.py
@@ -4,7 +4,7 @@
 import ensurepip
 
 
-def main():
+def _main(argv=None):
     parser = argparse.ArgumentParser(prog="python -m ensurepip._uninstall")
     parser.add_argument(
         "--version",
@@ -21,10 +21,10 @@
               "times."),
     )
 
-    args = parser.parse_args()
+    args = parser.parse_args(argv)
 
-    ensurepip._uninstall(verbosity=args.verbosity)
+    ensurepip._uninstall_helper(verbosity=args.verbosity)
 
 
 if __name__ == "__main__":
-    main()
+    _main()