github.com/YousefHaggyHeroku/pack@v1.5.5/internal/build/phase_config_provider_test.go (about) 1 package build_test 2 3 import ( 4 "math/rand" 5 "testing" 6 "time" 7 8 ifakes "github.com/buildpacks/imgutil/fakes" 9 "github.com/docker/docker/api/types/container" 10 "github.com/docker/docker/api/types/strslice" 11 "github.com/heroku/color" 12 "github.com/sclevine/spec" 13 "github.com/sclevine/spec/report" 14 15 "github.com/YousefHaggyHeroku/pack/internal/build" 16 "github.com/YousefHaggyHeroku/pack/internal/build/fakes" 17 "github.com/YousefHaggyHeroku/pack/logging" 18 h "github.com/YousefHaggyHeroku/pack/testhelpers" 19 ) 20 21 func TestPhaseConfigProvider(t *testing.T) { 22 rand.Seed(time.Now().UTC().UnixNano()) 23 24 color.Disable(true) 25 defer color.Disable(false) 26 27 spec.Run(t, "phase_config_provider", testPhaseConfigProvider, spec.Report(report.Terminal{}), spec.Sequential()) 28 } 29 30 func testPhaseConfigProvider(t *testing.T, when spec.G, it spec.S) { 31 when("#NewPhaseConfigProvider", func() { 32 it("returns a phase config provider with defaults", func() { 33 expectedBuilderImage := ifakes.NewImage("some-builder-name", "", nil) 34 fakeBuilder, err := fakes.NewFakeBuilder(fakes.WithImage(expectedBuilderImage)) 35 h.AssertNil(t, err) 36 lifecycle := newTestLifecycleExec(t, false, fakes.WithBuilder(fakeBuilder)) 37 expectedPhaseName := "some-name" 38 expectedCmd := strslice.StrSlice{"/cnb/lifecycle/" + expectedPhaseName} 39 40 phaseConfigProvider := build.NewPhaseConfigProvider(expectedPhaseName, lifecycle) 41 42 h.AssertEq(t, phaseConfigProvider.Name(), expectedPhaseName) 43 h.AssertEq(t, phaseConfigProvider.ContainerConfig().Cmd, expectedCmd) 44 h.AssertEq(t, phaseConfigProvider.ContainerConfig().Image, expectedBuilderImage.Name()) 45 h.AssertEq(t, phaseConfigProvider.ContainerConfig().Labels, map[string]string{"author": "pack"}) 46 47 // NewFakeBuilder sets the Platform API 48 h.AssertSliceContains(t, phaseConfigProvider.ContainerConfig().Env, "CNB_PLATFORM_API=0.4") 49 50 // CreateFakeLifecycleExecution sets the following: 51 h.AssertSliceContains(t, phaseConfigProvider.ContainerConfig().Env, "HTTP_PROXY=some-http-proxy") 52 h.AssertSliceContains(t, phaseConfigProvider.ContainerConfig().Env, "http_proxy=some-http-proxy") 53 h.AssertSliceContains(t, phaseConfigProvider.ContainerConfig().Env, "HTTPS_PROXY=some-https-proxy") 54 h.AssertSliceContains(t, phaseConfigProvider.ContainerConfig().Env, "https_proxy=some-https-proxy") 55 h.AssertSliceContains(t, phaseConfigProvider.ContainerConfig().Env, "NO_PROXY=some-no-proxy") 56 h.AssertSliceContains(t, phaseConfigProvider.ContainerConfig().Env, "no_proxy=some-no-proxy") 57 58 h.AssertSliceContainsMatch(t, phaseConfigProvider.HostConfig().Binds, "pack-layers-.*:/layers") 59 h.AssertSliceContainsMatch(t, phaseConfigProvider.HostConfig().Binds, "pack-app-.*:/workspace") 60 61 h.AssertEq(t, phaseConfigProvider.HostConfig().Isolation, container.IsolationEmpty) 62 }) 63 64 when("building for Windows", func() { 65 it("sets process isolation", func() { 66 fakeBuilderImage := ifakes.NewImage("fake-builder", "", nil) 67 h.AssertNil(t, fakeBuilderImage.SetOS("windows")) 68 fakeBuilder, err := fakes.NewFakeBuilder(fakes.WithImage(fakeBuilderImage)) 69 h.AssertNil(t, err) 70 lifecycle := newTestLifecycleExec(t, false, fakes.WithBuilder(fakeBuilder)) 71 72 phaseConfigProvider := build.NewPhaseConfigProvider("some-name", lifecycle) 73 74 h.AssertEq(t, phaseConfigProvider.HostConfig().Isolation, container.IsolationProcess) 75 }) 76 }) 77 78 when("called with WithArgs", func() { 79 it("sets args on the config", func() { 80 lifecycle := newTestLifecycleExec(t, false) 81 expectedArgs := strslice.StrSlice{"some-arg-1", "some-arg-2"} 82 83 phaseConfigProvider := build.NewPhaseConfigProvider( 84 "some-name", 85 lifecycle, 86 build.WithArgs(expectedArgs...), 87 ) 88 89 cmd := phaseConfigProvider.ContainerConfig().Cmd 90 h.AssertSliceContainsInOrder(t, cmd, "some-arg-1", "some-arg-2") 91 }) 92 }) 93 94 when("called with WithFlags", func() { 95 it("sets args on the config", func() { 96 lifecycle := newTestLifecycleExec(t, false) 97 98 phaseConfigProvider := build.NewPhaseConfigProvider( 99 "some-name", 100 lifecycle, 101 build.WithArgs("arg-1", "arg-2"), 102 build.WithFlags("flag-1", "flag-2"), 103 ) 104 105 cmd := phaseConfigProvider.ContainerConfig().Cmd 106 h.AssertSliceContainsInOrder(t, cmd, "flag-1", "flag-2", "arg-1", "arg-2") 107 }) 108 }) 109 110 when("called with WithBinds", func() { 111 it("sets binds on the config", func() { 112 lifecycle := newTestLifecycleExec(t, false) 113 expectedBinds := []string{"some-bind-1", "some-bind-2"} 114 115 phaseConfigProvider := build.NewPhaseConfigProvider( 116 "some-name", 117 lifecycle, 118 build.WithBinds(expectedBinds...), 119 ) 120 121 h.AssertSliceContains(t, phaseConfigProvider.HostConfig().Binds, expectedBinds...) 122 }) 123 }) 124 125 when("called with WithDaemonAccess", func() { 126 when("building for non-Windows", func() { 127 it("sets daemon access on the config", func() { 128 lifecycle := newTestLifecycleExec(t, false) 129 130 phaseConfigProvider := build.NewPhaseConfigProvider( 131 "some-name", 132 lifecycle, 133 build.WithDaemonAccess(), 134 ) 135 136 h.AssertEq(t, phaseConfigProvider.ContainerConfig().User, "root") 137 h.AssertSliceContains(t, phaseConfigProvider.HostConfig().Binds, "/var/run/docker.sock:/var/run/docker.sock") 138 }) 139 }) 140 141 when("building for Windows", func() { 142 it("sets daemon access on the config", func() { 143 fakeBuilderImage := ifakes.NewImage("fake-builder", "", nil) 144 h.AssertNil(t, fakeBuilderImage.SetOS("windows")) 145 fakeBuilder, err := fakes.NewFakeBuilder(fakes.WithImage(fakeBuilderImage)) 146 h.AssertNil(t, err) 147 lifecycle := newTestLifecycleExec(t, false, fakes.WithBuilder(fakeBuilder)) 148 149 phaseConfigProvider := build.NewPhaseConfigProvider( 150 "some-name", 151 lifecycle, 152 build.WithDaemonAccess(), 153 ) 154 155 h.AssertEq(t, phaseConfigProvider.ContainerConfig().User, "ContainerAdministrator") 156 h.AssertSliceContains(t, phaseConfigProvider.HostConfig().Binds, `\\.\pipe\docker_engine:\\.\pipe\docker_engine`) 157 }) 158 }) 159 }) 160 161 when("called with WithEnv", func() { 162 it("sets the environment on the config", func() { 163 lifecycle := newTestLifecycleExec(t, false) 164 165 phaseConfigProvider := build.NewPhaseConfigProvider( 166 "some-name", 167 lifecycle, 168 build.WithEnv("SOME_VARIABLE=some-value"), 169 ) 170 171 h.AssertSliceContains(t, phaseConfigProvider.ContainerConfig().Env, "SOME_VARIABLE=some-value") 172 }) 173 }) 174 175 when("called with WithImage", func() { 176 it("sets the image on the config", func() { 177 lifecycle := newTestLifecycleExec(t, false) 178 179 phaseConfigProvider := build.NewPhaseConfigProvider( 180 "some-name", 181 lifecycle, 182 build.WithImage("some-image-name"), 183 ) 184 185 h.AssertEq(t, phaseConfigProvider.ContainerConfig().Image, "some-image-name") 186 }) 187 }) 188 189 when("called with WithNetwork", func() { 190 it("sets the network mode on the config", func() { 191 lifecycle := newTestLifecycleExec(t, false) 192 expectedNetworkMode := "some-network-mode" 193 194 phaseConfigProvider := build.NewPhaseConfigProvider( 195 "some-name", 196 lifecycle, 197 build.WithNetwork(expectedNetworkMode), 198 ) 199 200 h.AssertEq( 201 t, 202 phaseConfigProvider.HostConfig().NetworkMode, 203 container.NetworkMode(expectedNetworkMode), 204 ) 205 }) 206 }) 207 208 when("called with WithRegistryAccess", func() { 209 it("sets registry access on the config", func() { 210 lifecycle := newTestLifecycleExec(t, false) 211 authConfig := "some-auth-config" 212 213 phaseConfigProvider := build.NewPhaseConfigProvider( 214 "some-name", 215 lifecycle, 216 build.WithRegistryAccess(authConfig), 217 ) 218 219 h.AssertSliceContains( 220 t, 221 phaseConfigProvider.ContainerConfig().Env, 222 "CNB_REGISTRY_AUTH="+authConfig, 223 ) 224 }) 225 }) 226 227 when("called with WithRoot", func() { 228 when("building for non-Windows", func() { 229 it("sets root user on the config", func() { 230 lifecycle := newTestLifecycleExec(t, false) 231 232 phaseConfigProvider := build.NewPhaseConfigProvider( 233 "some-name", 234 lifecycle, 235 build.WithRoot(), 236 ) 237 238 h.AssertEq(t, phaseConfigProvider.ContainerConfig().User, "root") 239 }) 240 }) 241 242 when("building for Windows", func() { 243 it("sets root user on the config", func() { 244 fakeBuilderImage := ifakes.NewImage("fake-builder", "", nil) 245 h.AssertNil(t, fakeBuilderImage.SetOS("windows")) 246 fakeBuilder, err := fakes.NewFakeBuilder(fakes.WithImage(fakeBuilderImage)) 247 h.AssertNil(t, err) 248 lifecycle := newTestLifecycleExec(t, false, fakes.WithBuilder(fakeBuilder)) 249 250 phaseConfigProvider := build.NewPhaseConfigProvider( 251 "some-name", 252 lifecycle, 253 build.WithRoot(), 254 ) 255 256 h.AssertEq(t, phaseConfigProvider.ContainerConfig().User, "ContainerAdministrator") 257 }) 258 }) 259 }) 260 261 when("called with WithLogPrefix", func() { 262 it("sets prefix writers", func() { 263 lifecycle := newTestLifecycleExec(t, false) 264 265 phaseConfigProvider := build.NewPhaseConfigProvider( 266 "some-name", 267 lifecycle, 268 build.WithLogPrefix("some-prefix"), 269 ) 270 271 _, isType := phaseConfigProvider.InfoWriter().(*logging.PrefixWriter) 272 h.AssertEq(t, isType, true) 273 274 _, isType = phaseConfigProvider.ErrorWriter().(*logging.PrefixWriter) 275 h.AssertEq(t, isType, true) 276 }) 277 }) 278 }) 279 }