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 }