github.com/replicatedhq/ship@v0.55.0/pkg/lifecycle/render/dockerlayer/layer_test.go (about)

     1  package dockerlayer
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/go-kit/kit/log"
     8  	"github.com/golang/mock/gomock"
     9  	"github.com/pkg/errors"
    10  	"github.com/replicatedhq/libyaml"
    11  	"github.com/replicatedhq/ship/pkg/api"
    12  	"github.com/replicatedhq/ship/pkg/lifecycle/render/root"
    13  	mockdocker "github.com/replicatedhq/ship/pkg/test-mocks/docker"
    14  	"github.com/replicatedhq/ship/pkg/test-mocks/dockerlayer"
    15  	"github.com/replicatedhq/ship/pkg/testing/logger"
    16  	"github.com/replicatedhq/ship/pkg/testing/matchers"
    17  	"github.com/spf13/afero"
    18  	"github.com/spf13/viper"
    19  	"github.com/stretchr/testify/require"
    20  )
    21  
    22  func TestUnpackLayer(t *testing.T) {
    23  	tests := []struct {
    24  		name        string
    25  		dockerError error
    26  	}{
    27  		{
    28  			name:        "test layer",
    29  			dockerError: nil,
    30  		},
    31  		{
    32  			name:        "test layer with docker save error",
    33  			dockerError: errors.New("image not found"),
    34  		},
    35  	}
    36  	for _, test := range tests {
    37  		t.Run(test.name, func(t *testing.T) {
    38  			req := require.New(t)
    39  			mc := gomock.NewController(t)
    40  			renderer := mockdocker.NewMockRenderer(mc)
    41  			archiver := dockerlayer.NewMockArchiver(mc)
    42  			testLogger := &logger.TestLogger{T: t}
    43  			ctx := context.Background()
    44  			mockFS := afero.Afero{Fs: afero.NewMemMapFs()}
    45  
    46  			unpacker := &Unpacker{
    47  				Logger:      testLogger,
    48  				Viper:       viper.New(),
    49  				DockerSaver: renderer,
    50  				Tar:         archiver,
    51  				FS:          mockFS,
    52  			}
    53  
    54  			asset := api.DockerLayerAsset{
    55  				DockerAsset: api.DockerAsset{
    56  					AssetShared: api.AssetShared{
    57  						Dest: "some/where",
    58  					},
    59  					Image:  "replicated",
    60  					Source: "public",
    61  				},
    62  				Layer: "abcdefg",
    63  			}
    64  
    65  			meta := api.ReleaseMetadata{
    66  				Images: []api.Image{},
    67  			}
    68  
    69  			watchProgress := func(ch chan interface{}, logger log.Logger) error {
    70  				return nil
    71  			}
    72  
    73  			func() {
    74  				defer mc.Finish()
    75  
    76  				var calledDockerExec bool
    77  				renderer.EXPECT().Execute(gomock.Any(), asset.DockerAsset, meta, gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(func(ctx2 context.Context) error {
    78  					// todo make sure this thing got called
    79  					calledDockerExec = true
    80  					return test.dockerError
    81  				})
    82  
    83  				if test.dockerError == nil {
    84  					archiver.EXPECT().Open(&matchers.Contains{Value: "/dockerlayer"}, &matchers.Contains{Value: "/dockerlayer"}).Return(nil)
    85  					archiver.EXPECT().Open(&matchers.Contains{Value: "/dockerlayer"}, asset.Dest).Return(nil)
    86  				}
    87  
    88  				rootFs := root.Fs{
    89  					Afero:    mockFS,
    90  					RootPath: "",
    91  				}
    92  
    93  				err := unpacker.Execute(
    94  					rootFs,
    95  					asset,
    96  					meta,
    97  					watchProgress,
    98  					map[string]interface{}{},
    99  					[]libyaml.ConfigGroup{},
   100  				)(ctx)
   101  
   102  				if test.dockerError != nil {
   103  					req.Error(err, "expected error "+test.dockerError.Error())
   104  					req.Contains(err.Error(), test.dockerError.Error())
   105  					return
   106  				}
   107  
   108  				req.NoError(err)
   109  				dirCreated, err := mockFS.Exists("some/")
   110  				req.NoError(err, "check dir created")
   111  				req.True(dirCreated, "expected base dir to have been created at %s", "some/")
   112  
   113  				req.True(calledDockerExec, "expected docker.Renderer.Execute to have been called")
   114  			}()
   115  		})
   116  	}
   117  }