def testCompletedWithBuildbucket(self):
        """Tests Completed returns proper bool with Buildbucket."""
        buildbucket_id_dict = {'build1': 'id_1', 'build2': 'id_2'}
        statusNotCompleted = {
            'build1': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_STARTED,
                'result': None
            },
            'build2': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_SUCCESS
            }
        }
        statusCompleted = {
            'build1': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_SUCCESS
            },
            'build2': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_FAILURE
            }
        }
        builders_array = ['build1', 'build2', 'not_scheduled_build']
        slaveStatusNotCompleted = manifest_version.SlaveStatus(
            statusNotCompleted, datetime.datetime.now(), builders_array, set(),
            buildbucket_id_dict)
        slaveStatusCompleted = manifest_version.SlaveStatus(
            statusCompleted, datetime.datetime.now(), builders_array, set(),
            buildbucket_id_dict)

        self.assertFalse(slaveStatusNotCompleted.Completed())
        self.assertTrue(slaveStatusCompleted.Completed())
    def testShouldFailForStartTimeoutFalseNotCompletedWithBuildbucket(self):
        """Tests that ShouldWait doesn't fail with Buildbucket.

    With Buildbucket, make sure that we don't fail if there are missing builders
    and we're checking after the timeout but the other builders haven't
    completed.
    """
        buildbucket_id_dict = {
            'build1': 'id_1',
            'build2': 'id_2',
        }
        status = {
            'build1': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_STARTED,
                'result': None
            },
        }
        start_time = datetime.datetime.now()
        builders_array = ['build1', 'build2']
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   start_time, builders_array,
                                                   set(), buildbucket_id_dict)
        check_time = start_time + datetime.timedelta(
            minutes=slaveStatus.BUILDER_START_TIMEOUT + 1)

        self.assertFalse(
            slaveStatus.ShouldFailForBuilderStartTimeout(check_time))
    def testGetCompleted(self):
        """Tests GetCompleted returns the right builders that have completed."""
        status = {
            'passed': constants.BUILDER_STATUS_PASSED,
            'failed': constants.BUILDER_STATUS_FAILED,
            'aborted': constants.BUILDER_STATUS_ABORTED,
            'skipped': constants.BUILDER_STATUS_SKIPPED,
            'forgiven': constants.BUILDER_STATUS_FORGIVEN,
            'inflight': constants.BUILDER_STATUS_INFLIGHT,
            'missing': constants.BUILDER_STATUS_MISSING,
            'planned': constants.BUILDER_STATUS_PLANNED
        }
        builders_array = [
            'passed', 'failed', 'aborted', 'skipped', 'forgiven', 'inflight',
            'missing', 'planning'
        ]
        previous_completed = set(['passed'])
        expected_completed = set(
            ['passed', 'failed', 'aborted', 'skipped', 'forgiven'])
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   datetime.datetime.now(),
                                                   builders_array,
                                                   previous_completed)

        self.assertEqual(slaveStatus.GetCompleted(), expected_completed)
        self.assertEqual(slaveStatus.previous_completed, expected_completed)
    def testShouldFailForBuilderStartTimeoutTrueWithBuildbucket(self):
        """Tests that ShouldFailForBuilderStartTimeout says fail when it should."""
        buildbucket_id_dict = {
            'build1': 'id_1',
            'build2': 'id_2',
        }
        status = {
            'build1': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_SCHEDULED,
                'result': None
            },
            'build2': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_SUCCESS
            }
        }

        start_time = datetime.datetime.now()
        builders_array = ['build1', 'build2']
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   start_time, builders_array,
                                                   set(), buildbucket_id_dict)
        check_time = start_time + datetime.timedelta(
            minutes=slaveStatus.BUILDER_START_TIMEOUT + 1)

        self.assertTrue(
            slaveStatus.ShouldFailForBuilderStartTimeout(check_time))
    def testShouldFailForBuilderStartTimeoutFalseTooEarlyWithBuildbucket(self):
        """Tests that ShouldFailForBuilderStartTimeout doesn't fail.

    With Buildbucket, make sure that we don't fail if there are missing
    builders but we're checking before the timeout and the other builders
    have completed.
    """
        buildbucket_id_dict = {
            'build1': 'id_1',
            'build2': 'id_2',
        }
        status = {
            'build2': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_SUCCESS
            }
        }

        start_time = datetime.datetime.now()
        builders_array = ['build1', 'build2']
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   start_time, builders_array,
                                                   set(), buildbucket_id_dict)

        self.assertFalse(
            slaveStatus.ShouldFailForBuilderStartTimeout(start_time))
    def testCompleted(self):
        """Tests Completed returns proper bool."""
        statusNotCompleted = {
            'build1': constants.BUILDER_STATUS_FAILED,
            'build2': constants.BUILDER_STATUS_INFLIGHT
        }
        statusCompleted = {
            'build1': constants.BUILDER_STATUS_FAILED,
            'build2': constants.BUILDER_STATUS_PASSED
        }
        builders_array = ['build1', 'build2']
        slaveStatusNotCompleted = manifest_version.SlaveStatus(
            statusNotCompleted, datetime.datetime.now(), builders_array, set())
        slaveStatusCompleted = manifest_version.SlaveStatus(
            statusCompleted, datetime.datetime.now(), builders_array, set())

        self.assertFalse(slaveStatusNotCompleted.Completed())
        self.assertTrue(slaveStatusCompleted.Completed())
    def testShouldWaitMissingBuilder(self):
        """Tests that ShouldWait says no waiting because a builder is missing."""
        status = {'build1': constants.BUILDER_STATUS_FAILED}
        builders_array = ['build1', 'build2']
        start_time = datetime.datetime.now() - datetime.timedelta(hours=1)
        slaveStatus = manifest_version.SlaveStatus(status, start_time,
                                                   builders_array, set())

        self.assertFalse(slaveStatus.ShouldWait())
    def testShouldFailForBuilderStartTimeoutTrue(self):
        """Tests that ShouldFailForBuilderStartTimeout says fail when it should."""
        status = {'build1': constants.BUILDER_STATUS_FAILED}
        start_time = datetime.datetime.now()
        builders_array = ['build1', 'build2']
        slaveStatus = manifest_version.SlaveStatus(status, start_time,
                                                   builders_array, set())
        check_time = start_time + datetime.timedelta(
            minutes=slaveStatus.BUILDER_START_TIMEOUT + 1)

        self.assertTrue(
            slaveStatus.ShouldFailForBuilderStartTimeout(check_time))
    def testGetMissing(self):
        """Tests GetMissing returns the missing builders."""
        status = {
            'build1': constants.BUILDER_STATUS_FAILED,
            'build2': constants.BUILDER_STATUS_INFLIGHT
        }
        builders_array = ['build1', 'build2', 'missing_builder']
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   datetime.datetime.now(),
                                                   builders_array, set())

        self.assertEqual(slaveStatus.GetMissing(), ['missing_builder'])
    def testShouldWaitBuildersStillBuilding(self):
        """Tests that ShouldWait says to wait because builders still building."""
        status = {
            'build1': constants.BUILDER_STATUS_INFLIGHT,
            'build2': constants.BUILDER_STATUS_FAILED
        }
        builders_array = ['build1', 'build2']
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   datetime.datetime.now(),
                                                   builders_array, set())

        self.assertTrue(slaveStatus.ShouldWait())
    def testShouldWaitAllBuildersCompleted(self):
        """Tests that ShouldWait says no waiting because all builders finished."""
        status = {
            'build1': constants.BUILDER_STATUS_FAILED,
            'build2': constants.BUILDER_STATUS_PASSED
        }
        builders_array = ['build1', 'build2']
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   datetime.datetime.now(),
                                                   builders_array, set())

        self.assertFalse(slaveStatus.ShouldWait())
    def testGetMissingNone(self):
        """Tests GetMissing returns nothing when all builders are accounted for."""
        status = {
            'build1': constants.BUILDER_STATUS_FAILED,
            'build2': constants.BUILDER_STATUS_INFLIGHT
        }
        builders_array = ['build1', 'build2']
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   datetime.datetime.now(),
                                                   builders_array, set())

        self.assertEqual(slaveStatus.GetMissing(), [])
    def testShouldFailForBuilderStartTimeoutFalseTooEarly(self):
        """Tests that ShouldFailForBuilderStartTimeout doesn't fail.

    Make sure that we don't fail if there are missing builders but we're
    checking before the timeout and the other builders have completed.
    """
        status = {'build1': constants.BUILDER_STATUS_FAILED}
        start_time = datetime.datetime.now()
        builders_array = ['build1', 'build2']
        slaveStatus = manifest_version.SlaveStatus(status, start_time,
                                                   builders_array, set())

        self.assertFalse(
            slaveStatus.ShouldFailForBuilderStartTimeout(start_time))
    def testShouldFailForBuilderStartTimeoutFalseNotCompleted(self):
        """Tests that ShouldFailForBuilderStartTimeout doesn't fail.

    Make sure that we don't fail if there are missing builders and we're
    checking after the timeout but the other builders haven't completed.
    """
        status = {'build1': constants.BUILDER_STATUS_INFLIGHT}
        start_time = datetime.datetime.now()
        builders_array = ['build1', 'build2']
        slaveStatus = manifest_version.SlaveStatus(status, start_time,
                                                   builders_array, set())
        check_time = start_time + datetime.timedelta(
            minutes=slaveStatus.BUILDER_START_TIMEOUT + 1)

        self.assertFalse(
            slaveStatus.ShouldFailForBuilderStartTimeout(check_time))
    def testGetCompletedWithBuildbucket(self):
        """Tests GetCompleted with Buildbucket"""
        buildbucket_id_dict = {
            'scheduled': 'id_1',
            'started': 'id_2',
            'completed_success': 'id_3',
            'completed_failure': 'id_4',
            'completed_canceled': 'id_5'
        }
        status = {
            'scheduled': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_SCHEDULED,
                'result': None
            },
            'started': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_STARTED,
                'result': None
            },
            'completed_success': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_SUCCESS
            },
            'completed_failure': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_FAILURE
            },
            'completed_canceled': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_CANCELED
            }
        }
        builders_array = [
            'scheduled', 'started', 'completed_success', 'completed_failure',
            'completed_canceled'
        ]
        previous_completed = set(['completed_success'])
        expected_completed = set(
            ['completed_success', 'completed_failure', 'completed_canceled'])
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   datetime.datetime.now(),
                                                   builders_array,
                                                   previous_completed,
                                                   buildbucket_id_dict)

        self.assertEqual(slaveStatus.GetCompleted(), expected_completed)
        self.assertEqual(slaveStatus.previous_completed, expected_completed)
    def testShouldWaitMissingBuilderWithBuildbucket(self):
        """ShouldWait says yes waiting because one build status is missing."""
        buildbucket_id_dict = {
            'build1': 'id_1',
            'build2': 'id_2',
        }
        status = {
            'build2': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_FAILURE
            }
        }
        builders_array = ['build1', 'build2']
        start_time = datetime.datetime.now() - datetime.timedelta(hours=1)
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   start_time, builders_array,
                                                   set(), buildbucket_id_dict)

        self.assertTrue(slaveStatus.ShouldWait())
    def testGetMissingNoneWithBuildbucket(self):
        """Tests GetMissing returns nothing with Buildbucket."""
        buildbucket_id_dict = {'build1': 'id_1', 'build2': 'id_2'}
        status = {
            'build1': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_SCHEDULED,
                'result': None
            },
            'build2': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_STARTED,
                'result': None
            }
        }
        builders_array = ['build1', 'build2']
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   datetime.datetime.now(),
                                                   builders_array, set(),
                                                   buildbucket_id_dict)

        self.assertEqual(slaveStatus.GetMissing(), [])
    def testShouldWaitBuildersStillBuildingWithBuildbucket(self):
        """ShouldWait says yes because builders still in started status."""
        buildbucket_id_dict = {
            'build1': 'id_1',
            'build2': 'id_2',
        }
        status = {
            'build1': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_STARTED,
                'result': None
            },
            'build2': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_SUCCESS
            }
        }
        builders_array = ['build1', 'build2']
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   datetime.datetime.now(),
                                                   builders_array, set(),
                                                   buildbucket_id_dict)

        self.assertTrue(slaveStatus.ShouldWait())
    def testShouldWaitNoScheduledBuilderWithBuildbucket(self):
        """ShouldWait says no because all scheduled builds are completed."""
        buildbucket_id_dict = {
            'build1': 'id_1',
            'build2': 'id_2',
        }
        status = {
            'build1': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_SUCCESS
            },
            'build2': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_FAILURE
            }
        }
        builders_array = ['build1', 'build2', 'missing_builder']
        start_time = datetime.datetime.now() - datetime.timedelta(hours=1)
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   start_time, builders_array,
                                                   set(), buildbucket_id_dict)

        self.assertFalse(slaveStatus.ShouldWait())
    def testShouldWaitAllBuildersCompletedWithBuildbucket(self):
        """ShouldWait says no because all builders finished with Buildbucket."""
        buildbucket_id_dict = {
            'build1': 'id_1',
            'build2': 'id_2',
        }
        status = {
            'build1': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_FAILURE
            },
            'build2': {
                'status': constants.BUILDBUCKET_BUILDER_STATUS_COMPLETED,
                'result': constants.BUILDBUCKET_BUILDER_RESULT_SUCCESS
            }
        }
        builders_array = ['build1', 'build2']
        slaveStatus = manifest_version.SlaveStatus(status,
                                                   datetime.datetime.now(),
                                                   builders_array, set(),
                                                   buildbucket_id_dict)

        self.assertFalse(slaveStatus.ShouldWait())