@@ -2,29 +2,41 @@ package acceptance
2
2
3
3
import (
4
4
"context"
5
+ "crypto/sha256"
5
6
"debug/elf"
6
7
"debug/macho"
7
8
"debug/pe"
8
9
"fmt"
10
+ "io"
11
+ "log"
9
12
"os"
10
13
"path/filepath"
14
+ "strings"
11
15
"time"
12
16
13
17
. "github.com/onsi/ginkgo/v2"
14
18
. "github.com/onsi/gomega"
15
19
"github.com/securesign/structural-tests/test/support"
16
20
)
17
21
18
- const cliServerPathMask = "/var/www/html/clients/%s/%s-%s.gz"
22
+ const (
23
+ cliServerFileMask = "%s-%s.gz"
24
+ cliServerPathMask = "/var/www/html/clients/%s/" + cliServerFileMask
25
+
26
+ cliImageBasePath = "/usr/local/bin"
27
+ cliImageFileMask = "%s_cli_%s_%s.gz"
28
+ )
19
29
20
30
var _ = Describe ("Client server" , Ordered , func () {
21
31
22
32
var clientServerImage string
33
+ var snapshotImages support.SnapshotMap
23
34
var tmpDir string
24
35
25
36
Describe ("client-server image" , func () {
26
37
It ("snapshot.json" , func () {
27
- snapshotImages , err := support .ParseSnapshotImages ()
38
+ var err error
39
+ snapshotImages , err = support .ParseSnapshotImages ()
28
40
Expect (err ).NotTo (HaveOccurred ())
29
41
30
42
clientServerImage = snapshotImages ["client-server-image" ]
@@ -35,6 +47,7 @@ var _ = Describe("Client server", Ordered, func() {
35
47
var err error
36
48
tmpDir , err = os .MkdirTemp ("" , "client-server" )
37
49
Expect (err ).NotTo (HaveOccurred ())
50
+ log .Printf ("TEMP directory: %s" , tmpDir )
38
51
})
39
52
})
40
53
@@ -49,6 +62,22 @@ var _ = Describe("Client server", Ordered, func() {
49
62
func (cli string , matrix support.OSArchMatrix ) {
50
63
for osName , archs := range matrix {
51
64
for _ , arch := range archs {
65
+ var image string
66
+ var gzipServerSHA []byte
67
+
68
+ It ("init" , func () {
69
+ switch cli {
70
+ case "createtree" , "updatetree" :
71
+ image = snapshotImages [cli + "-image" ]
72
+ case "tuftool" :
73
+ image = snapshotImages ["tuf-tool-image" ]
74
+ case "rekor-cli" :
75
+ image = snapshotImages ["rekor-cli-image" ]
76
+ default :
77
+ image = snapshotImages [cli + "-cli-image" ]
78
+ }
79
+ })
80
+
52
81
It (fmt .Sprintf ("verify %s-%s executable" , osName , arch ), func () {
53
82
osPath := filepath .Join (tmpDir , osName )
54
83
Expect (os .MkdirAll (osPath , 0755 )).To (Succeed ())
@@ -59,13 +88,66 @@ var _ = Describe("Client server", Ordered, func() {
59
88
Expect (support .FileFromImage (ctx , clientServerImage , fmt .Sprintf (cliServerPathMask , osName , cli , arch ), osPath )).To (Succeed ())
60
89
61
90
By ("decompress gzip" )
62
- gzipPath := filepath .Join (osPath , cli + "-" + arch + ".gz" )
91
+ gzipPath := filepath .Join (osPath , fmt . Sprintf ( cliServerFileMask , cli , arch ) )
63
92
targetPath := filepath .Join (osPath , cli + "-" + arch )
64
93
Expect (support .DecompressGzipFile (gzipPath , targetPath )).To (Succeed ())
65
94
66
95
By ("verify executable OS and arch" )
67
96
executable := filepath .Join (tmpDir , osName , cli + "-" + arch )
68
97
Expect (verifyExecutable (executable , osName , arch )).To (Succeed ())
98
+
99
+ By ("checksums of gzip file" )
100
+ var err error
101
+ gzipServerSHA , err = checksumFile (filepath .Join (osPath , fmt .Sprintf (cliServerFileMask , cli , arch )))
102
+ Expect (err ).NotTo (HaveOccurred ())
103
+ })
104
+
105
+ It (fmt .Sprintf ("compare checkum of %s-%s with source image" , osName , arch ), func () {
106
+ var (
107
+ targetPath = tmpDir
108
+ fileName string
109
+ filePath string
110
+ )
111
+
112
+ switch cli {
113
+ case "tuftool" :
114
+ Skip ("`tuftool` do not have gzip in source image" )
115
+ case "ec" :
116
+ Skip ("`ec` source image is not part of handover" )
117
+ case "cosign" , "updatetree" , "createtree" :
118
+ if osName == "windows" { //nolint:goconst
119
+ fileName = fmt .Sprintf ("%s-%s-%s.exe.gz" , cli , osName , arch )
120
+ } else {
121
+ fileName = fmt .Sprintf ("%s-%s-%s.gz" , cli , osName , arch )
122
+ }
123
+ case "rekor-cli" , "fetch-tsa-certs" :
124
+ ncli := strings .ReplaceAll (cli , "-" , "_" )
125
+ if osName == "windows" {
126
+ fileName = fmt .Sprintf ("%s_%s_%s.exe.gz" , ncli , osName , arch )
127
+ } else {
128
+ fileName = fmt .Sprintf ("%s_%s_%s.gz" , ncli , osName , arch )
129
+ }
130
+ default :
131
+ if osName == "windows" {
132
+ fileName = fmt .Sprintf (cliImageFileMask , cli , osName , arch + ".exe" )
133
+ } else {
134
+ fileName = fmt .Sprintf (cliImageFileMask , cli , osName , arch )
135
+ }
136
+ }
137
+ filePath = filepath .Join (cliImageBasePath , fileName )
138
+
139
+ By ("get gzip file from container image" )
140
+ ctx , cancel := context .WithTimeout (context .Background (), time .Minute * 5 )
141
+ defer cancel ()
142
+
143
+ Expect (support .FileFromImage (ctx , image , filePath , targetPath )).To (Succeed ())
144
+
145
+ By ("checksums of gzip file" )
146
+ gzipImageSHA , err := checksumFile (filepath .Join (targetPath , fileName ))
147
+ Expect (err ).NotTo (HaveOccurred ())
148
+
149
+ By ("compare checksum with client server file" )
150
+ Expect (gzipImageSHA ).To (Equal (gzipServerSHA ))
69
151
})
70
152
}
71
153
}
@@ -165,3 +247,19 @@ func getMachOCpuType(arch string) macho.Cpu {
165
247
return 0 // Unsupported architecture
166
248
}
167
249
}
250
+
251
+ // checksumFile computes the SHA256 checksum of a given file.
252
+ func checksumFile (filePath string ) ([]byte , error ) {
253
+ file , err := os .Open (filePath )
254
+ if err != nil {
255
+ return nil , fmt .Errorf ("failed to open file %s: %w" , filePath , err )
256
+ }
257
+ defer func () { _ = file .Close () }()
258
+
259
+ hasher := sha256 .New ()
260
+ if _ , err := io .Copy (hasher , file ); err != nil {
261
+ return nil , fmt .Errorf ("failed to hash file %s: %w" , filePath , err )
262
+ }
263
+
264
+ return hasher .Sum (nil ), nil
265
+ }
0 commit comments