def test_duplicate_step_names(self): steps = [ step_pb2.Step(name='foo', status=common_pb2.SCHEDULED), step_pb2.Step(name='bar', status=common_pb2.SCHEDULED), step_pb2.Step(name='foo', status=common_pb2.SCHEDULED), ] self.assert_invalid(steps, 'duplicate: u\'foo\'')
def test_duplicate_log_names(self): steps = [ step_pb2.Step( name='foo', status=common_pb2.SCHEDULED, logs=[ common_pb2.Log( name='tree', url='logdog://0', view_url='logdog.example.com/0' ), common_pb2.Log( name='branch', url='logdog://1', view_url='logdog.example.com/1' ), common_pb2.Log( name='tree', url='logdog://2', view_url='logdog.example.com/2' ) ], ), step_pb2.Step(name='bar', status=common_pb2.SCHEDULED), ] self.assert_invalid(steps, 'duplicate: u\'tree\'')
def test_unspecified_status(self): steps = [ step_pb2.Step(name='foo', status=common_pb2.SCHEDULED), step_pb2.Step(name='bar'), ] self.assert_invalid( steps, 'must have buildbucket.v2.Status that is not STATUS_UNSPECIFIED')
def test_end_before_parent_start(self): steps = [ step_pb2.Step(name='a', status=common_pb2.INFRA_FAILURE), step_pb2.Step(name='a|b', status=common_pb2.INFRA_FAILURE), ] steps[0].start_time.FromDatetime(datetime.datetime(2019, 1, 1)) steps[0].end_time.FromDatetime(datetime.datetime(2019, 2, 1)) steps[1].end_time.FromDatetime(datetime.datetime(2018, 2, 1)) self.assert_invalid( steps, r'end_time: cannot precede parent u\'a\'\'s start time')
def test_steps(self): build = test_util.build(id=1) steps = [ step_pb2.Step(name='a', status=common_pb2.SUCCESS), step_pb2.Step(name='b', status=common_pb2.STARTED), ] build_steps = model.BuildSteps.make(build_pb2.Build(id=1, steps=steps)) build_steps.put() actual = self.to_proto(build, load_steps=True) self.assertEqual(list(actual.steps), steps)
def test_missing_steps_deep(self): steps = [ step_pb2.Step(name='a', status=common_pb2.STARTED), step_pb2.Step(name='a|b', status=common_pb2.STARTED), step_pb2.Step(name='a|b|c', status=common_pb2.STARTED), step_pb2.Step(name='a|b|c|d|e', status=common_pb2.STARTED), ] for i in range(4): steps[i].start_time.FromDatetime(datetime.datetime(2018, 1, 1)) self.assert_invalid(steps, r'parent to u\'a\|b\|c\|d\|e\' must precede')
def test_end_after_parent_end(self): steps = [ step_pb2.Step(name='a', status=common_pb2.FAILURE), step_pb2.Step(name='a|b', status=common_pb2.FAILURE), ] steps[0].start_time.FromDatetime(datetime.datetime(2018, 1, 1)) steps[0].end_time.FromDatetime(datetime.datetime(2019, 1, 1)) steps[1].start_time.FromDatetime(datetime.datetime(2018, 2, 1)) steps[1].end_time.FromDatetime(datetime.datetime(2019, 2, 1)) self.assert_invalid( steps, r'end_time: cannot follow parent u\'a\'\'s end time')
def test_nonexistent_status(self): steps = [ step_pb2.Step(name='foo', status=3), ] self.assert_invalid( steps, 'must have buildbucket.v2.Status that is not STATUS_UNSPECIFIED')
def test_terminal_status_without_end_time(self, status): steps = [ step_pb2.Step(name='foo', status=status), ] steps[0].start_time.FromDatetime(datetime.datetime(2018, 1, 1)) self.assert_invalid( steps, 'must have both or neither end_time and a terminal status')
def test_parent_child_times_ok(self, child, parent, child_started, child_ended, parent_started, parent_ended): steps = [ step_pb2.Step(name='a', status=parent), step_pb2.Step(name='a|b', status=child) ] if parent_started: steps[0].start_time.FromDatetime(datetime.datetime(2018, 1, 1)) if parent_ended: steps[0].end_time.FromDatetime(datetime.datetime(2019, 2, 1)) if child_started: steps[1].start_time.FromDatetime(datetime.datetime(2018, 2, 1)) if child_ended: steps[1].end_time.FromDatetime(datetime.datetime(2019, 1, 1)) self.assert_valid(steps)
def test_started_status_without_start_time(self, status): steps = [ step_pb2.Step(name='foo', status=status), ] self.assert_invalid( steps, 'start_time: required by status %s' % status_name(status) )
def test_step_start_after_end(self, status): steps = [ step_pb2.Step(name='foo', status=status), ] steps[0].start_time.FromDatetime(datetime.datetime(2018, 1, 1)) steps[0].end_time.FromDatetime(datetime.datetime(2017, 1, 1)) self.assert_invalid(steps, 'start_time after end_time')
def test_nonterminal_with_terminal_parent(self, child, parent, needs_start): steps = [ step_pb2.Step(name='a', status=parent), step_pb2.Step(name='a|b', status=common_pb2.SUCCESS), step_pb2.Step(name='a|c', status=child), ] for i in range(3): if i < 2 or needs_start: steps[i].start_time.FromDatetime(datetime.datetime(2018, 1, 1)) if i < 2: steps[i].end_time.FromDatetime(datetime.datetime(2019, 1, 1)) self.assert_invalid( steps, r'non-terminal \(%s\) u\'a\|c\' must have STARTED parent u\'a\' \(%s\)' % (status_name(child), status_name(parent)))
def test_nonterminal_status_with_end_time(self): steps = [ step_pb2.Step(name='foo', status=common_pb2.STARTED), ] steps[0].start_time.FromDatetime(datetime.datetime(2018, 1, 1)) steps[0].end_time.FromDatetime(datetime.datetime(2019, 1, 1)) self.assert_invalid( steps, 'must have both or neither end_time and a terminal status')
def test_steps_too_big(self): msg = rpc_pb2.UpdateBuildRequest( build=build_pb2.Build(id=1, steps=[ step_pb2.Step( name='x' * 1000, status=common_pb2.SCHEDULED), ]), update_mask=field_mask_pb2.FieldMask(paths=['build.steps']), ) self.assert_invalid(msg, r'build\.steps: too big to accept')
def test_consistent_statuses(self, child, parent, needs_end): steps = [ step_pb2.Step(name='a', status=common_pb2.STARTED), step_pb2.Step(name='a|b', status=common_pb2.STARTED), step_pb2.Step(name='a|b|c', status=common_pb2.STARTED), step_pb2.Step(name='a|b|c|d', status=common_pb2.STARTED), step_pb2.Step(name='a|b|e', status=parent), step_pb2.Step(name='a|b|e|f', status=child), step_pb2.Step(name='a|b|e|f|g', status=common_pb2.SUCCESS), step_pb2.Step(name='a|b|e|f|h', status=common_pb2.SUCCESS), ] for i in range(8): steps[i].start_time.FromDatetime(datetime.datetime(2018, 1, 1)) if i > 4 or (i == 4 and needs_end): steps[i].end_time.FromDatetime(datetime.datetime(2019, 1, 1)) self.assert_valid(steps)
def test_parent_status_better_than_child(self, child, parent): steps = [ step_pb2.Step(name='a', status=common_pb2.CANCELED), step_pb2.Step(name='a|b', status=common_pb2.CANCELED), step_pb2.Step(name='a|b|c', status=common_pb2.SUCCESS), step_pb2.Step(name='a|b|c|d', status=common_pb2.SUCCESS), step_pb2.Step(name='a|b|e', status=parent), step_pb2.Step(name='a|b|e|f', status=child), step_pb2.Step(name='a|b|e|f|g', status=common_pb2.SUCCESS), step_pb2.Step(name='a|b|e|f|h', status=common_pb2.SUCCESS), ] for i in range(8): steps[i].start_time.FromDatetime(datetime.datetime(2018, 1, 1)) steps[i].end_time.FromDatetime(datetime.datetime(2019, 1, 1)) self.assert_invalid( steps, r'u\'a\|b\|e\|f\'\'s status %s is worse than parent u\'a\|b\|e\'\'s ' 'status %s' % (status_name(child), status_name(parent)))
def test_start_time_with_unstarted_status(self): steps = [ step_pb2.Step(name='foo', status=common_pb2.SCHEDULED), ] steps[0].start_time.FromDatetime(datetime.datetime(2018, 1, 1)) self.assert_invalid(steps, 'invalid for status SCHEDULED')
def test_unstarted_parent(self): steps = [ step_pb2.Step(name='a', status=common_pb2.SCHEDULED), step_pb2.Step(name='a|b', status=common_pb2.SCHEDULED), ] self.assert_invalid(steps, 'parent u\'a\' must be at least STARTED')
def test_missing_steps_shallow(self): steps = [ step_pb2.Step(name='a|b', status=common_pb2.SCHEDULED), ] self.assert_invalid(steps, r'parent to u\'a\|b\' must precede')