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  }