package controller import ( "fmt" "testing" "k8s.io/kubernetes/pkg/client/record" buildapi "github.com/openshift/origin/pkg/build/api" ) func TestHandleBuildConfig(t *testing.T) { tests := []struct { name string bc *buildapi.BuildConfig expectBuild bool instantiatorError bool expectErr bool }{ { name: "build config with no config change trigger", bc: baseBuildConfig(), expectBuild: false, }, { name: "build config with non-zero last version", bc: buildConfigWithNonZeroLastVersion(), expectBuild: false, }, { name: "build config with config change trigger", bc: buildConfigWithConfigChangeTrigger(), expectBuild: true, }, { name: "instantiator error", bc: buildConfigWithConfigChangeTrigger(), instantiatorError: true, expectErr: true, }, } for _, tc := range tests { instantiator := &testInstantiator{ err: tc.instantiatorError, } controller := &BuildConfigController{ BuildConfigInstantiator: instantiator, Recorder: &record.FakeRecorder{}, } err := controller.HandleBuildConfig(tc.bc) if err != nil { if !tc.expectErr { t.Errorf("%s: unexpected error: %v", tc.name, err) } continue } if err == nil && tc.expectErr { t.Errorf("%s: expected error, but got none", tc.name) continue } if tc.expectBuild && len(instantiator.requestName) == 0 { t.Errorf("%s: expected a build to be started.", tc.name) } if !tc.expectBuild && len(instantiator.requestName) > 0 { t.Errorf("%s: did not expect a build to be started.", tc.name) } } } type testInstantiator struct { requestName string err bool } func (i *testInstantiator) Instantiate(namespace string, request *buildapi.BuildRequest) (*buildapi.Build, error) { i.requestName = request.Name if i.err { return nil, fmt.Errorf("error") } return &buildapi.Build{}, nil } func baseBuildConfig() *buildapi.BuildConfig { bc := &buildapi.BuildConfig{} bc.Name = "testBuildConfig" bc.Spec.Strategy.SourceStrategy = &buildapi.SourceBuildStrategy{} bc.Spec.Strategy.SourceStrategy.From.Name = "builderimage:latest" bc.Spec.Strategy.SourceStrategy.From.Kind = "ImageStreamTag" return bc } func buildConfigWithConfigChangeTrigger() *buildapi.BuildConfig { bc := baseBuildConfig() configChangeTrigger := buildapi.BuildTriggerPolicy{} configChangeTrigger.Type = buildapi.ConfigChangeBuildTriggerType bc.Spec.Triggers = append(bc.Spec.Triggers, configChangeTrigger) return bc } func buildConfigWithNonZeroLastVersion() *buildapi.BuildConfig { bc := buildConfigWithConfigChangeTrigger() bc.Status.LastVersion = 1 return bc }