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  }