1package exec_test
2
3import (
4	"context"
5	"errors"
6	"io/ioutil"
7
8	"github.com/concourse/concourse/atc"
9	"github.com/concourse/concourse/atc/db/dbfakes"
10	"github.com/concourse/concourse/atc/exec"
11	"github.com/concourse/concourse/atc/exec/build"
12	"github.com/concourse/concourse/atc/exec/execfakes"
13	"github.com/concourse/concourse/atc/worker/workerfakes"
14	. "github.com/onsi/ginkgo"
15	. "github.com/onsi/gomega"
16)
17
18var _ = Describe("ArtifactInputStep", func() {
19	var (
20		ctx    context.Context
21		cancel func()
22
23		state    exec.RunState
24		delegate *execfakes.FakeBuildStepDelegate
25
26		step             exec.Step
27		stepErr          error
28		plan             atc.Plan
29		fakeBuild        *dbfakes.FakeBuild
30		fakeWorkerClient *workerfakes.FakeClient
31	)
32
33	BeforeEach(func() {
34		ctx, cancel = context.WithCancel(context.Background())
35
36		state = exec.NewRunState()
37
38		delegate = new(execfakes.FakeBuildStepDelegate)
39		delegate.StdoutReturns(ioutil.Discard)
40
41		fakeBuild = new(dbfakes.FakeBuild)
42		fakeWorkerClient = new(workerfakes.FakeClient)
43
44		plan = atc.Plan{ArtifactInput: &atc.ArtifactInputPlan{34, "some-input-artifact-name"}}
45		step = exec.NewArtifactInputStep(plan, fakeBuild, fakeWorkerClient, delegate)
46	})
47
48	AfterEach(func() {
49		cancel()
50	})
51
52	JustBeforeEach(func() {
53		stepErr = step.Run(ctx, state)
54	})
55
56	Context("when looking up the build artifact errors", func() {
57		BeforeEach(func() {
58			fakeBuild.ArtifactReturns(nil, errors.New("nope"))
59		})
60		It("returns the error", func() {
61			Expect(stepErr).To(HaveOccurred())
62		})
63	})
64
65	Context("when looking up the build artifact succeeds", func() {
66		var fakeWorkerArtifact *dbfakes.FakeWorkerArtifact
67
68		BeforeEach(func() {
69			fakeWorkerArtifact = new(dbfakes.FakeWorkerArtifact)
70			fakeBuild.ArtifactReturns(fakeWorkerArtifact, nil)
71		})
72
73		Context("when looking up the db volume fails", func() {
74			BeforeEach(func() {
75				fakeWorkerArtifact.VolumeReturns(nil, false, errors.New("nope"))
76			})
77			It("returns the error", func() {
78				Expect(stepErr).To(HaveOccurred())
79			})
80		})
81
82		Context("when the db volume does not exist", func() {
83			BeforeEach(func() {
84				fakeWorkerArtifact.VolumeReturns(nil, false, nil)
85			})
86			It("returns the error", func() {
87				Expect(stepErr).To(HaveOccurred())
88			})
89		})
90
91		Context("when the db volume does exist", func() {
92			var fakeVolume *dbfakes.FakeCreatedVolume
93
94			BeforeEach(func() {
95				fakeVolume = new(dbfakes.FakeCreatedVolume)
96				fakeWorkerArtifact.VolumeReturns(fakeVolume, true, nil)
97			})
98
99			Context("when looking up the worker volume fails", func() {
100				BeforeEach(func() {
101					fakeWorkerClient.FindVolumeReturns(nil, false, errors.New("nope"))
102				})
103				It("returns the error", func() {
104					Expect(stepErr).To(HaveOccurred())
105				})
106			})
107
108			Context("when the worker volume does not exist", func() {
109				BeforeEach(func() {
110					fakeWorkerClient.FindVolumeReturns(nil, false, nil)
111				})
112				It("returns the error", func() {
113					Expect(stepErr).To(HaveOccurred())
114				})
115			})
116
117			Context("when the volume does exist", func() {
118				var fakeWorkerVolume *workerfakes.FakeVolume
119				var fakeDBWorkerArtifact *dbfakes.FakeWorkerArtifact
120				var fakeDBCreatedVolume *dbfakes.FakeCreatedVolume
121
122				BeforeEach(func() {
123					fakeWorkerVolume = new(workerfakes.FakeVolume)
124					fakeWorkerClient.FindVolumeReturns(fakeWorkerVolume, true, nil)
125
126					fakeDBWorkerArtifact = new(dbfakes.FakeWorkerArtifact)
127					fakeDBCreatedVolume = new(dbfakes.FakeCreatedVolume)
128					fakeDBCreatedVolume.HandleReturns("some-volume-handle")
129					fakeDBWorkerArtifact.VolumeReturns(fakeDBCreatedVolume, true, nil)
130					fakeBuild.ArtifactReturns(fakeDBWorkerArtifact, nil)
131				})
132
133				It("registers the artifact", func() {
134					artifact, found := state.ArtifactRepository().ArtifactFor(build.ArtifactName("some-input-artifact-name"))
135
136					Expect(stepErr).NotTo(HaveOccurred())
137					Expect(found).To(BeTrue())
138
139					Expect(artifact.ID()).To(Equal("some-volume-handle"))
140				})
141
142				It("succeeds", func() {
143					Expect(step.Succeeded()).To(BeTrue())
144				})
145			})
146		})
147	})
148})
149