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