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 }