1package db_test
2
3import (
4	"os"
5	"testing"
6	"time"
7
8	"code.cloudfoundry.org/lager/lagertest"
9	sq "github.com/Masterminds/squirrel"
10
11	. "github.com/onsi/ginkgo"
12	. "github.com/onsi/gomega"
13
14	"github.com/concourse/concourse/atc"
15	"github.com/concourse/concourse/atc/creds/credsfakes"
16	"github.com/concourse/concourse/atc/db"
17	"github.com/concourse/concourse/atc/db/dbfakes"
18	"github.com/concourse/concourse/atc/db/lock"
19	"github.com/concourse/concourse/atc/metric"
20	"github.com/concourse/concourse/atc/postgresrunner"
21	"github.com/tedsuo/ifrit"
22)
23
24func TestDB(t *testing.T) {
25	RegisterFailHandler(Fail)
26	RunSpecs(t, "DB Suite")
27}
28
29var (
30	postgresRunner postgresrunner.Runner
31	dbProcess      ifrit.Process
32
33	dbConn                              db.Conn
34	fakeSecrets                         *credsfakes.FakeSecrets
35	fakeVarSourcePool                   *credsfakes.FakeVarSourcePool
36	componentFactory                    db.ComponentFactory
37	buildFactory                        db.BuildFactory
38	volumeRepository                    db.VolumeRepository
39	containerRepository                 db.ContainerRepository
40	teamFactory                         db.TeamFactory
41	workerFactory                       db.WorkerFactory
42	workerLifecycle                     db.WorkerLifecycle
43	resourceConfigCheckSessionLifecycle db.ResourceConfigCheckSessionLifecycle
44	resourceConfigFactory               db.ResourceConfigFactory
45	resourceCacheFactory                db.ResourceCacheFactory
46	taskCacheFactory                    db.TaskCacheFactory
47	checkFactory                        db.CheckFactory
48	workerBaseResourceTypeFactory       db.WorkerBaseResourceTypeFactory
49	workerTaskCacheFactory              db.WorkerTaskCacheFactory
50	userFactory                         db.UserFactory
51	dbWall                              db.Wall
52	fakeClock                           dbfakes.FakeClock
53
54	defaultWorkerResourceType atc.WorkerResourceType
55	defaultTeam               db.Team
56	defaultWorkerPayload      atc.Worker
57	defaultWorker             db.Worker
58	otherWorker               db.Worker
59	otherWorkerPayload        atc.Worker
60	defaultResourceType       db.ResourceType
61	defaultResource           db.Resource
62	defaultPipelineConfig     atc.Config
63	defaultPipeline           db.Pipeline
64	defaultJob                db.Job
65	logger                    *lagertest.TestLogger
66	lockFactory               lock.LockFactory
67
68	fullMetadata = db.ContainerMetadata{
69		Type: db.ContainerTypeTask,
70
71		StepName: "some-step-name",
72		Attempt:  "1.2.3",
73
74		PipelineID: 123,
75		JobID:      456,
76		BuildID:    789,
77
78		PipelineName: "some-pipeline",
79		JobName:      "some-job",
80		BuildName:    "some-build",
81
82		WorkingDirectory: "/some/work/dir",
83		User:             "some-user",
84	}
85
86	psql = sq.StatementBuilder.PlaceholderFormat(sq.Dollar)
87)
88
89var _ = BeforeSuite(func() {
90	postgresRunner = postgresrunner.Runner{
91		Port: 5433 + GinkgoParallelNode(),
92	}
93
94	dbProcess = ifrit.Invoke(postgresRunner)
95
96	postgresRunner.CreateTestDB()
97})
98
99var _ = BeforeEach(func() {
100	postgresRunner.Truncate()
101
102	dbConn = postgresRunner.OpenConn()
103
104	lockFactory = lock.NewLockFactory(postgresRunner.OpenSingleton(), metric.LogLockAcquired, metric.LogLockReleased)
105
106	fakeSecrets = new(credsfakes.FakeSecrets)
107	fakeVarSourcePool = new(credsfakes.FakeVarSourcePool)
108	componentFactory = db.NewComponentFactory(dbConn)
109	buildFactory = db.NewBuildFactory(dbConn, lockFactory, 5*time.Minute, 5*time.Minute)
110	volumeRepository = db.NewVolumeRepository(dbConn)
111	containerRepository = db.NewContainerRepository(dbConn)
112	teamFactory = db.NewTeamFactory(dbConn, lockFactory)
113	workerFactory = db.NewWorkerFactory(dbConn)
114	workerLifecycle = db.NewWorkerLifecycle(dbConn)
115	resourceConfigCheckSessionLifecycle = db.NewResourceConfigCheckSessionLifecycle(dbConn)
116	resourceConfigFactory = db.NewResourceConfigFactory(dbConn, lockFactory)
117	resourceCacheFactory = db.NewResourceCacheFactory(dbConn, lockFactory)
118	taskCacheFactory = db.NewTaskCacheFactory(dbConn)
119	checkFactory = db.NewCheckFactory(dbConn, lockFactory, fakeSecrets, fakeVarSourcePool, time.Minute)
120	workerBaseResourceTypeFactory = db.NewWorkerBaseResourceTypeFactory(dbConn)
121	workerTaskCacheFactory = db.NewWorkerTaskCacheFactory(dbConn)
122	userFactory = db.NewUserFactory(dbConn)
123	dbWall = db.NewWall(dbConn, &fakeClock)
124
125	var err error
126	defaultTeam, err = teamFactory.CreateTeam(atc.Team{Name: "default-team"})
127	Expect(err).NotTo(HaveOccurred())
128
129	defaultWorkerResourceType = atc.WorkerResourceType{
130		Type:    "some-base-resource-type",
131		Image:   "/path/to/image",
132		Version: "some-brt-version",
133	}
134
135	certsPath := "/etc/ssl/certs"
136
137	defaultWorkerPayload = atc.Worker{
138		ResourceTypes:   []atc.WorkerResourceType{defaultWorkerResourceType},
139		Name:            "default-worker",
140		GardenAddr:      "1.2.3.4:7777",
141		BaggageclaimURL: "5.6.7.8:7878",
142		CertsPath:       &certsPath,
143	}
144
145	otherWorkerPayload = atc.Worker{
146		ResourceTypes:   []atc.WorkerResourceType{defaultWorkerResourceType},
147		Name:            "other-worker",
148		GardenAddr:      "2.3.4.5:7777",
149		BaggageclaimURL: "6.7.8.9:7878",
150		CertsPath:       &certsPath,
151	}
152
153	defaultWorker, err = workerFactory.SaveWorker(defaultWorkerPayload, 0)
154	Expect(err).NotTo(HaveOccurred())
155
156	otherWorker, err = workerFactory.SaveWorker(otherWorkerPayload, 0)
157	Expect(err).NotTo(HaveOccurred())
158
159	defaultPipelineConfig = atc.Config{
160		Jobs: atc.JobConfigs{
161			{
162				Name: "some-job",
163			},
164		},
165		Resources: atc.ResourceConfigs{
166			{
167				Name: "some-resource",
168				Type: "some-base-resource-type",
169				Source: atc.Source{
170					"some": "source",
171				},
172			},
173		},
174		ResourceTypes: atc.ResourceTypes{
175			{
176				Name: "some-type",
177				Type: "some-base-resource-type",
178				Source: atc.Source{
179					"some-type": "source",
180				},
181			},
182		},
183	}
184
185	defaultPipeline, _, err = defaultTeam.SavePipeline("default-pipeline", defaultPipelineConfig, db.ConfigVersion(0), false)
186	Expect(err).NotTo(HaveOccurred())
187
188	var found bool
189	defaultResourceType, found, err = defaultPipeline.ResourceType("some-type")
190	Expect(err).NotTo(HaveOccurred())
191	Expect(found).To(BeTrue())
192
193	defaultResource, found, err = defaultPipeline.Resource("some-resource")
194	Expect(err).NotTo(HaveOccurred())
195	Expect(found).To(BeTrue())
196
197	defaultJob, found, err = defaultPipeline.Job("some-job")
198	Expect(err).NotTo(HaveOccurred())
199	Expect(found).To(BeTrue())
200
201	logger = lagertest.NewTestLogger("test")
202})
203
204func destroy(d interface{ Destroy() error }) {
205	err := d.Destroy()
206	Expect(err).ToNot(HaveOccurred())
207}
208
209var _ = AfterEach(func() {
210	err := dbConn.Close()
211	Expect(err).NotTo(HaveOccurred())
212})
213
214var _ = AfterSuite(func() {
215	dbProcess.Signal(os.Interrupt)
216	<-dbProcess.Wait()
217})
218