17db96d56Sopenharmony_ciimport webbrowser
27db96d56Sopenharmony_ciimport unittest
37db96d56Sopenharmony_ciimport os
47db96d56Sopenharmony_ciimport sys
57db96d56Sopenharmony_ciimport subprocess
67db96d56Sopenharmony_cifrom unittest import mock
77db96d56Sopenharmony_cifrom test import support
87db96d56Sopenharmony_cifrom test.support import import_helper
97db96d56Sopenharmony_cifrom test.support import os_helper
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ciif not support.has_subprocess_support:
127db96d56Sopenharmony_ci    raise unittest.SkipTest("test webserver requires subprocess")
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciURL = 'http://www.example.com'
157db96d56Sopenharmony_ciCMD_NAME = 'test'
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ciclass PopenMock(mock.MagicMock):
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci    def poll(self):
217db96d56Sopenharmony_ci        return 0
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci    def wait(self, seconds=None):
247db96d56Sopenharmony_ci        return 0
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ciclass CommandTestMixin:
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci    def _test(self, meth, *, args=[URL], kw={}, options, arguments):
307db96d56Sopenharmony_ci        """Given a web browser instance method name along with arguments and
317db96d56Sopenharmony_ci        keywords for same (which defaults to the single argument URL), creates
327db96d56Sopenharmony_ci        a browser instance from the class pointed to by self.browser, calls the
337db96d56Sopenharmony_ci        indicated instance method with the indicated arguments, and compares
347db96d56Sopenharmony_ci        the resulting options and arguments passed to Popen by the browser
357db96d56Sopenharmony_ci        instance against the 'options' and 'args' lists.  Options are compared
367db96d56Sopenharmony_ci        in a position independent fashion, and the arguments are compared in
377db96d56Sopenharmony_ci        sequence order to whatever is left over after removing the options.
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci        """
407db96d56Sopenharmony_ci        popen = PopenMock()
417db96d56Sopenharmony_ci        support.patch(self, subprocess, 'Popen', popen)
427db96d56Sopenharmony_ci        browser = self.browser_class(name=CMD_NAME)
437db96d56Sopenharmony_ci        getattr(browser, meth)(*args, **kw)
447db96d56Sopenharmony_ci        popen_args = subprocess.Popen.call_args[0][0]
457db96d56Sopenharmony_ci        self.assertEqual(popen_args[0], CMD_NAME)
467db96d56Sopenharmony_ci        popen_args.pop(0)
477db96d56Sopenharmony_ci        for option in options:
487db96d56Sopenharmony_ci            self.assertIn(option, popen_args)
497db96d56Sopenharmony_ci            popen_args.pop(popen_args.index(option))
507db96d56Sopenharmony_ci        self.assertEqual(popen_args, arguments)
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ciclass GenericBrowserCommandTest(CommandTestMixin, unittest.TestCase):
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci    browser_class = webbrowser.GenericBrowser
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci    def test_open(self):
587db96d56Sopenharmony_ci        self._test('open',
597db96d56Sopenharmony_ci                   options=[],
607db96d56Sopenharmony_ci                   arguments=[URL])
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ciclass BackgroundBrowserCommandTest(CommandTestMixin, unittest.TestCase):
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci    browser_class = webbrowser.BackgroundBrowser
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci    def test_open(self):
687db96d56Sopenharmony_ci        self._test('open',
697db96d56Sopenharmony_ci                   options=[],
707db96d56Sopenharmony_ci                   arguments=[URL])
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ciclass ChromeCommandTest(CommandTestMixin, unittest.TestCase):
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci    browser_class = webbrowser.Chrome
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci    def test_open(self):
787db96d56Sopenharmony_ci        self._test('open',
797db96d56Sopenharmony_ci                   options=[],
807db96d56Sopenharmony_ci                   arguments=[URL])
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci    def test_open_with_autoraise_false(self):
837db96d56Sopenharmony_ci        self._test('open', kw=dict(autoraise=False),
847db96d56Sopenharmony_ci                   options=[],
857db96d56Sopenharmony_ci                   arguments=[URL])
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci    def test_open_new(self):
887db96d56Sopenharmony_ci        self._test('open_new',
897db96d56Sopenharmony_ci                   options=['--new-window'],
907db96d56Sopenharmony_ci                   arguments=[URL])
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci    def test_open_new_tab(self):
937db96d56Sopenharmony_ci        self._test('open_new_tab',
947db96d56Sopenharmony_ci                   options=[],
957db96d56Sopenharmony_ci                   arguments=[URL])
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ciclass MozillaCommandTest(CommandTestMixin, unittest.TestCase):
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci    browser_class = webbrowser.Mozilla
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci    def test_open(self):
1037db96d56Sopenharmony_ci        self._test('open',
1047db96d56Sopenharmony_ci                   options=[],
1057db96d56Sopenharmony_ci                   arguments=[URL])
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci    def test_open_with_autoraise_false(self):
1087db96d56Sopenharmony_ci        self._test('open', kw=dict(autoraise=False),
1097db96d56Sopenharmony_ci                   options=[],
1107db96d56Sopenharmony_ci                   arguments=[URL])
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci    def test_open_new(self):
1137db96d56Sopenharmony_ci        self._test('open_new',
1147db96d56Sopenharmony_ci                   options=[],
1157db96d56Sopenharmony_ci                   arguments=['-new-window', URL])
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci    def test_open_new_tab(self):
1187db96d56Sopenharmony_ci        self._test('open_new_tab',
1197db96d56Sopenharmony_ci                   options=[],
1207db96d56Sopenharmony_ci                   arguments=['-new-tab', URL])
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ciclass NetscapeCommandTest(CommandTestMixin, unittest.TestCase):
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci    browser_class = webbrowser.Netscape
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ci    def test_open(self):
1287db96d56Sopenharmony_ci        self._test('open',
1297db96d56Sopenharmony_ci                   options=['-raise', '-remote'],
1307db96d56Sopenharmony_ci                   arguments=['openURL({})'.format(URL)])
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci    def test_open_with_autoraise_false(self):
1337db96d56Sopenharmony_ci        self._test('open', kw=dict(autoraise=False),
1347db96d56Sopenharmony_ci                   options=['-noraise', '-remote'],
1357db96d56Sopenharmony_ci                   arguments=['openURL({})'.format(URL)])
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci    def test_open_new(self):
1387db96d56Sopenharmony_ci        self._test('open_new',
1397db96d56Sopenharmony_ci                   options=['-raise', '-remote'],
1407db96d56Sopenharmony_ci                   arguments=['openURL({},new-window)'.format(URL)])
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci    def test_open_new_tab(self):
1437db96d56Sopenharmony_ci        self._test('open_new_tab',
1447db96d56Sopenharmony_ci                   options=['-raise', '-remote'],
1457db96d56Sopenharmony_ci                   arguments=['openURL({},new-tab)'.format(URL)])
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ciclass GaleonCommandTest(CommandTestMixin, unittest.TestCase):
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci    browser_class = webbrowser.Galeon
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci    def test_open(self):
1537db96d56Sopenharmony_ci        self._test('open',
1547db96d56Sopenharmony_ci                   options=['-n'],
1557db96d56Sopenharmony_ci                   arguments=[URL])
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci    def test_open_with_autoraise_false(self):
1587db96d56Sopenharmony_ci        self._test('open', kw=dict(autoraise=False),
1597db96d56Sopenharmony_ci                   options=['-noraise', '-n'],
1607db96d56Sopenharmony_ci                   arguments=[URL])
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci    def test_open_new(self):
1637db96d56Sopenharmony_ci        self._test('open_new',
1647db96d56Sopenharmony_ci                   options=['-w'],
1657db96d56Sopenharmony_ci                   arguments=[URL])
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci    def test_open_new_tab(self):
1687db96d56Sopenharmony_ci        self._test('open_new_tab',
1697db96d56Sopenharmony_ci                   options=['-w'],
1707db96d56Sopenharmony_ci                   arguments=[URL])
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ciclass OperaCommandTest(CommandTestMixin, unittest.TestCase):
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci    browser_class = webbrowser.Opera
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci    def test_open(self):
1787db96d56Sopenharmony_ci        self._test('open',
1797db96d56Sopenharmony_ci                   options=[],
1807db96d56Sopenharmony_ci                   arguments=[URL])
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci    def test_open_with_autoraise_false(self):
1837db96d56Sopenharmony_ci        self._test('open', kw=dict(autoraise=False),
1847db96d56Sopenharmony_ci                   options=[],
1857db96d56Sopenharmony_ci                   arguments=[URL])
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci    def test_open_new(self):
1887db96d56Sopenharmony_ci        self._test('open_new',
1897db96d56Sopenharmony_ci                   options=['--new-window'],
1907db96d56Sopenharmony_ci                   arguments=[URL])
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci    def test_open_new_tab(self):
1937db96d56Sopenharmony_ci        self._test('open_new_tab',
1947db96d56Sopenharmony_ci                   options=[],
1957db96d56Sopenharmony_ci                   arguments=[URL])
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ciclass ELinksCommandTest(CommandTestMixin, unittest.TestCase):
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci    browser_class = webbrowser.Elinks
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci    def test_open(self):
2037db96d56Sopenharmony_ci        self._test('open', options=['-remote'],
2047db96d56Sopenharmony_ci                           arguments=['openURL({})'.format(URL)])
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci    def test_open_with_autoraise_false(self):
2077db96d56Sopenharmony_ci        self._test('open',
2087db96d56Sopenharmony_ci                   options=['-remote'],
2097db96d56Sopenharmony_ci                   arguments=['openURL({})'.format(URL)])
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_ci    def test_open_new(self):
2127db96d56Sopenharmony_ci        self._test('open_new',
2137db96d56Sopenharmony_ci                   options=['-remote'],
2147db96d56Sopenharmony_ci                   arguments=['openURL({},new-window)'.format(URL)])
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci    def test_open_new_tab(self):
2177db96d56Sopenharmony_ci        self._test('open_new_tab',
2187db96d56Sopenharmony_ci                   options=['-remote'],
2197db96d56Sopenharmony_ci                   arguments=['openURL({},new-tab)'.format(URL)])
2207db96d56Sopenharmony_ci
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ciclass BrowserRegistrationTest(unittest.TestCase):
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci    def setUp(self):
2257db96d56Sopenharmony_ci        # Ensure we don't alter the real registered browser details
2267db96d56Sopenharmony_ci        self._saved_tryorder = webbrowser._tryorder
2277db96d56Sopenharmony_ci        webbrowser._tryorder = []
2287db96d56Sopenharmony_ci        self._saved_browsers = webbrowser._browsers
2297db96d56Sopenharmony_ci        webbrowser._browsers = {}
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ci    def tearDown(self):
2327db96d56Sopenharmony_ci        webbrowser._tryorder = self._saved_tryorder
2337db96d56Sopenharmony_ci        webbrowser._browsers = self._saved_browsers
2347db96d56Sopenharmony_ci
2357db96d56Sopenharmony_ci    def _check_registration(self, preferred):
2367db96d56Sopenharmony_ci        class ExampleBrowser:
2377db96d56Sopenharmony_ci            pass
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ci        expected_tryorder = []
2407db96d56Sopenharmony_ci        expected_browsers = {}
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci        self.assertEqual(webbrowser._tryorder, expected_tryorder)
2437db96d56Sopenharmony_ci        self.assertEqual(webbrowser._browsers, expected_browsers)
2447db96d56Sopenharmony_ci
2457db96d56Sopenharmony_ci        webbrowser.register('Example1', ExampleBrowser)
2467db96d56Sopenharmony_ci        expected_tryorder = ['Example1']
2477db96d56Sopenharmony_ci        expected_browsers['example1'] = [ExampleBrowser, None]
2487db96d56Sopenharmony_ci        self.assertEqual(webbrowser._tryorder, expected_tryorder)
2497db96d56Sopenharmony_ci        self.assertEqual(webbrowser._browsers, expected_browsers)
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci        instance = ExampleBrowser()
2527db96d56Sopenharmony_ci        if preferred is not None:
2537db96d56Sopenharmony_ci            webbrowser.register('example2', ExampleBrowser, instance,
2547db96d56Sopenharmony_ci                                preferred=preferred)
2557db96d56Sopenharmony_ci        else:
2567db96d56Sopenharmony_ci            webbrowser.register('example2', ExampleBrowser, instance)
2577db96d56Sopenharmony_ci        if preferred:
2587db96d56Sopenharmony_ci            expected_tryorder = ['example2', 'Example1']
2597db96d56Sopenharmony_ci        else:
2607db96d56Sopenharmony_ci            expected_tryorder = ['Example1', 'example2']
2617db96d56Sopenharmony_ci        expected_browsers['example2'] = [ExampleBrowser, instance]
2627db96d56Sopenharmony_ci        self.assertEqual(webbrowser._tryorder, expected_tryorder)
2637db96d56Sopenharmony_ci        self.assertEqual(webbrowser._browsers, expected_browsers)
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci    def test_register(self):
2667db96d56Sopenharmony_ci        self._check_registration(preferred=False)
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci    def test_register_default(self):
2697db96d56Sopenharmony_ci        self._check_registration(preferred=None)
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci    def test_register_preferred(self):
2727db96d56Sopenharmony_ci        self._check_registration(preferred=True)
2737db96d56Sopenharmony_ci
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ciclass ImportTest(unittest.TestCase):
2767db96d56Sopenharmony_ci    def test_register(self):
2777db96d56Sopenharmony_ci        webbrowser = import_helper.import_fresh_module('webbrowser')
2787db96d56Sopenharmony_ci        self.assertIsNone(webbrowser._tryorder)
2797db96d56Sopenharmony_ci        self.assertFalse(webbrowser._browsers)
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ci        class ExampleBrowser:
2827db96d56Sopenharmony_ci            pass
2837db96d56Sopenharmony_ci        webbrowser.register('Example1', ExampleBrowser)
2847db96d56Sopenharmony_ci        self.assertTrue(webbrowser._tryorder)
2857db96d56Sopenharmony_ci        self.assertEqual(webbrowser._tryorder[-1], 'Example1')
2867db96d56Sopenharmony_ci        self.assertTrue(webbrowser._browsers)
2877db96d56Sopenharmony_ci        self.assertIn('example1', webbrowser._browsers)
2887db96d56Sopenharmony_ci        self.assertEqual(webbrowser._browsers['example1'], [ExampleBrowser, None])
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci    def test_get(self):
2917db96d56Sopenharmony_ci        webbrowser = import_helper.import_fresh_module('webbrowser')
2927db96d56Sopenharmony_ci        self.assertIsNone(webbrowser._tryorder)
2937db96d56Sopenharmony_ci        self.assertFalse(webbrowser._browsers)
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ci        with self.assertRaises(webbrowser.Error):
2967db96d56Sopenharmony_ci            webbrowser.get('fakebrowser')
2977db96d56Sopenharmony_ci        self.assertIsNotNone(webbrowser._tryorder)
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci    def test_synthesize(self):
3007db96d56Sopenharmony_ci        webbrowser = import_helper.import_fresh_module('webbrowser')
3017db96d56Sopenharmony_ci        name = os.path.basename(sys.executable).lower()
3027db96d56Sopenharmony_ci        webbrowser.register(name, None, webbrowser.GenericBrowser(name))
3037db96d56Sopenharmony_ci        webbrowser.get(sys.executable)
3047db96d56Sopenharmony_ci
3057db96d56Sopenharmony_ci    def test_environment(self):
3067db96d56Sopenharmony_ci        webbrowser = import_helper.import_fresh_module('webbrowser')
3077db96d56Sopenharmony_ci        try:
3087db96d56Sopenharmony_ci            browser = webbrowser.get().name
3097db96d56Sopenharmony_ci        except webbrowser.Error as err:
3107db96d56Sopenharmony_ci            self.skipTest(str(err))
3117db96d56Sopenharmony_ci        with os_helper.EnvironmentVarGuard() as env:
3127db96d56Sopenharmony_ci            env["BROWSER"] = browser
3137db96d56Sopenharmony_ci            webbrowser = import_helper.import_fresh_module('webbrowser')
3147db96d56Sopenharmony_ci            webbrowser.get()
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ci    def test_environment_preferred(self):
3177db96d56Sopenharmony_ci        webbrowser = import_helper.import_fresh_module('webbrowser')
3187db96d56Sopenharmony_ci        try:
3197db96d56Sopenharmony_ci            webbrowser.get()
3207db96d56Sopenharmony_ci            least_preferred_browser = webbrowser.get(webbrowser._tryorder[-1]).name
3217db96d56Sopenharmony_ci        except (webbrowser.Error, IndexError) as err:
3227db96d56Sopenharmony_ci            self.skipTest(str(err))
3237db96d56Sopenharmony_ci
3247db96d56Sopenharmony_ci        with os_helper.EnvironmentVarGuard() as env:
3257db96d56Sopenharmony_ci            env["BROWSER"] = least_preferred_browser
3267db96d56Sopenharmony_ci            webbrowser = import_helper.import_fresh_module('webbrowser')
3277db96d56Sopenharmony_ci            self.assertEqual(webbrowser.get().name, least_preferred_browser)
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci        with os_helper.EnvironmentVarGuard() as env:
3307db96d56Sopenharmony_ci            env["BROWSER"] = sys.executable
3317db96d56Sopenharmony_ci            webbrowser = import_helper.import_fresh_module('webbrowser')
3327db96d56Sopenharmony_ci            self.assertEqual(webbrowser.get().name, sys.executable)
3337db96d56Sopenharmony_ci
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ciif __name__=='__main__':
3367db96d56Sopenharmony_ci    unittest.main()
337