mirror of https://github.com/mongodb/mongo
109 lines
3.9 KiB
Python
109 lines
3.9 KiB
Python
"""Simple_report test."""
|
|
import unittest
|
|
import random
|
|
import textwrap
|
|
import sys
|
|
import os
|
|
from unittest.mock import patch, mock_open
|
|
|
|
from click.testing import CliRunner
|
|
|
|
import buildscripts.simple_report
|
|
|
|
|
|
def ns(name): # pylint: disable=invalid-name
|
|
return f"buildscripts.simple_report.{name}"
|
|
|
|
|
|
def fix_newlines(string: str) -> str:
|
|
# These need to be CRLF newlines on Windows, so we split and rejoin
|
|
# on os.linesep to fix that
|
|
return os.linesep.join(string.splitlines())
|
|
|
|
|
|
class TestSimpleReport(unittest.TestCase):
|
|
def __init__(self, *args, **kwargs):
|
|
super(TestSimpleReport, self).__init__(*args, **kwargs)
|
|
self.seed = random.randrange(sys.maxsize)
|
|
self.rng = random.Random(self.seed)
|
|
|
|
def test_trivial_report(self):
|
|
"""Run test 100x with randomly generated error codes."""
|
|
print(f"TestSimpleReport.test_trivial_report seed: {self.seed}")
|
|
for _ in range(0, 100):
|
|
self._test_trivial_report() # pylint: disable=no-value-for-parameter
|
|
|
|
@patch(ns("try_combine_reports"))
|
|
@patch(ns("_clean_log_file"))
|
|
@patch(ns("put_report"))
|
|
def _test_trivial_report(self, mock_put_report, mock_clean_log_file, _mock_try_combine_reports):
|
|
exit_code = self.rng.randint(0, 254)
|
|
print(f"Trying exit code: {exit_code}")
|
|
mock_clean_log_file.return_value = "I'm a little test log, short and stdout."
|
|
runner = CliRunner()
|
|
result = runner.invoke(
|
|
buildscripts.simple_report.main,
|
|
["--test-name", "potato", "--log-file", "test.log", "--exit-code",
|
|
str(exit_code)])
|
|
report = mock_put_report.call_args[0][0]
|
|
results = mock_put_report.call_args[0][0]["results"]
|
|
if exit_code == 0:
|
|
self.assertEqual(results[0]["status"], "pass")
|
|
self.assertEqual(report["failures"], 0)
|
|
else:
|
|
self.assertEqual(results[0]["status"], "fail")
|
|
self.assertEqual(report["failures"], 1)
|
|
self.assertEqual(result.exit_code, 0)
|
|
|
|
@patch(ns("try_combine_reports"))
|
|
@patch(ns("put_report"))
|
|
def test_truncate_scons(self, mock_put_report, _mock_try_combine_reports):
|
|
exit_code = 0
|
|
data = fix_newlines(
|
|
textwrap.dedent("""\
|
|
TO BE TRUNCATED
|
|
TO BE TRUNCATED
|
|
TO BE TRUNCATED
|
|
TO BE TRUNCATED
|
|
scons: done reading SConscript files.
|
|
scons: Building targets ...
|
|
interesting part"""))
|
|
|
|
with patch("builtins.open", mock_open(read_data=data)) as _mock_file:
|
|
runner = CliRunner()
|
|
result = runner.invoke(
|
|
buildscripts.simple_report.main,
|
|
["--test-name", "potato", "--log-file", "test.log", "--exit-code",
|
|
str(exit_code)])
|
|
report = mock_put_report.call_args[0][0]
|
|
results = mock_put_report.call_args[0][0]["results"]
|
|
self.assertEqual(results[0]["status"], "pass")
|
|
self.assertEqual(results[0]["log_raw"], "interesting part")
|
|
self.assertEqual(report["failures"], 0)
|
|
self.assertEqual(result.exit_code, 0)
|
|
|
|
@patch(ns("try_combine_reports"))
|
|
@patch(ns("put_report"))
|
|
def test_non_scons_log(self, mock_put_report, _mock_try_combine_reports):
|
|
exit_code = 0
|
|
data = fix_newlines(
|
|
textwrap.dedent("""\
|
|
*NOT* TO BE TRUNCATED
|
|
*NOT* TO BE TRUNCATED
|
|
*NOT* TO BE TRUNCATED
|
|
*NOT* TO BE TRUNCATED
|
|
interesting part"""))
|
|
|
|
with patch("builtins.open", mock_open(read_data=data)) as _mock_file:
|
|
runner = CliRunner()
|
|
result = runner.invoke(
|
|
buildscripts.simple_report.main,
|
|
["--test-name", "potato", "--log-file", "test.log", "--exit-code",
|
|
str(exit_code)])
|
|
report = mock_put_report.call_args[0][0]
|
|
results = mock_put_report.call_args[0][0]["results"]
|
|
self.assertEqual(results[0]["status"], "pass")
|
|
self.assertEqual(results[0]["log_raw"], data)
|
|
self.assertEqual(report["failures"], 0)
|
|
self.assertEqual(result.exit_code, 0)
|