Example #1
0
class test_build(unittest.TestCase):

    DATA = {
        'actions': [{'causes': [{'shortDescription': 'Started by user anonymous',
                                 'userId': None,
                                 'userName': '******'}]}],
        'artifacts': [],
        'building': False,
        'builtOn': '',
        'changeSet': {'items': [], 'kind': None},
        'culprits': [],
        'description': None,
        'duration': 106,
        'estimatedDuration': 106,
        'executor': None,
        'fullDisplayName': 'foo #1',
        'id': '2013-05-31_23-15-40',
        'keepLog': False,
        'number': 1,
        'result': 'SUCCESS',
        'timestamp': 1370042140000,
        'url': 'http://*****:*****@mock.patch.object(Build, '_poll')
    def setUp(self, _poll):
        _poll.return_value = self.DATA
        self.j = mock.MagicMock()  # Job
        self.j.name = 'FooJob'

        self.b = Build('http://', 97, self.j)

    def test_timestamp(self):
        self.assertIsInstance(self.b.get_timestamp(), datetime.datetime)

        expected = pytz.utc.localize(
            datetime.datetime(2013, 5, 31, 23, 15, 40))

        self.assertEqual(self.b.get_timestamp(), expected)

    def testName(self):
        with self.assertRaises(AttributeError):
            _ = self.b.id()
        self.assertEquals(self.b.name, 'foo #1')
Example #2
0
def get_build_info(last_number=0):
    server = _get_server_instance()
    job = server.get_job('build')
    last_one_build = job.__dict__['_data']['builds'][last_number]
    url = last_one_build['url']
    number = last_one_build['number']
    obj = Build(url, number, job)
    para = obj.get_params()
    print(para)
    repo_name = para['REPO_NAME']
    pjt_name = para['PROJECT_NAME']
    status = obj.get_status()
    timestamp = obj.get_timestamp().strftime("%Y-%m-%d %H:%M:%S")
    return (timestamp, repo_name, pjt_name, number, status)
Example #3
0
    def __init__(self, build: Build) -> None:
        """
        Creates a container class for a Jenkins Build object.

        Attributes:
         - timestamp: Build timestamp in UTC
         - number: Build number
         - failed: False if build was successful, True if not
         - failed_tests: List of failed test names

        :param build: A Build object from the Jenkins server
        """

        self.timestamp = build.get_timestamp().strftime('%m-%d-%Y %I:%M %p')
        self.number = build.get_number()

        self.status = build.get_status()
        if self.status == 'SUCCESS':
            self.failed = False
        else:
            self.failed = True

        self.failed_tests = []  # type: List[str]
        self.test_count = 0
        self.fail_count = 0

        if self.status != 'ABORTED' and build.has_resultset():
            self.test_count = build.get_actions()['totalCount']
            self.fail_count = build.get_actions()['failCount']

            result_set = build.get_resultset()

            for _, result in result_set.iteritems():
                test_name = result.identifier()

                if result.status == 'FAILED' or result.status == 'REGRESSION':
                    self.failed_tests.append(test_name)
Example #4
0
class test_build(unittest.TestCase):

    DATA = {
        'actions': [{'causes': [{'shortDescription': 'Started by user anonymous',
                                 'userId': None,
                                 'userName': '******'}]},
                    None,
                    {'causes': []}],
        'artifacts': [],
        'building': False,
        'builtOn': '',
        'changeSet': {'items': [], 'kind': None},
        'culprits': [],
        'description': None,
        "duration": 5782,
        'estimatedDuration': 106,
        'executor': None,
        "fingerprint": [{"fileName": "BuildId.json",
                         "hash": "e3850a45ab64aa34c1aa66e30c1a8977",
                         "original": {"name": "ArtifactGenerateJob",
                                      "number": 469},
                         "timestamp": 1380270162488,
                         "usage": [{"name": "SingleJob",
                                    "ranges": {"ranges": [{"end": 567,
                                                           "start": 566}]}},
                                   {"name": "MultipleJobs",
                                    "ranges": {"ranges": [{"end": 150,
                                                           "start": 139}]}}]
                         }],
        'fullDisplayName': 'foo #1',
        'id': '2013-05-31_23-15-40',
        'keepLog': False,
        'number': 1,
        'result': 'SUCCESS',
        'timestamp': 1370042140000,
        'url': 'http://*****:*****@mock.patch.object(Build, '_poll')
    def setUp(self, _poll):
        _poll.return_value = self.DATA
        self.j = mock.MagicMock()  # Job
        self.j.name = 'FooJob'

        self.b = Build('http://', 97, self.j)

    def test_timestamp(self):
        self.assertIsInstance(self.b.get_timestamp(), datetime.datetime)

        expected = pytz.utc.localize(
            datetime.datetime(2013, 5, 31, 23, 15, 40))

        self.assertEqual(self.b.get_timestamp(), expected)

    def testName(self):
        with self.assertRaises(AttributeError):
            self.b.id()
        self.assertEquals(self.b.name, 'foo #1')

    def test_duration(self):
        expected = datetime.timedelta(milliseconds=5782)
        self.assertEquals(self.b.get_duration(), expected)
        self.assertEquals(self.b.get_duration().seconds, 5)
        self.assertEquals(self.b.get_duration().microseconds, 782000)
        self.assertEquals(str(self.b.get_duration()), '0:00:05.782000')

    def test_get_causes(self):
        self.assertEquals(self.b.get_causes(),
                          [{'shortDescription': 'Started by user anonymous',
                            'userId': None,
                            'userName': '******'}])

    @mock.patch.object(Build, 'get_data')
    def test_build_depth(self, get_data_mock):
        build = Build('http://halob:8080/job/foo/98', 98, self.j, depth=0)
        get_data_mock.assert_called_with('http://halob:8080/job/foo/98/api/python?depth=0')

    def test_get_revision_no_scm(self):
        """ with no scm, get_revision should return None """
        self.assertEqual(self.b.get_revision(), None)
Example #5
0
class test_build(unittest.TestCase):

    DATA = {
        'actions': [{
            'causes': [{
                'shortDescription': 'Started by user anonymous',
                'userId': None,
                'userName': '******'
            }]
        }],
        'artifacts': [],
        'building':
        False,
        'builtOn':
        '',
        'changeSet': {
            'items': [],
            'kind': None
        },
        'culprits': [],
        'description':
        None,
        "duration":
        5782,
        'estimatedDuration':
        106,
        'executor':
        None,
        "fingerprint": [{
            "fileName":
            "BuildId.json",
            "hash":
            "e3850a45ab64aa34c1aa66e30c1a8977",
            "original": {
                "name": "ArtifactGenerateJob",
                "number": 469
            },
            "timestamp":
            1380270162488,
            "usage": [{
                "name": "SingleJob",
                "ranges": {
                    "ranges": [{
                        "end": 567,
                        "start": 566
                    }]
                }
            }, {
                "name": "MultipleJobs",
                "ranges": {
                    "ranges": [{
                        "end": 150,
                        "start": 139
                    }]
                }
            }]
        }],
        'fullDisplayName':
        'foo #1',
        'id':
        '2013-05-31_23-15-40',
        'keepLog':
        False,
        'number':
        1,
        'result':
        'SUCCESS',
        'timestamp':
        1370042140000,
        'url':
        'http://*****:*****@mock.patch.object(Build, '_poll')
    def setUp(self, _poll):
        _poll.return_value = self.DATA
        self.j = mock.MagicMock()  # Job
        self.j.name = 'FooJob'

        self.b = Build('http://', 97, self.j)

    def test_timestamp(self):
        self.assertIsInstance(self.b.get_timestamp(), datetime.datetime)

        expected = pytz.utc.localize(datetime.datetime(2013, 5, 31, 23, 15,
                                                       40))

        self.assertEqual(self.b.get_timestamp(), expected)

    def testName(self):
        with self.assertRaises(AttributeError):
            self.b.id()
        self.assertEquals(self.b.name, 'foo #1')

    def test_duration(self):
        expected = datetime.timedelta(milliseconds=5782)
        self.assertEquals(self.b.get_duration(), expected)
        self.assertEquals(self.b.get_duration().seconds, 5)
        self.assertEquals(self.b.get_duration().microseconds, 782000)
        self.assertEquals(str(self.b.get_duration()), '0:00:05.782000')

    @mock.patch.object(Build, 'get_data')
    def test_build_depth(self, get_data_mock):
        build = Build('http://halob:8080/job/foo/98', 98, self.j, depth=0)
        get_data_mock.assert_called_with(
            'http://halob:8080/job/foo/98/api/python?depth=0')
Example #6
0
class test_build(unittest.TestCase):

    DATA = {
        'actions': [{'causes': [{'shortDescription': 'Started by user anonymous',
                                 'userId': None,
                                 'userName': '******'}]}],
        'artifacts': [],
        'building': False,
        'builtOn': '',
        'changeSet': {'items': [], 'kind': None},
        'culprits': [],
        'description': None,
        "duration": 5782,
        'estimatedDuration': 106,
        'executor': None,
        "fingerprint": [{"fileName": "BuildId.json",
                         "hash": "e3850a45ab64aa34c1aa66e30c1a8977",
                         "original": {"name": "ArtifactGenerateJob",
                                      "number": 469},
                         "timestamp": 1380270162488,
                         "usage": [{"name": "SingleJob",
                                    "ranges": {"ranges": [{"end": 567,
                                                           "start": 566}]}},
                                   {"name": "MultipleJobs",
                                    "ranges": {"ranges": [{"end": 150,
                                                           "start": 139}]}}]
                         }],
        'fullDisplayName': 'foo #1',
        'id': '2013-05-31_23-15-40',
        'keepLog': False,
        'number': 1,
        'result': 'SUCCESS',
        'timestamp': 1370042140000,
        'url': 'http://*****:*****@mock.patch.object(Build, '_poll')
    def setUp(self, _poll):
        _poll.return_value = self.DATA
        self.j = mock.MagicMock()  # Job
        self.j.name = 'FooJob'

        self.b = Build('http://', 97, self.j)

    def test_timestamp(self):
        self.assertIsInstance(self.b.get_timestamp(), datetime.datetime)

        expected = pytz.utc.localize(
            datetime.datetime(2013, 5, 31, 23, 15, 40))

        self.assertEqual(self.b.get_timestamp(), expected)

    def testName(self):
        with self.assertRaises(AttributeError):
            self.b.id()
        self.assertEquals(self.b.name, 'foo #1')

    def test_duration(self):
        expected = datetime.timedelta(milliseconds=5782)
        self.assertEquals(self.b.get_duration(), expected)
        self.assertEquals(self.b.get_duration().seconds, 5)
        self.assertEquals(self.b.get_duration().microseconds, 782000)
        self.assertEquals(str(self.b.get_duration()), '0:00:05.782000')

    @mock.patch.object(Build, '_poll')
    def test_poll_cache(self, _poll):
        # only gets called once in interval
        b = Build('http://', 97, self.j, poll_cache_timeout=1)
        for i in range(2):
            b.poll()
        self.assertEquals(_poll.call_count, 1)
        b.poll(True)  # test force poll
        self.assertEquals(_poll.call_count, 2)

        # ensure it gets called again after cache timeout
        _poll.reset_mock()
        time.sleep(1.1)
        b.poll()
        self.assertTrue(_poll.called)

        # ensure it is disabled by default
        _poll.reset_mock()
        for i in range(2):
            self.b.poll()
        self.assertEquals(_poll.call_count, 2)
        self.assertIsNone(self.b.poll_cache_expires)
Example #7
0
class test_build(unittest.TestCase):

    DATA = {
        'actions': [{
            'causes': [{
                'shortDescription': 'Started by user anonymous',
                'userId': None,
                'userName': '******'
            }]
        }],
        'artifacts': [],
        'building':
        False,
        'builtOn':
        '',
        'changeSet': {
            'items': [],
            'kind': None
        },
        'culprits': [],
        'description':
        None,
        'duration':
        106,
        'estimatedDuration':
        106,
        'executor':
        None,
        'fullDisplayName':
        'foo #1',
        'id':
        '2013-05-31_23-15-40',
        'keepLog':
        False,
        'number':
        1,
        'result':
        'SUCCESS',
        'timestamp':
        1370042140000,
        'url':
        'http://*****:*****@mock.patch.object(Build, '_poll')
    def setUp(self, _poll):
        _poll.return_value = self.DATA
        self.j = mock.MagicMock()  # Job
        self.j.name = 'FooJob'

        self.b = Build('http://', 97, self.j)

    def test_timestamp(self):
        self.assertIsInstance(self.b.get_timestamp(), datetime.datetime)

        expected = pytz.utc.localize(datetime.datetime(2013, 5, 31, 23, 15,
                                                       40))

        self.assertEqual(self.b.get_timestamp(), expected)

    def testName(self):
        with self.assertRaises(AttributeError):
            _ = self.b.id()
        self.assertEquals(self.b.name, 'foo #1')
Example #8
0
class TestBuildCase(unittest.TestCase):

    DATA = {
        'actions': [{
            'causes': [{
                'shortDescription': 'Started by user anonymous',
                'userId': None,
                'userName': '******'
            }]
        }, None, {
            'causes': []
        }],
        'artifacts': [],
        'building':
        False,
        'builtOn':
        'localhost',
        'changeSet': {
            'items': [],
            'kind': None
        },
        'culprits': [],
        'description':
        'Best build ever!',
        "duration":
        5782,
        'estimatedDuration':
        106,
        'executor':
        None,
        "fingerprint": [{
            "fileName":
            "BuildId.json",
            "hash":
            "e3850a45ab64aa34c1aa66e30c1a8977",
            "original": {
                "name": "ArtifactGenerateJob",
                "number": 469
            },
            "timestamp":
            1380270162488,
            "usage": [{
                "name": "SingleJob",
                "ranges": {
                    "ranges": [{
                        "end": 567,
                        "start": 566
                    }]
                }
            }, {
                "name": "MultipleJobs",
                "ranges": {
                    "ranges": [{
                        "end": 150,
                        "start": 139
                    }]
                }
            }]
        }],
        'fullDisplayName':
        'foo #1',
        'id':
        '2013-05-31_23-15-40',
        'keepLog':
        False,
        'number':
        1,
        'result':
        'SUCCESS',
        'timestamp':
        1370042140000,
        'url':
        'http://*****:*****@mock.patch.object(Build, '_poll')
    def setUp(self, _poll):
        _poll.return_value = self.DATA
        self.j = mock.MagicMock()  # Job
        self.j.name = 'FooJob'

        self.b = Build('http://', 97, self.j)

    def test_timestamp(self):
        self.assertIsInstance(self.b.get_timestamp(), datetime.datetime)

        expected = pytz.utc.localize(datetime.datetime(2013, 5, 31, 23, 15,
                                                       40))

        self.assertEqual(self.b.get_timestamp(), expected)

    def testName(self):
        with self.assertRaises(AttributeError):
            self.b.id()
        self.assertEquals(self.b.name, 'foo #1')

    def test_duration(self):
        expected = datetime.timedelta(milliseconds=5782)
        self.assertEquals(self.b.get_duration(), expected)
        self.assertEquals(self.b.get_duration().seconds, 5)
        self.assertEquals(self.b.get_duration().microseconds, 782000)
        self.assertEquals(str(self.b.get_duration()), '0:00:05.782000')

    def test_get_causes(self):
        self.assertEquals(self.b.get_causes(), [{
            'shortDescription': 'Started by user anonymous',
            'userId': None,
            'userName': '******'
        }])

    def test_get_description(self):
        self.assertEquals(self.b.get_description(), 'Best build ever!')

    def test_get_slave(self):
        self.assertEquals(self.b.get_slave(), 'localhost')

    @mock.patch.object(Build, 'get_data')
    def test_build_depth(self, get_data_mock):
        Build('http://*****:*****@mock.patch.object(Build, '__init__')
    def test_get_matrix_runs(self, build_init_mock):
        build_init_mock.return_value = None
        for build in self.b.get_matrix_runs():
            continue
        build_init_mock.assert_called_once_with(
            'http//localhost:8080/job/foo/SHARD_NUM=1/1/', 1, self.j)

    def test_get_params(self):
        expected = {
            'first_param': 'first_value',
            'second_param': 'second_value',
        }
        self.b._data = {
            'actions': [{
                'parameters': [
                    {
                        'name': 'first_param',
                        'value': 'first_value'
                    },
                    {
                        'name': 'second_param',
                        'value': 'second_value'
                    },
                ]
            }]
        }
        params = self.b.get_params()

        self.assertDictEqual(params, expected)

    def test_get_params_different_order(self):
        """
        Dictionary with `parameters` key is not always the first element in
        `actions` list, so we need to search through whole array. This test
        covers such a case
        """
        expected = {
            'first_param': 'first_value',
            'second_param': 'second_value',
        }
        self.b._data = {
            'actions': [{
                'not_parameters': 'some_data',
            }, {
                'another_action': 'some_value',
            }, {
                'parameters': [
                    {
                        'name': 'first_param',
                        'value': 'first_value'
                    },
                    {
                        'name': 'second_param',
                        'value': 'second_value'
                    },
                ]
            }]
        }
        params = self.b.get_params()

        self.assertDictEqual(params, expected)
Example #9
0
class test_build(unittest.TestCase):

    DATA = {
        "actions": [
            {"causes": [{"shortDescription": "Started by user anonymous", "userId": None, "userName": "******"}]},
            None,
            {"causes": []},
        ],
        "artifacts": [],
        "building": False,
        "builtOn": "",
        "changeSet": {"items": [], "kind": None},
        "culprits": [],
        "description": None,
        "duration": 5782,
        "estimatedDuration": 106,
        "executor": None,
        "fingerprint": [
            {
                "fileName": "BuildId.json",
                "hash": "e3850a45ab64aa34c1aa66e30c1a8977",
                "original": {"name": "ArtifactGenerateJob", "number": 469},
                "timestamp": 1380270162488,
                "usage": [
                    {"name": "SingleJob", "ranges": {"ranges": [{"end": 567, "start": 566}]}},
                    {"name": "MultipleJobs", "ranges": {"ranges": [{"end": 150, "start": 139}]}},
                ],
            }
        ],
        "fullDisplayName": "foo #1",
        "id": "2013-05-31_23-15-40",
        "keepLog": False,
        "number": 1,
        "result": "SUCCESS",
        "timestamp": 1370042140000,
        "url": "http://*****:*****@mock.patch.object(Build, "_poll")
    def setUp(self, _poll):
        _poll.return_value = self.DATA
        self.j = mock.MagicMock()  # Job
        self.j.name = "FooJob"

        self.b = Build("http://", 97, self.j)

    def test_timestamp(self):
        self.assertIsInstance(self.b.get_timestamp(), datetime.datetime)

        expected = pytz.utc.localize(datetime.datetime(2013, 5, 31, 23, 15, 40))

        self.assertEqual(self.b.get_timestamp(), expected)

    def testName(self):
        with self.assertRaises(AttributeError):
            self.b.id()
        self.assertEquals(self.b.name, "foo #1")

    def test_duration(self):
        expected = datetime.timedelta(milliseconds=5782)
        self.assertEquals(self.b.get_duration(), expected)
        self.assertEquals(self.b.get_duration().seconds, 5)
        self.assertEquals(self.b.get_duration().microseconds, 782000)
        self.assertEquals(str(self.b.get_duration()), "0:00:05.782000")

    def test_get_causes(self):
        self.assertEquals(
            self.b.get_causes(),
            [{"shortDescription": "Started by user anonymous", "userId": None, "userName": "******"}],
        )

    @mock.patch.object(Build, "get_data")
    def test_build_depth(self, get_data_mock):
        Build("http://*****:*****@mock.patch.object(Build, "__init__")
    def test_get_matrix_runs(self, build_init_mock):
        build_init_mock.return_value = None
        for build in self.b.get_matrix_runs():
            continue
        build_init_mock.assert_called_once_with("http//localhost:8080/job/foo/SHARD_NUM=1/1/", 1, self.j)
Example #10
0
class test_build(unittest.TestCase):

    DATA = {
        "actions": [
            {"causes": [{"shortDescription": "Started by user anonymous", "userId": None, "userName": "******"}]}
        ],
        "artifacts": [],
        "building": False,
        "builtOn": "",
        "changeSet": {"items": [], "kind": None},
        "culprits": [],
        "description": None,
        "duration": 5782,
        "estimatedDuration": 106,
        "executor": None,
        "fingerprint": [
            {
                "fileName": "BuildId.json",
                "hash": "e3850a45ab64aa34c1aa66e30c1a8977",
                "original": {"name": "ArtifactGenerateJob", "number": 469},
                "timestamp": 1380270162488,
                "usage": [
                    {"name": "SingleJob", "ranges": {"ranges": [{"end": 567, "start": 566}]}},
                    {"name": "MultipleJobs", "ranges": {"ranges": [{"end": 150, "start": 139}]}},
                ],
            }
        ],
        "fullDisplayName": "foo #1",
        "id": "2013-05-31_23-15-40",
        "keepLog": False,
        "number": 1,
        "result": "SUCCESS",
        "timestamp": 1370042140000,
        "url": "http://*****:*****@mock.patch.object(Build, "_poll")
    # pylint: disable=W0221
    def setUp(self, _poll):
        _poll.return_value = self.DATA
        self.j = mock.MagicMock()  # Job
        self.j.name = "FooJob"

        self.b = Build("http://", 97, self.j)

    def test_timestamp(self):
        self.assertIsInstance(self.b.get_timestamp(), datetime.datetime)

        expected = pytz.utc.localize(datetime.datetime(2013, 5, 31, 23, 15, 40))

        self.assertEqual(self.b.get_timestamp(), expected)

    def testName(self):
        with self.assertRaises(AttributeError):
            self.b.id()
        self.assertEquals(self.b.name, "foo #1")

    def test_duration(self):
        expected = datetime.timedelta(milliseconds=5782)
        self.assertEquals(self.b.get_duration(), expected)
        self.assertEquals(self.b.get_duration().seconds, 5)
        self.assertEquals(self.b.get_duration().microseconds, 782000)
        self.assertEquals(str(self.b.get_duration()), "0:00:05.782000")