github.com/0xPolygon/supernets2-node@v0.0.0-20230711153321-2fe574524eaa/test/scripts/cmd/dependencies/images_test.go (about)

     1  package dependencies
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/0xPolygon/supernets2-node/log"
     7  	"github.com/0xPolygon/supernets2-node/test/testutils"
     8  	"github.com/spf13/afero"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func Test_image_readCurrentDigest(t *testing.T) {
    13  	var appFs = afero.NewMemMapFs()
    14  
    15  	tcs := []struct {
    16  		description      string
    17  		input            string
    18  		expectedOutput   string
    19  		expectedError    bool
    20  		expectedErrorMsg string
    21  	}{
    22  		{
    23  			description: "single container with matching image and existing digest",
    24  
    25  			input: `version: '3'
    26  services:
    27      supernets2-node:
    28          image: imageorg/imagerepo@sha256:f7bc95017b64a6dee98dd2e3a98cbea8c715de137d0f599b1b16f683c2dae955
    29  `,
    30  			expectedOutput: "sha256:f7bc95017b64a6dee98dd2e3a98cbea8c715de137d0f599b1b16f683c2dae955",
    31  		},
    32  		{
    33  			description: "multiple containers with matching image and existing digest",
    34  			input: `version: '3'
    35  services:
    36      supernets2-node:
    37          image: supernets2-node
    38  
    39      supernets2-mock-l1-network:
    40          image: imageorg/imagerepo@sha256:f7bc95017b64a6dee98dd2e3a98cbea8c715de137d0f599b1b16f683c2dae955
    41      supernets2-mock-prover:
    42          image: hezprover
    43  `,
    44  			expectedOutput: "sha256:f7bc95017b64a6dee98dd2e3a98cbea8c715de137d0f599b1b16f683c2dae955",
    45  		},
    46  		{
    47  			description: "single container with matching image and non-existing digest",
    48  
    49  			input: `version: '3'
    50  services:
    51      supernets2-node:
    52          image: imageorg/imagerepo:latest
    53  `,
    54  			expectedError:    true,
    55  			expectedErrorMsg: "image \"imageorg/imagerepo\" not found",
    56  		},
    57  		{
    58  			description: "single container with non-matching image",
    59  
    60  			input: `version: '3'
    61  services:
    62      supernets2-node:
    63          image: imageNeworg/imageNewrepo@sha256:f7bc95017b64a6dee98dd2e3a98cbea8c715de137d0f599b1b16f683c2dae955
    64  `,
    65  			expectedError:    true,
    66  			expectedErrorMsg: "image \"imageorg/imagerepo\" not found",
    67  		},
    68  		{
    69  			description:      "invalid yaml",
    70  			input:            "not valid yaml",
    71  			expectedError:    true,
    72  			expectedErrorMsg: "yaml: unmarshal errors",
    73  		},
    74  	}
    75  
    76  	const (
    77  		defaultPath = "/a/b/dockerCompose.yml"
    78  		imageName   = "imageorg/imagerepo"
    79  	)
    80  
    81  	subject := &imageUpdater{
    82  		fs:             appFs,
    83  		targetFilePath: defaultPath,
    84  	}
    85  
    86  	for _, tc := range tcs {
    87  		tc := tc
    88  		t.Run(tc.description, func(t *testing.T) {
    89  			require.NoError(t, createFile(appFs, defaultPath, tc.input))
    90  			defer func() {
    91  				require.NoError(t, appFs.Remove(defaultPath))
    92  			}()
    93  
    94  			actualOutput, err := subject.readCurrentDigest(imageName)
    95  			require.NoError(t, testutils.CheckError(err, tc.expectedError, tc.expectedErrorMsg))
    96  			require.Equal(t, tc.expectedOutput, actualOutput)
    97  		})
    98  	}
    99  }
   100  
   101  func Test_image_updateDigest(t *testing.T) {
   102  	var appFs = afero.NewMemMapFs()
   103  
   104  	tcs := []struct {
   105  		description               string
   106  		initialFileContents       string
   107  		oldDigest                 string
   108  		newDigest                 string
   109  		expectedFinalFileContents string
   110  		expectedError             bool
   111  		expectedErrorMsg          string
   112  	}{
   113  		{
   114  			description: "single container with matching image and existing digest",
   115  			initialFileContents: `version: '3'
   116  services:
   117      supernets2-node:
   118          image: imageorg/imagerepo@sha256:oldDigest`,
   119  			oldDigest: "sha256:oldDigest",
   120  			newDigest: "sha256:newDigest",
   121  			expectedFinalFileContents: `version: '3'
   122  services:
   123      supernets2-node:
   124          image: imageorg/imagerepo@sha256:newDigest`,
   125  		},
   126  		{
   127  			description: "single container, not matching image",
   128  			initialFileContents: `version: '3'
   129  services:
   130      supernets2-node:
   131          image: imageorg/anotherimagerepo@sha256:oldDigest`,
   132  			oldDigest: "sha256:oldDigest",
   133  			newDigest: "sha256:newDigest",
   134  			expectedFinalFileContents: `version: '3'
   135  services:
   136      supernets2-node:
   137          image: imageorg/anotherimagerepo@sha256:oldDigest`,
   138  		},
   139  		{
   140  			description: "single container with matching image, non-existing digest",
   141  			initialFileContents: `version: '3'
   142  services:
   143      supernets2-node:
   144          image: imageorg/imagerepo@sha256:veryOldDigest`,
   145  			oldDigest: "sha256:oldDigest",
   146  			newDigest: "sha256:newDigest",
   147  			expectedFinalFileContents: `version: '3'
   148  services:
   149      supernets2-node:
   150          image: imageorg/imagerepo@sha256:veryOldDigest`,
   151  		},
   152  		{
   153  			description: "multiple container with matching image and existing digest",
   154  			initialFileContents: `version: '3'
   155  services:
   156      supernets2-mock-l1-network:
   157          image: imageorg/networkImagerepo@sha256:oldDigest
   158      supernets2-node:
   159          image: imageorg/imagerepo@sha256:oldDigest
   160      supernets2-mock-prover:
   161          image: imageorg/proverImagerepo@sha256:oldDigest
   162  `,
   163  			oldDigest: "sha256:oldDigest",
   164  			newDigest: "sha256:newDigest",
   165  			expectedFinalFileContents: `version: '3'
   166  services:
   167      supernets2-mock-l1-network:
   168          image: imageorg/networkImagerepo@sha256:oldDigest
   169      supernets2-node:
   170          image: imageorg/imagerepo@sha256:newDigest
   171      supernets2-mock-prover:
   172          image: imageorg/proverImagerepo@sha256:oldDigest
   173  `,
   174  		},
   175  		{
   176  			description:               "invalid yaml",
   177  			initialFileContents:       "not valid yaml",
   178  			oldDigest:                 "sha256:oldDigest",
   179  			newDigest:                 "sha256:newDigest",
   180  			expectedFinalFileContents: "not valid yaml",
   181  		},
   182  	}
   183  
   184  	const (
   185  		defaultPath = "/a/b/dockerCompose.yml"
   186  		imageName   = "imageorg/imagerepo"
   187  	)
   188  
   189  	subject := &imageUpdater{
   190  		fs:             appFs,
   191  		targetFilePath: defaultPath,
   192  	}
   193  
   194  	for _, tc := range tcs {
   195  		tc := tc
   196  		t.Run(tc.description, func(t *testing.T) {
   197  			require.NoError(t, createFile(appFs, defaultPath, tc.initialFileContents))
   198  			defer func() {
   199  				require.NoError(t, appFs.Remove(defaultPath))
   200  			}()
   201  
   202  			err := subject.updateDigest(imageName, tc.oldDigest, tc.newDigest)
   203  			require.NoError(t, testutils.CheckError(err, tc.expectedError, tc.expectedErrorMsg))
   204  			actualFileContents, err := afero.ReadFile(appFs, defaultPath)
   205  			require.NoError(t, err)
   206  			require.Equal(t, tc.expectedFinalFileContents, string(actualFileContents))
   207  		})
   208  	}
   209  }
   210  
   211  func createFile(appFs afero.Fs, path, content string) error {
   212  	f, err := appFs.Create(path)
   213  
   214  	if err != nil {
   215  		return err
   216  	}
   217  	defer func() {
   218  		if err := f.Close(); err != nil {
   219  			log.Errorf("Could not close %q: %v", path, err)
   220  		}
   221  	}()
   222  
   223  	_, err = f.WriteString(content)
   224  
   225  	return err
   226  }