github.com/cloudfoundry/libcfbuildpack@v1.91.23/detect/detect_test.go (about) 1 /* 2 * Copyright 2018-2020 the original author or authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * https://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package detect_test 18 19 import ( 20 "path/filepath" 21 "testing" 22 23 "github.com/buildpack/libbuildpack/buildplan" 24 "github.com/cloudfoundry/libcfbuildpack/detect" 25 "github.com/cloudfoundry/libcfbuildpack/internal" 26 "github.com/cloudfoundry/libcfbuildpack/test" 27 "github.com/onsi/gomega" 28 "github.com/sclevine/spec" 29 "github.com/sclevine/spec/report" 30 ) 31 32 func TestDetect(t *testing.T) { 33 spec.Run(t, "Detect", func(t *testing.T, _ spec.G, it spec.S) { 34 35 g := gomega.NewWithT(t) 36 37 var root string 38 39 it.Before(func() { 40 root = test.ScratchDir(t, "detect") 41 }) 42 43 it("contains default values", func() { 44 defer internal.ReplaceWorkingDirectory(t, root)() 45 defer test.ReplaceEnv(t, "CNB_STACK_ID", "test-stack")() 46 defer internal.ReplaceArgs(t, filepath.Join(root, "bin", "test"), filepath.Join(root, "platform"), filepath.Join(root, "plan.toml"))() 47 48 test.WriteFile(t, filepath.Join(root, "buildpack.toml"), `[buildpack] 49 id = "buildpack-id" 50 name = "buildpack-name" 51 version = "buildpack-version" 52 53 [[stacks]] 54 id = 'stack-id' 55 build-images = ["build-image-tag"] 56 run-images = ["run-image-tag"] 57 58 [metadata] 59 test-key = "test-value" 60 `) 61 62 d, err := detect.DefaultDetect() 63 g.Expect(err).NotTo(gomega.HaveOccurred()) 64 65 g.Expect(d.Application).NotTo(gomega.BeZero()) 66 g.Expect(d.Buildpack).NotTo(gomega.BeZero()) 67 g.Expect(d.Logger).NotTo(gomega.BeZero()) 68 g.Expect(d.Platform).NotTo(gomega.BeZero()) 69 g.Expect(d.Services).NotTo(gomega.BeZero()) 70 g.Expect(d.Stack).NotTo(gomega.BeZero()) 71 g.Expect(d.Writer).NotTo(gomega.BeZero()) 72 }) 73 74 it("returns code when erroring", func() { 75 defer internal.ReplaceWorkingDirectory(t, root)() 76 defer test.ReplaceEnv(t, "CNB_STACK_ID", "test-stack")() 77 defer internal.ReplaceArgs(t, filepath.Join(root, "bin", "test"), filepath.Join(root, "platform"), filepath.Join(root, "plan.toml"))() 78 79 test.TouchFile(t, root, "buildpack.toml") 80 81 d, err := detect.DefaultDetect() 82 g.Expect(err).NotTo(gomega.HaveOccurred()) 83 84 g.Expect(d.Error(42)).To(gomega.Equal(42)) 85 }) 86 87 it("returns 100 when failing", func() { 88 defer internal.ReplaceWorkingDirectory(t, root)() 89 defer test.ReplaceEnv(t, "CNB_STACK_ID", "test-stack")() 90 defer internal.ReplaceArgs(t, filepath.Join(root, "bin", "test"), filepath.Join(root, "platform"), filepath.Join(root, "plan.toml"))() 91 92 test.TouchFile(t, root, "buildpack.toml") 93 94 d, err := detect.DefaultDetect() 95 g.Expect(err).NotTo(gomega.HaveOccurred()) 96 97 g.Expect(d.Fail()).To(gomega.Equal(detect.FailStatusCode)) 98 }) 99 100 it("returns 0 and Plan when passing", func() { 101 defer internal.ReplaceWorkingDirectory(t, root)() 102 defer test.ReplaceEnv(t, "CNB_STACK_ID", "test-stack")() 103 defer internal.ReplaceArgs(t, filepath.Join(root, "bin", "test"), filepath.Join(root, "platform"), filepath.Join(root, "plan.toml"))() 104 105 test.TouchFile(t, root, "buildpack.toml") 106 107 d, err := detect.DefaultDetect() 108 g.Expect(err).NotTo(gomega.HaveOccurred()) 109 110 g.Expect(d.Pass(buildplan.Plan{ 111 Provides: []buildplan.Provided{ 112 {"test-provided-1a"}, 113 {"test-provided-1b"}, 114 }, 115 Requires: []buildplan.Required{ 116 {"test-required-1a", "test-version-1a", buildplan.Metadata{"test-key-1a": "test-value-1a"}}, 117 {"test-required-1b", "test-version-1b", buildplan.Metadata{"test-key-1b": "test-value-1b"}}, 118 }, 119 }, 120 buildplan.Plan{ 121 Provides: []buildplan.Provided{ 122 {"test-provided-2a"}, 123 {"test-provided-2b"}, 124 }, 125 Requires: []buildplan.Required{ 126 {"test-required-2a", "test-version-2a", buildplan.Metadata{"test-key-2a": "test-value-2a"}}, 127 {"test-required-2b", "test-version-2b", buildplan.Metadata{"test-key-2b": "test-value-2b"}}, 128 }, 129 }, 130 buildplan.Plan{ 131 Provides: []buildplan.Provided{ 132 {"test-provided-3a"}, 133 {"test-provided-3b"}, 134 }, 135 Requires: []buildplan.Required{ 136 {"test-required-3a", "test-version-3a", buildplan.Metadata{"test-key-3a": "test-value-3a"}}, 137 {"test-required-3b", "test-version-3b", buildplan.Metadata{"test-key-3b": "test-value-3b"}}, 138 }, 139 })).To(gomega.Equal(detect.PassStatusCode)) 140 141 g.Expect(filepath.Join(root, "plan.toml")).To(test.HaveContent(`[[provides]] 142 name = "test-provided-1a" 143 144 [[provides]] 145 name = "test-provided-1b" 146 147 [[requires]] 148 name = "test-required-1a" 149 version = "test-version-1a" 150 [requires.metadata] 151 test-key-1a = "test-value-1a" 152 153 [[requires]] 154 name = "test-required-1b" 155 version = "test-version-1b" 156 [requires.metadata] 157 test-key-1b = "test-value-1b" 158 159 [[or]] 160 161 [[or.provides]] 162 name = "test-provided-2a" 163 164 [[or.provides]] 165 name = "test-provided-2b" 166 167 [[or.requires]] 168 name = "test-required-2a" 169 version = "test-version-2a" 170 [or.requires.metadata] 171 test-key-2a = "test-value-2a" 172 173 [[or.requires]] 174 name = "test-required-2b" 175 version = "test-version-2b" 176 [or.requires.metadata] 177 test-key-2b = "test-value-2b" 178 179 [[or]] 180 181 [[or.provides]] 182 name = "test-provided-3a" 183 184 [[or.provides]] 185 name = "test-provided-3b" 186 187 [[or.requires]] 188 name = "test-required-3a" 189 version = "test-version-3a" 190 [or.requires.metadata] 191 test-key-3a = "test-value-3a" 192 193 [[or.requires]] 194 name = "test-required-3b" 195 version = "test-version-3b" 196 [or.requires.metadata] 197 test-key-3b = "test-value-3b" 198 `)) 199 }) 200 }, spec.Report(report.Terminal{})) 201 } 202