github.com/projecteru2/core@v0.0.0-20240321043226-06bcc1c23f58/source/common/common_test.go (about)

     1  package common
     2  
     3  import (
     4  	"archive/zip"
     5  	"context"
     6  	"io"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"os"
    10  	"path"
    11  	"path/filepath"
    12  	"testing"
    13  	"time"
    14  
    15  	"github.com/projecteru2/core/types"
    16  
    17  	"github.com/stretchr/testify/assert"
    18  )
    19  
    20  const (
    21  	repo    = "https://github.com/VihaanVerma89/submoduleTest.git"
    22  	rev     = "a2bf01635db316e660a2cbba80b399c21fe012cf"
    23  	subname = "subrepo"
    24  	privkey = `-----BEGIN OPENSSH PRIVATE KEY-----
    25  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
    71  wBtN56wGIEOHeQAAAAN0aHkBAgMEBQY=
    72  -----END OPENSSH PRIVATE KEY-----`
    73  )
    74  
    75  func TestSourceCode(t *testing.T) {
    76  	privFile, err := os.CreateTemp("", "priv")
    77  	assert.NoError(t, err)
    78  	_, err = privFile.WriteString(privkey)
    79  	assert.NoError(t, err)
    80  	privFile.Close()
    81  	config := types.GitConfig{
    82  		CloneTimeout: time.Second * 300,
    83  		PrivateKey:   privFile.Name(),
    84  	}
    85  	g, err := NewGitScm(config, nil)
    86  	assert.NoError(t, err)
    87  	ctx := context.Background()
    88  
    89  	dname, err := os.MkdirTemp("", "source")
    90  	assert.NoError(t, err)
    91  	err = g.SourceCode(ctx, "file:///xxxx", dname, "MASTER", false)
    92  	assert.Error(t, err)
    93  	err = g.SourceCode(ctx, "git@xxxx", dname, "MASTER", false)
    94  	assert.Error(t, err)
    95  	err = g.SourceCode(ctx, "gitlab@xxxx", dname, "MASTER", false)
    96  	assert.Error(t, err)
    97  
    98  	err = g.SourceCode(ctx, repo, dname, "NOTHING", false)
    99  	assert.Error(t, err)
   100  
   101  	os.RemoveAll(dname)
   102  	os.Mkdir(dname, 0755)
   103  	err = g.SourceCode(ctx, repo, dname, rev, true)
   104  	assert.NoError(t, err)
   105  	// auto clone submodule, so vendor can't remove by os.Remove
   106  	subrepo := filepath.Join(dname, subname)
   107  	err = os.Remove(subrepo)
   108  	assert.Error(t, err)
   109  	dotGit := filepath.Join(dname, ".git")
   110  	_, err = os.Stat(dotGit)
   111  	assert.NoError(t, err)
   112  	// Security dir
   113  	err = g.Security(dname)
   114  	assert.NoError(t, err)
   115  	_, err = os.Stat(dotGit)
   116  	assert.Error(t, err)
   117  
   118  	os.Remove(privFile.Name())
   119  	os.Remove(privFile.Name())
   120  	os.RemoveAll(dname)
   121  }
   122  
   123  func TestArtifact(t *testing.T) {
   124  	rawString := "test"
   125  	authValue := "test"
   126  	origFile, err := os.CreateTemp("", "orig")
   127  	assert.NoError(t, err)
   128  	origFile.WriteString(rawString)
   129  	origFile.Close()
   130  	zipFile, err := os.CreateTemp("", "zip")
   131  	assert.NoError(t, err)
   132  	assert.NoError(t, zipFiles(zipFile, []string{origFile.Name()}))
   133  
   134  	data, err := os.ReadFile(zipFile.Name())
   135  	assert.NoError(t, err)
   136  	savedDir, err := os.MkdirTemp("", "saved")
   137  	assert.NoError(t, err)
   138  
   139  	g := &GitScm{}
   140  	testServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
   141  		r := req.Header.Get("TEST")
   142  		if r != authValue {
   143  			res.WriteHeader(400)
   144  			return
   145  		}
   146  		res.Write(data)
   147  	}))
   148  	defer func() { testServer.Close() }()
   149  	err = g.Artifact(context.Background(), "invaildurl", savedDir)
   150  	assert.Error(t, err)
   151  	// no header
   152  	err = g.Artifact(context.Background(), testServer.URL, savedDir)
   153  	assert.Error(t, err)
   154  	// vaild
   155  	g.AuthHeaders = map[string]string{"TEST": authValue}
   156  	err = g.Artifact(context.Background(), testServer.URL, savedDir)
   157  	assert.NoError(t, err)
   158  
   159  	fname := filepath.Join(savedDir, path.Base(origFile.Name()))
   160  	_, err = os.Stat(fname)
   161  	assert.NoError(t, err)
   162  	saved, err := os.ReadFile(fname)
   163  	assert.NoError(t, err)
   164  	assert.Equal(t, string(saved), rawString)
   165  
   166  	os.Remove(origFile.Name())
   167  	os.Remove(zipFile.Name())
   168  	os.RemoveAll(savedDir)
   169  }
   170  
   171  func zipFiles(newfile *os.File, files []string) error {
   172  	defer newfile.Close()
   173  
   174  	zipWriter := zip.NewWriter(newfile)
   175  	defer zipWriter.Close()
   176  
   177  	// Add files to zip
   178  	for _, file := range files {
   179  
   180  		zipfile, err := os.Open(file)
   181  		if err != nil {
   182  			return err
   183  		}
   184  		defer zipfile.Close()
   185  
   186  		// Get the file information
   187  		info, err := zipfile.Stat()
   188  		if err != nil {
   189  			return err
   190  		}
   191  
   192  		header, err := zip.FileInfoHeader(info)
   193  		if err != nil {
   194  			return err
   195  		}
   196  
   197  		// Change to deflate to gain better compression
   198  		// see http://golang.org/pkg/archive/zip/#pkg-constants
   199  		header.Method = zip.Deflate
   200  
   201  		writer, err := zipWriter.CreateHeader(header)
   202  		if err != nil {
   203  			return err
   204  		}
   205  		_, err = io.Copy(writer, zipfile)
   206  		if err != nil {
   207  			return err
   208  		}
   209  	}
   210  	return nil
   211  }