github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/core/chaincode/platforms/util/utils_test.go (about) 1 /* 2 Copyright hechain. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package util 8 9 import ( 10 "archive/tar" 11 "bytes" 12 "encoding/base32" 13 "fmt" 14 "io/ioutil" 15 "os" 16 "runtime" 17 "strings" 18 "testing" 19 20 docker "github.com/fsouza/go-dockerclient" 21 "github.com/hechain20/hechain/common/metadata" 22 "github.com/hechain20/hechain/common/util" 23 "github.com/hechain20/hechain/core/config/configtest" 24 "github.com/spf13/viper" 25 "github.com/stretchr/testify/require" 26 ) 27 28 func TestDockerBuild(t *testing.T) { 29 client, err := docker.NewClientFromEnv() 30 require.NoError(t, err, "failed to get docker client") 31 32 is := bytes.NewBuffer(nil) 33 tw := tar.NewWriter(is) 34 35 const dockerfile = "FROM busybox:1.33\nADD . /\n" 36 err = tw.WriteHeader(&tar.Header{ 37 Name: "Dockerfile", 38 Size: int64(len(dockerfile)), 39 Mode: 0o644, 40 }) 41 require.NoError(t, err) 42 _, err = tw.Write([]byte(dockerfile)) 43 require.NoError(t, err) 44 45 err = tw.WriteHeader(&tar.Header{ 46 Name: "chaincode/input/", 47 Typeflag: tar.TypeDir, 48 Mode: 0o40755, 49 }) 50 require.NoError(t, err) 51 err = tw.WriteHeader(&tar.Header{ 52 Name: "chaincode/output/", 53 Typeflag: tar.TypeDir, 54 Mode: 0o40755, 55 }) 56 require.NoError(t, err) 57 tw.Close() 58 59 imageName := uniqueName() 60 err = client.BuildImage(docker.BuildImageOptions{ 61 Name: imageName, 62 InputStream: is, 63 OutputStream: ioutil.Discard, 64 }) 65 require.NoError(t, err, "failed to build base image") 66 defer client.RemoveImageExtended(imageName, docker.RemoveImageOptions{Force: true}) 67 68 codepackage := bytes.NewBuffer(nil) 69 tw = tar.NewWriter(codepackage) 70 tw.Close() 71 72 err = DockerBuild( 73 DockerBuildOptions{ 74 Image: imageName, 75 Cmd: "/bin/true", 76 InputStream: codepackage, 77 OutputStream: ioutil.Discard, 78 }, 79 client, 80 ) 81 require.NoError(t, err, "build failed") 82 } 83 84 func uniqueName() string { 85 name := base32.StdEncoding.WithPadding(base32.NoPadding).EncodeToString(util.GenerateBytesUUID()) 86 return strings.ToLower(name) 87 } 88 89 func TestUtil_GetDockerImageFromConfig(t *testing.T) { 90 path := "dt" 91 92 expected := "FROM " + metadata.DockerNamespace + ":" + runtime.GOARCH + "-" + metadata.Version 93 viper.Set(path, "FROM $(DOCKER_NS):$(ARCH)-$(PROJECT_VERSION)") 94 actual := GetDockerImageFromConfig(path) 95 require.Equal(t, expected, actual, `Error parsing Dockerfile Template. Expected "%s", got "%s"`, expected, actual) 96 97 expected = "FROM " + metadata.DockerNamespace + ":" + runtime.GOARCH + "-" + twoDigitVersion(metadata.Version) 98 viper.Set(path, "FROM $(DOCKER_NS):$(ARCH)-$(TWO_DIGIT_VERSION)") 99 actual = GetDockerImageFromConfig(path) 100 require.Equal(t, expected, actual, `Error parsing Dockerfile Template. Expected "%s", got "%s"`, expected, actual) 101 } 102 103 func TestMain(m *testing.M) { 104 viper.SetConfigName("core") 105 viper.SetEnvPrefix("CORE") 106 configtest.AddDevConfigPath(nil) 107 viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) 108 viper.AutomaticEnv() 109 if err := viper.ReadInConfig(); err != nil { 110 fmt.Printf("could not read config %s\n", err) 111 os.Exit(-1) 112 } 113 os.Exit(m.Run()) 114 } 115 116 func TestTwoDigitVersion(t *testing.T) { 117 version := "2.0.0" 118 expected := "2.0" 119 actual := twoDigitVersion(version) 120 require.Equal(t, expected, actual, `Error parsing two digit version. Expected "%s", got "%s"`, expected, actual) 121 122 version = "latest" 123 expected = "latest" 124 actual = twoDigitVersion(version) 125 require.Equal(t, expected, actual, `Error parsing two digit version. Expected "%s", got "%s"`, expected, actual) 126 } 127 128 func TestDockerBuildOptions(t *testing.T) { 129 buildOptions := DockerBuildOptions{ 130 Image: "imageName", 131 Cmd: "theCommand", 132 Env: []string{"ENV_VARIABLE"}, 133 } 134 135 actualBuildOptionsString := buildOptions.String() 136 expectedBuildOptionsString := "Image=imageName Env=[ENV_VARIABLE] Cmd=theCommand)" 137 require.Equal(t, expectedBuildOptionsString, actualBuildOptionsString, `Expected "%s", got "%s"`, expectedBuildOptionsString, actualBuildOptionsString) 138 }