__main__.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # lint: pylint
  3. """Shared testing code."""
  4. # pylint: disable=missing-function-docstring
  5. import sys
  6. import os
  7. import subprocess
  8. import traceback
  9. import pathlib
  10. from splinter import Browser
  11. import tests as searx_tests
  12. from tests.robot import test_webapp
  13. class SearxRobotLayer():
  14. """Searx Robot Test Layer"""
  15. def setUp(self):
  16. os.setpgrp() # create new process group, become its leader
  17. tests_path = pathlib.Path(searx_tests.__file__).resolve().parent
  18. # get program paths
  19. webapp = str(tests_path.parent / 'searx' / 'webapp.py')
  20. exe = 'python'
  21. # The Flask app is started by Flask.run(...), don't enable Flask's debug
  22. # mode, the debugger from Flask will cause wired process model, where
  23. # the server never dies. Further read:
  24. #
  25. # - debug mode: https://flask.palletsprojects.com/quickstart/#debug-mode
  26. # - Flask.run(..): https://flask.palletsprojects.com/api/#flask.Flask.run
  27. os.environ['SEARX_DEBUG'] = '0'
  28. # set robot settings path
  29. os.environ['SEARX_SETTINGS_PATH'] = str(tests_path / 'robot' / 'settings_robot.yml')
  30. # run the server
  31. self.server = subprocess.Popen( # pylint: disable=consider-using-with
  32. [exe, webapp],
  33. stdout=subprocess.PIPE,
  34. stderr=subprocess.STDOUT
  35. )
  36. if hasattr(self.server.stdout, 'read1'):
  37. print(self.server.stdout.read1(1024).decode())
  38. def tearDown(self):
  39. os.kill(self.server.pid, 9)
  40. # remove previously set environment variable
  41. del os.environ['SEARX_SETTINGS_PATH']
  42. def run_robot_tests(tests):
  43. print('Running {0} tests'.format(len(tests)))
  44. for test in tests:
  45. with Browser('firefox', headless=True, profile_preferences={'intl.accept_languages': 'en'}) as browser:
  46. test(browser)
  47. def main():
  48. test_layer = SearxRobotLayer()
  49. try:
  50. test_layer.setUp()
  51. run_robot_tests([getattr(test_webapp, x) for x in dir(test_webapp) if x.startswith('test_')])
  52. except Exception: # pylint: disable=broad-except
  53. print('Error occured: {0}'.format(traceback.format_exc()))
  54. sys.exit(1)
  55. finally:
  56. test_layer.tearDown()
  57. if __name__ == '__main__':
  58. main()