github.com/vchain-us/vcn@v0.9.11-0.20210921212052-a2484d23c0b3/pkg/cmd/sign/sign_integration_test.go (about) 1 // +build integration 2 3 /* 4 * Copyright (c) 2018-2020 vChain, Inc. All Rights Reserved. 5 * This software is released under GPL3. 6 * The full license information can be found under: 7 * https://www.gnu.org/licenses/gpl-3.0.en.html 8 * 9 */ 10 11 package sign_test 12 13 import ( 14 "fmt" 15 "github.com/stretchr/testify/assert" 16 "github.com/vchain-us/vcn/pkg/api" 17 "github.com/vchain-us/vcn/pkg/extractor" 18 "github.com/vchain-us/vcn/pkg/extractor/file" 19 "github.com/vchain-us/vcn/pkg/meta" 20 "github.com/vchain-us/vcn/pkg/store" 21 "io/ioutil" 22 "log" 23 "os" 24 "os/exec" 25 "sync" 26 "testing" 27 ) 28 29 func TestParallelNotarization(t *testing.T) { 30 31 userEmail := os.Getenv(meta.VcnUserEnv) 32 if userEmail == "" { 33 log.Fatalf("to run this test please set %s environment variable", meta.VcnUserEnv) 34 } 35 userPw := os.Getenv(meta.VcnPasswordEnv) 36 if userPw == "" { 37 log.Fatalf("to run this test please set %s environment variable", meta.VcnPasswordEnv) 38 } 39 40 extractor.Register(file.Scheme, file.Artifact) 41 user := &api.User{} 42 43 su := &store.User{Email: userEmail} 44 45 user.UserByCfg(su) 46 47 err := user.Authenticate(userPw, "") 48 assert.NoError(t, err) 49 50 wg := sync.WaitGroup{} 51 52 wg.Add(1) 53 go func() { 54 a, _ := extractor.Extract([]string{"file://../../../CONTRIBUTING.md"}) 55 _, err := psign(user, a, userPw) 56 assert.NoError(t, err) 57 wg.Done() 58 }() 59 wg.Add(1) 60 go func() { 61 a, _ := extractor.Extract([]string{"file://../../../README.md"}) 62 _, err := psign(user, a, userPw) 63 assert.NoError(t, err) 64 wg.Done() 65 }() 66 67 wg.Add(1) 68 go func() { 69 a, _ := extractor.Extract([]string{"file://../../../LICENSE"}) 70 _, err := psign(user, a, userPw) 71 assert.NoError(t, err) 72 wg.Done() 73 }() 74 75 wg.Add(1) 76 go func() { 77 a, _ := extractor.Extract([]string{"file://../../../go.mod"}) 78 _, err := psign(user, a, userPw) 79 assert.NoError(t, err) 80 wg.Done() 81 }() 82 83 wg.Add(1) 84 go func() { 85 a, _ := extractor.Extract([]string{"file://../../../Makefile"}) 86 _, err := psign(user, a, userPw) 87 assert.NoError(t, err) 88 wg.Done() 89 }() 90 91 wg.Add(1) 92 go func() { 93 a, _ := extractor.Extract([]string{"file://../../../go.mod"}) 94 _, err := psign(user, a, userPw) 95 assert.NoError(t, err) 96 wg.Done() 97 }() 98 99 wg.Add(1) 100 go func() { 101 a, _ := extractor.Extract([]string{"file://../../../go.sum"}) 102 _, err := psign(user, a, userPw) 103 assert.NoError(t, err) 104 wg.Done() 105 }() 106 107 wg.Add(1) 108 go func() { 109 a, _ := extractor.Extract([]string{"file://../../../Dockerfile"}) 110 _, err := psign(user, a, userPw) 111 assert.NoError(t, err) 112 wg.Done() 113 }() 114 115 wg.Add(1) 116 go func() { 117 a, _ := extractor.Extract([]string{"file://../../../Dockerfile.docker"}) 118 _, err := psign(user, a, userPw) 119 assert.NoError(t, err) 120 wg.Done() 121 }() 122 123 wg.Add(1) 124 go func() { 125 a, _ := extractor.Extract([]string{"file://../../../CONTRIBUTING.md"}) 126 _, err := psign(user, a, userPw) 127 assert.NoError(t, err) 128 wg.Done() 129 }() 130 wg.Add(1) 131 go func() { 132 a, _ := extractor.Extract([]string{"file://../../../README.md"}) 133 _, err := psign(user, a, userPw) 134 assert.NoError(t, err) 135 wg.Done() 136 }() 137 138 wg.Add(1) 139 go func() { 140 a, _ := extractor.Extract([]string{"file://../../../LICENSE"}) 141 _, err := psign(user, a, userPw) 142 assert.NoError(t, err) 143 wg.Done() 144 }() 145 146 wg.Add(1) 147 go func() { 148 a, _ := extractor.Extract([]string{"file://../../../go.mod"}) 149 _, err := psign(user, a, userPw) 150 assert.NoError(t, err) 151 wg.Done() 152 }() 153 154 wg.Add(1) 155 go func() { 156 a, _ := extractor.Extract([]string{"file://../../../Makefile"}) 157 _, err := psign(user, a, userPw) 158 assert.NoError(t, err) 159 wg.Done() 160 }() 161 162 wg.Add(1) 163 go func() { 164 a, _ := extractor.Extract([]string{"file://../../../go.mod"}) 165 _, err := psign(user, a, userPw) 166 assert.NoError(t, err) 167 wg.Done() 168 }() 169 170 wg.Add(1) 171 go func() { 172 a, _ := extractor.Extract([]string{"file://../../../go.sum"}) 173 _, err := psign(user, a, userPw) 174 assert.NoError(t, err) 175 wg.Done() 176 }() 177 178 wg.Add(1) 179 go func() { 180 a, _ := extractor.Extract([]string{"file://../../../Dockerfile"}) 181 _, err := psign(user, a, userPw) 182 assert.NoError(t, err) 183 wg.Done() 184 }() 185 186 wg.Add(1) 187 go func() { 188 a, _ := extractor.Extract([]string{"file://../../../Dockerfile.docker"}) 189 _, err := psign(user, a, userPw) 190 assert.NoError(t, err) 191 wg.Done() 192 }() 193 194 wg.Wait() 195 fmt.Println("done") 196 } 197 198 func psign(user *api.User, a []*api.Artifact, userPw string) (*api.BlockchainVerification, error) { 199 keyin, _, _, err := user.Secret() 200 if err != nil { 201 log.Fatal(err) 202 } 203 opts := []api.SignOption{ 204 api.SignWithKey(keyin, userPw), 205 api.SignWithStatus(meta.StatusTrusted), 206 } 207 208 v, err := user.Sign(*a[0], opts...) 209 fmt.Printf("%s\n", v.Date()) 210 return v, err 211 } 212 213 func TestParallelNotarizationCLI(t *testing.T) { 214 215 if !isCommandAvailable("vcn") { 216 log.Fatalf("please install vcn in your $PATH") 217 } 218 userEmail := os.Getenv(meta.VcnUserEnv) 219 if userEmail == "" { 220 log.Fatalf("to run this test please set %s environment variable", meta.VcnUserEnv) 221 } 222 userPw := os.Getenv(meta.VcnPasswordEnv) 223 if userPw == "" { 224 log.Fatalf("to run this test please set %s environment variable", meta.VcnPasswordEnv) 225 } 226 227 file1, err := ioutil.TempFile("", "_vcn_test_") 228 file1.Write([]byte(`1`)) 229 file1.Close() 230 if err != nil { 231 log.Fatal(err) 232 } 233 file2, err := ioutil.TempFile("", "_vcn_test_") 234 file2.Write([]byte(`2`)) 235 file2.Close() 236 if err != nil { 237 log.Fatal(err) 238 } 239 file3, err := ioutil.TempFile("", "_vcn_test_") 240 file3.Write([]byte(`3`)) 241 file3.Close() 242 if err != nil { 243 log.Fatal(err) 244 } 245 file4, err := ioutil.TempFile("", "_vcn_test_") 246 file4.Write([]byte(`4`)) 247 file4.Close() 248 if err != nil { 249 log.Fatal(err) 250 } 251 file5, err := ioutil.TempFile("", "_vcn_test_") 252 file5.Write([]byte(`5`)) 253 file5.Close() 254 if err != nil { 255 log.Fatal(err) 256 } 257 defer os.Remove(file1.Name()) 258 defer os.Remove(file2.Name()) 259 defer os.Remove(file3.Name()) 260 defer os.Remove(file4.Name()) 261 defer os.Remove(file5.Name()) 262 263 wg := sync.WaitGroup{} 264 wg.Add(1) 265 go func() { 266 err := cliSign(fmt.Sprintf("file://%s", file1.Name())) 267 assert.NoError(t, err) 268 wg.Done() 269 }() 270 271 wg.Add(1) 272 go func() { 273 err := cliSign(fmt.Sprintf("file://%s", file2.Name())) 274 assert.NoError(t, err) 275 wg.Done() 276 }() 277 278 wg.Add(1) 279 go func() { 280 err := cliSign(fmt.Sprintf("file://%s", file3.Name())) 281 assert.NoError(t, err) 282 wg.Done() 283 }() 284 285 wg.Add(1) 286 go func() { 287 err := cliSign(fmt.Sprintf("file://%s", file4.Name())) 288 assert.NoError(t, err) 289 wg.Done() 290 }() 291 292 wg.Add(1) 293 go func() { 294 err := cliSign(fmt.Sprintf("file://%s", file5.Name())) 295 assert.NoError(t, err) 296 wg.Done() 297 }() 298 299 wg.Wait() 300 fmt.Println("done") 301 } 302 303 func cliSign(fn string) error { 304 vcn := exec.Command("vcn", "n", fn) 305 306 stdoutStderr, err := vcn.CombinedOutput() 307 308 fmt.Printf("%s\n", stdoutStderr) 309 310 return err 311 } 312 313 func isCommandAvailable(name string) bool { 314 cmd := exec.Command("/bin/sh", "-c", "command -v "+name) 315 if err := cmd.Run(); err != nil { 316 return false 317 } 318 return true 319 }