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  }