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 }