test_get_developers.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. """Test cases for utils/get-developers.
  2. It does not inherit from infra.basetest.BRTest and therefore does not generate
  3. a logfile. Only when the tests fail there will be output to the console.
  4. The file syntax is already tested by the GitLab-CI job check-DEVELOPERS.
  5. """
  6. import os
  7. import subprocess
  8. import tempfile
  9. import unittest
  10. import infra
  11. def call_script(args, env, cwd):
  12. """Call a script and return stdout and stderr as lists and the exit code."""
  13. proc = subprocess.Popen(args, cwd=cwd, stdout=subprocess.PIPE,
  14. stderr=subprocess.PIPE, env=env,
  15. universal_newlines=True)
  16. out, err = proc.communicate()
  17. return out.splitlines(), err.splitlines(), proc.returncode
  18. def call_get_developers(cmd, args, env, cwd, developers_content):
  19. """Call get-developers overrinding the default DEVELOPERS file."""
  20. with tempfile.NamedTemporaryFile(buffering=0) as developers_file:
  21. developers_file.write(developers_content)
  22. return call_script([cmd, "-d", developers_file.name] + args, env, cwd)
  23. class TestGetDevelopers(unittest.TestCase):
  24. """Test the various ways the script can be called in a simple top to bottom sequence."""
  25. WITH_EMPTY_PATH = {}
  26. WITH_UTILS_IN_PATH = {"PATH": infra.basepath("utils") + ":" + os.environ["PATH"]}
  27. def test_run(self):
  28. topdir = infra.basepath()
  29. # no args, with syntax error in the file
  30. developers = b'text3\n'
  31. out, err, rc = call_get_developers("./utils/get-developers", [], self.WITH_EMPTY_PATH, topdir, developers)
  32. self.assertIn("No action specified", out)
  33. self.assertEqual(rc, 0)
  34. self.assertEqual(len(err), 0)
  35. # -v generating error, called from the main dir
  36. developers = b'text1\n'
  37. out, err, rc = call_get_developers("./utils/get-developers", ["-v"], self.WITH_EMPTY_PATH, topdir, developers)
  38. self.assertIn("Syntax error in DEVELOPERS file, line 0: 'text1'", err)
  39. self.assertEqual(rc, 1)
  40. self.assertEqual(len(out), 0)
  41. # -v generating error, called from path
  42. developers = b'text2\n'
  43. out, err, rc = call_get_developers("get-developers", ["-v"], self.WITH_UTILS_IN_PATH, topdir, developers)
  44. self.assertIn("Syntax error in DEVELOPERS file, line 0: 'text2'", err)
  45. self.assertEqual(rc, 1)
  46. self.assertEqual(len(out), 0)
  47. # -c generating warning and printing lots of files with no developer
  48. developers = b'N:\tAuthor <email>\n' \
  49. b'F:\tpath/that/does/not/exists/1\n' \
  50. b'F:\tpath/that/does/not/exists/2\n'
  51. out, err, rc = call_get_developers("./utils/get-developers", ["-c"], self.WITH_EMPTY_PATH, topdir, developers)
  52. self.assertIn("WARNING: 'path/that/does/not/exists/1' doesn't match any file", err)
  53. self.assertIn("WARNING: 'path/that/does/not/exists/2' doesn't match any file", err)
  54. self.assertEqual(rc, 0)
  55. self.assertGreater(len(out), 1000)
  56. # -p lists more than one developer
  57. developers = b'N:\tdev1\n' \
  58. b'F:\ttoolchain/\n' \
  59. b'\n' \
  60. b'N:\tdev2\n' \
  61. b'F:\ttoolchain/\n'
  62. out, err, rc = call_get_developers("./utils/get-developers", ["-p", "toolchain"], self.WITH_EMPTY_PATH, topdir, developers)
  63. self.assertIn("dev1", out)
  64. self.assertIn("dev2", out)
  65. self.assertEqual(rc, 0)
  66. self.assertEqual(len(err), 0)
  67. # no args, with syntax error in the file
  68. developers = b'text3\n'
  69. out, err, rc = call_get_developers("./utils/get-developers", [], self.WITH_EMPTY_PATH, topdir, developers)
  70. self.assertIn("No action specified", out)
  71. self.assertEqual(rc, 0)
  72. self.assertEqual(len(err), 0)
  73. # patchfile from topdir and from elsewhere
  74. abs_path = infra.filepath("tests/utils/test_get_developers/")
  75. rel_file = "0001-package-binutils-change-.mk.patch"
  76. abs_file = os.path.join(abs_path, rel_file)
  77. developers = b'N:\tdev1\n' \
  78. b'F:\tpackage/binutils/\n'
  79. out, err, rc = call_get_developers("./utils/get-developers", [abs_file], self.WITH_EMPTY_PATH, topdir, developers)
  80. self.assertIn('git send-email --to buildroot@buildroot.org --cc "dev1"', out)
  81. self.assertEqual(rc, 0)
  82. self.assertEqual(len(err), 0)
  83. out, err, rc = call_get_developers("get-developers", [rel_file], self.WITH_UTILS_IN_PATH, abs_path, developers)
  84. self.assertIn('git send-email --to buildroot@buildroot.org --cc "dev1"', out)
  85. self.assertEqual(rc, 0)
  86. self.assertEqual(len(err), 0)