1package api_test 2 3import ( 4 "io/ioutil" 5 "net/http" 6 "net/http/httptest" 7 "sync" 8 "testing" 9 "time" 10 11 "code.cloudfoundry.org/clock/fakeclock" 12 "code.cloudfoundry.org/lager" 13 "code.cloudfoundry.org/lager/lagertest" 14 15 "github.com/concourse/concourse/atc/api" 16 "github.com/concourse/concourse/atc/api/accessor" 17 "github.com/concourse/concourse/atc/api/accessor/accessorfakes" 18 "github.com/concourse/concourse/atc/api/auth" 19 "github.com/concourse/concourse/atc/api/containerserver/containerserverfakes" 20 "github.com/concourse/concourse/atc/api/policychecker/policycheckerfakes" 21 "github.com/concourse/concourse/atc/auditor/auditorfakes" 22 "github.com/concourse/concourse/atc/creds" 23 "github.com/concourse/concourse/atc/creds/credsfakes" 24 "github.com/concourse/concourse/atc/db" 25 "github.com/concourse/concourse/atc/db/dbfakes" 26 "github.com/concourse/concourse/atc/gc/gcfakes" 27 "github.com/concourse/concourse/atc/policy" 28 "github.com/concourse/concourse/atc/worker/workerfakes" 29 "github.com/concourse/concourse/atc/wrappa" 30 31 . "github.com/onsi/ginkgo" 32 . "github.com/onsi/gomega" 33) 34 35var ( 36 sink *lager.ReconfigurableSink 37 38 externalURL = "https://example.com" 39 clusterName = "Test Cluster" 40 41 fakeWorkerClient *workerfakes.FakeClient 42 fakeVolumeRepository *dbfakes.FakeVolumeRepository 43 fakeContainerRepository *dbfakes.FakeContainerRepository 44 fakeDestroyer *gcfakes.FakeDestroyer 45 dbTeamFactory *dbfakes.FakeTeamFactory 46 dbPipelineFactory *dbfakes.FakePipelineFactory 47 dbJobFactory *dbfakes.FakeJobFactory 48 dbResourceFactory *dbfakes.FakeResourceFactory 49 dbResourceConfigFactory *dbfakes.FakeResourceConfigFactory 50 fakePipeline *dbfakes.FakePipeline 51 fakeAccess *accessorfakes.FakeAccess 52 fakeAccessor *accessorfakes.FakeAccessFactory 53 dbWorkerFactory *dbfakes.FakeWorkerFactory 54 dbWorkerLifecycle *dbfakes.FakeWorkerLifecycle 55 build *dbfakes.FakeBuild 56 dbBuildFactory *dbfakes.FakeBuildFactory 57 dbUserFactory *dbfakes.FakeUserFactory 58 dbCheckFactory *dbfakes.FakeCheckFactory 59 dbTeam *dbfakes.FakeTeam 60 dbWall *dbfakes.FakeWall 61 fakeSecretManager *credsfakes.FakeSecrets 62 fakeVarSourcePool *credsfakes.FakeVarSourcePool 63 fakePolicyChecker *policycheckerfakes.FakePolicyChecker 64 credsManagers creds.Managers 65 interceptTimeoutFactory *containerserverfakes.FakeInterceptTimeoutFactory 66 interceptTimeout *containerserverfakes.FakeInterceptTimeout 67 isTLSEnabled bool 68 cliDownloadsDir string 69 logger *lagertest.TestLogger 70 fakeClock *fakeclock.FakeClock 71 72 constructedEventHandler *fakeEventHandlerFactory 73 74 server *httptest.Server 75 client *http.Client 76) 77 78type fakeEventHandlerFactory struct { 79 build db.Build 80 81 lock sync.Mutex 82} 83 84func (f *fakeEventHandlerFactory) Construct( 85 logger lager.Logger, 86 build db.Build, 87) http.Handler { 88 f.lock.Lock() 89 f.build = build 90 f.lock.Unlock() 91 92 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 93 w.WriteHeader(http.StatusOK) 94 _, _ = w.Write([]byte("fake event handler factory was here")) 95 }) 96} 97 98var _ = BeforeEach(func() { 99 dbTeamFactory = new(dbfakes.FakeTeamFactory) 100 dbPipelineFactory = new(dbfakes.FakePipelineFactory) 101 dbJobFactory = new(dbfakes.FakeJobFactory) 102 dbResourceFactory = new(dbfakes.FakeResourceFactory) 103 dbResourceConfigFactory = new(dbfakes.FakeResourceConfigFactory) 104 dbBuildFactory = new(dbfakes.FakeBuildFactory) 105 dbUserFactory = new(dbfakes.FakeUserFactory) 106 dbCheckFactory = new(dbfakes.FakeCheckFactory) 107 dbWall = new(dbfakes.FakeWall) 108 109 interceptTimeoutFactory = new(containerserverfakes.FakeInterceptTimeoutFactory) 110 interceptTimeout = new(containerserverfakes.FakeInterceptTimeout) 111 interceptTimeoutFactory.NewInterceptTimeoutReturns(interceptTimeout) 112 113 dbTeam = new(dbfakes.FakeTeam) 114 dbTeam.IDReturns(734) 115 dbTeamFactory.FindTeamReturns(dbTeam, true, nil) 116 dbTeamFactory.GetByIDReturns(dbTeam) 117 118 fakeAccess = new(accessorfakes.FakeAccess) 119 fakeAccessor = new(accessorfakes.FakeAccessFactory) 120 fakeAccessor.CreateReturns(fakeAccess, nil) 121 122 fakePipeline = new(dbfakes.FakePipeline) 123 dbTeam.PipelineReturns(fakePipeline, true, nil) 124 125 dbWorkerFactory = new(dbfakes.FakeWorkerFactory) 126 dbWorkerLifecycle = new(dbfakes.FakeWorkerLifecycle) 127 128 fakeWorkerClient = new(workerfakes.FakeClient) 129 130 fakeVolumeRepository = new(dbfakes.FakeVolumeRepository) 131 fakeContainerRepository = new(dbfakes.FakeContainerRepository) 132 fakeDestroyer = new(gcfakes.FakeDestroyer) 133 134 fakeSecretManager = new(credsfakes.FakeSecrets) 135 fakeVarSourcePool = new(credsfakes.FakeVarSourcePool) 136 credsManagers = make(creds.Managers) 137 138 fakeClock = fakeclock.NewFakeClock(time.Unix(123, 456)) 139 140 var err error 141 cliDownloadsDir, err = ioutil.TempDir("", "cli-downloads") 142 Expect(err).NotTo(HaveOccurred()) 143 144 constructedEventHandler = &fakeEventHandlerFactory{} 145 146 logger = lagertest.NewTestLogger("api") 147 148 sink = lager.NewReconfigurableSink(lager.NewPrettySink(GinkgoWriter, lager.DEBUG), lager.DEBUG) 149 150 isTLSEnabled = false 151 152 build = new(dbfakes.FakeBuild) 153 154 checkPipelineAccessHandlerFactory := auth.NewCheckPipelineAccessHandlerFactory(dbTeamFactory) 155 156 checkBuildReadAccessHandlerFactory := auth.NewCheckBuildReadAccessHandlerFactory(dbBuildFactory) 157 158 checkBuildWriteAccessHandlerFactory := auth.NewCheckBuildWriteAccessHandlerFactory(dbBuildFactory) 159 160 checkWorkerTeamAccessHandlerFactory := auth.NewCheckWorkerTeamAccessHandlerFactory(dbWorkerFactory) 161 162 fakePolicyChecker = new(policycheckerfakes.FakePolicyChecker) 163 fakePolicyChecker.CheckReturns(policy.PassedPolicyCheck(), nil) 164 165 apiWrapper := wrappa.MultiWrappa{ 166 wrappa.NewPolicyCheckWrappa(logger, fakePolicyChecker), 167 wrappa.NewAPIAuthWrappa( 168 checkPipelineAccessHandlerFactory, 169 checkBuildReadAccessHandlerFactory, 170 checkBuildWriteAccessHandlerFactory, 171 checkWorkerTeamAccessHandlerFactory, 172 ), 173 } 174 175 handler, err := api.NewHandler( 176 logger, 177 178 externalURL, 179 clusterName, 180 181 apiWrapper, 182 183 dbTeamFactory, 184 dbPipelineFactory, 185 dbJobFactory, 186 dbResourceFactory, 187 dbWorkerFactory, 188 fakeVolumeRepository, 189 fakeContainerRepository, 190 fakeDestroyer, 191 dbBuildFactory, 192 dbCheckFactory, 193 dbResourceConfigFactory, 194 dbUserFactory, 195 196 constructedEventHandler.Construct, 197 198 fakeWorkerClient, 199 200 sink, 201 202 isTLSEnabled, 203 204 cliDownloadsDir, 205 "1.2.3", 206 "4.5.6", 207 fakeSecretManager, 208 fakeVarSourcePool, 209 credsManagers, 210 interceptTimeoutFactory, 211 time.Second, 212 dbWall, 213 fakeClock, 214 ) 215 216 Expect(err).NotTo(HaveOccurred()) 217 218 accessorHandler := accessor.NewHandler( 219 logger, 220 "some-action", 221 handler, 222 fakeAccessor, 223 new(auditorfakes.FakeAuditor), 224 map[string]string{}, 225 ) 226 227 handler = wrappa.LoggerHandler{ 228 Logger: logger, 229 Handler: accessorHandler, 230 } 231 232 server = httptest.NewServer(handler) 233 234 client = &http.Client{ 235 Transport: &http.Transport{}, 236 } 237}) 238 239var _ = AfterEach(func() { 240 server.Close() 241}) 242 243func TestAPI(t *testing.T) { 244 RegisterFailHandler(Fail) 245 RunSpecs(t, "API Suite") 246} 247