github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/model/app/installer_test.go (about)

     1  package app_test
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"errors"
     7  	"fmt"
     8  	"net"
     9  	"net/http"
    10  	"net/http/httptest"
    11  	"net/url"
    12  	"os/exec"
    13  	"strconv"
    14  	"testing"
    15  
    16  	"github.com/cozy/cozy-stack/model/app"
    17  	"github.com/stretchr/testify/require"
    18  )
    19  
    20  var stackStarted bool
    21  
    22  var localGitCmd *exec.Cmd
    23  var localGitDir string
    24  var localVersion string
    25  var localServices string
    26  var ts *httptest.Server
    27  
    28  var manGen func() string
    29  var manName string
    30  
    31  type transport struct{}
    32  
    33  func (t *transport) RoundTrip(req *http.Request) (*http.Response, error) {
    34  	req2 := new(http.Request)
    35  	*req2 = *req
    36  	req2.URL, _ = url.Parse(ts.URL)
    37  	return http.DefaultTransport.RoundTrip(req2)
    38  }
    39  
    40  func manifestWebapp() string {
    41  	if localServices == "" {
    42  		localServices = "{}"
    43  	}
    44  	return `{
    45    "description": "A mini app to test cozy-stack-v2",
    46    "developer": {
    47      "name": "Bruno",
    48      "url": "cozy.io"
    49    },
    50    "license": "MIT",
    51    "name": "mini-app",
    52    "permissions": {},
    53    "slug": "mini",
    54    "type": "webapp",
    55    "version": "` + localVersion + `",
    56    "services": ` + localServices + `
    57  }`
    58  }
    59  
    60  func manifestKonnector() string {
    61  	return `{
    62    "description": "A mini konnector to test cozy-stack-v2",
    63    "type": "node",
    64    "developer": {
    65      "name": "Bruno",
    66      "url": "cozy.io"
    67    },
    68    "license": "MIT",
    69    "name": "mini-app",
    70    "permissions": {},
    71    "slug": "mini",
    72    "type": "konnector",
    73    "version": "` + localVersion + `"
    74  }`
    75  }
    76  
    77  func serveGitRep(t *testing.T) (string, context.CancelFunc) {
    78  	localGitDir = t.TempDir()
    79  	args := `
    80  echo '` + manifestWebapp() + `' > ` + app.WebappManifestName + ` && \
    81  echo '` + manifestKonnector() + `' > ` + app.KonnectorManifestName + ` && \
    82  git init . && \
    83  git config user.name "cozy" && \
    84  git config user.email "cozy@cloud.fr" && \
    85  git add . && \
    86  git commit -m 'Initial commit' && \
    87  git checkout -b branch && \
    88  echo 'branch' > branch && \
    89  git add . && \
    90  git commit -m 'Create a branch' && \
    91  git checkout -`
    92  
    93  	cmd := exec.Command("bash", "-c", args)
    94  	cmd.Dir = localGitDir
    95  
    96  	out1, err := cmd.CombinedOutput()
    97  	require.NoError(t, err, "failed to setup the git repo (output: %q): %s", out1, err)
    98  
    99  	port := findAvailablePort(t)
   100  
   101  	// "git daemon --reuseaddr --base-path=./ --export-all ./.git"
   102  	ctx, cancel := context.WithCancel(context.Background())
   103  	localGitCmd = exec.CommandContext(ctx,
   104  		"git", "daemon", "--reuseaddr", "--port="+port, "--base-path=./", "--export-all", "./.git")
   105  	localGitCmd.Dir = localGitDir
   106  
   107  	var out2 bytes.Buffer
   108  	localGitCmd.Stdout = &out2
   109  	localGitCmd.Stderr = &out2
   110  
   111  	go func() {
   112  		err = localGitCmd.Run()
   113  		if err != nil && !errors.Is(context.Canceled, ctx.Err()) {
   114  			panic(fmt.Sprintf("failed to run the git server (output: %q): %s", out2.String(), err))
   115  		}
   116  	}()
   117  
   118  	return fmt.Sprintf("git://localhost:%s/", port), cancel
   119  }
   120  
   121  func doUpgrade(t *testing.T, major int) {
   122  	localVersion = fmt.Sprintf("%d.0.0", major)
   123  	args := `
   124  echo '` + manifestWebapp() + `' > ` + app.WebappManifestName + ` && \
   125  echo '` + manifestKonnector() + `' > ` + app.KonnectorManifestName + ` && \
   126  git commit -am "Upgrade commit" && \
   127  git checkout branch && \
   128  git rebase master && \
   129  git checkout master`
   130  	cmd := exec.Command("bash", "-c", args)
   131  	cmd.Dir = localGitDir
   132  	if out, err := cmd.Output(); err != nil {
   133  		t.Log(string(out), err)
   134  	} else {
   135  		t.Log("did upgrade", localVersion)
   136  	}
   137  }
   138  
   139  func findAvailablePort(t *testing.T) string {
   140  	t.Helper()
   141  
   142  	// ":0" means: find my any available port
   143  	l, err := net.Listen("tcp", ":0")
   144  	require.NoError(t, err)
   145  
   146  	port := l.Addr().(*net.TCPAddr).Port
   147  	require.NoError(t, l.Close())
   148  
   149  	return strconv.Itoa(port)
   150  }