Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/test/tests/workspace/git_test.go
2498 views
1
// Copyright (c) 2020 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package workspace
6
7
import (
8
"context"
9
"fmt"
10
"os"
11
"testing"
12
"time"
13
14
"sigs.k8s.io/e2e-framework/pkg/envconf"
15
"sigs.k8s.io/e2e-framework/pkg/features"
16
17
agent "github.com/gitpod-io/gitpod/test/pkg/agent/workspace/api"
18
"github.com/gitpod-io/gitpod/test/pkg/integration"
19
)
20
21
type GitTest struct {
22
Skip bool
23
Name string
24
ContextURL string
25
WorkspaceRoot string
26
Action GitFunc
27
}
28
29
type GitFunc func(rsa *integration.RpcClient, git integration.GitClient, workspaceRoot string) error
30
31
func TestGitActions(t *testing.T) {
32
userToken, _ := os.LookupEnv("USER_TOKEN")
33
integration.SkipWithoutUsername(t, username)
34
integration.SkipWithoutUserToken(t, userToken)
35
36
tests := []GitTest{
37
{
38
Name: "create, add and commit",
39
ContextURL: "github.com/gitpod-io/gitpod-test-repo/tree/integration-test/commit",
40
WorkspaceRoot: "/workspace/gitpod-test-repo",
41
Action: func(rsa *integration.RpcClient, git integration.GitClient, workspaceRoot string) (err error) {
42
var resp agent.ExecResponse
43
err = rsa.Call("WorkspaceAgent.Exec", &agent.ExecRequest{
44
Dir: workspaceRoot,
45
Command: "bash",
46
Args: []string{
47
"-c",
48
"touch file_to_commit.txt",
49
},
50
}, &resp)
51
if err != nil {
52
return err
53
}
54
if resp.ExitCode != 0 {
55
return fmt.Errorf("file create returned rc: %d, out: %v, err: %v", resp.ExitCode, resp.Stdout, resp.Stderr)
56
}
57
err = git.ConfigSafeDirectory()
58
if err != nil {
59
return err
60
}
61
err = git.ConfigUserName(workspaceRoot, username)
62
if err != nil {
63
return err
64
}
65
err = git.ConfigUserEmail(workspaceRoot)
66
if err != nil {
67
return err
68
}
69
err = git.Add(workspaceRoot)
70
if err != nil {
71
return err
72
}
73
err = git.Commit(workspaceRoot, "automatic test commit", false, "--allow-empty")
74
if err != nil {
75
return err
76
}
77
return nil
78
},
79
},
80
{
81
// as of Apr 14, 2023, test fails with:
82
// fatal: could not read Username for 'https://github.com': No such device or address
83
Skip: true,
84
Name: "create, add and commit and PUSH",
85
ContextURL: "github.com/gitpod-io/gitpod-test-repo/tree/integration-test/commit-and-push",
86
WorkspaceRoot: "/workspace/gitpod-test-repo",
87
Action: func(rsa *integration.RpcClient, git integration.GitClient, workspaceRoot string) (err error) {
88
var resp agent.ExecResponse
89
err = rsa.Call("WorkspaceAgent.Exec", &agent.ExecRequest{
90
Dir: workspaceRoot,
91
Command: "bash",
92
Args: []string{
93
"-c",
94
"touch file_to_commit.txt",
95
},
96
}, &resp)
97
if err != nil {
98
return err
99
}
100
if resp.ExitCode != 0 {
101
return fmt.Errorf("file create returned rc: %d, out: %v, err: %v", resp.ExitCode, resp.Stdout, resp.Stderr)
102
}
103
err = git.ConfigSafeDirectory()
104
if err != nil {
105
return err
106
}
107
err = git.ConfigUserName(workspaceRoot, username)
108
if err != nil {
109
return err
110
}
111
err = git.ConfigUserEmail(workspaceRoot)
112
if err != nil {
113
return err
114
}
115
err = git.Add(workspaceRoot)
116
if err != nil {
117
return err
118
}
119
err = git.Commit(workspaceRoot, "automatic test commit", false, "--allow-empty")
120
if err != nil {
121
return err
122
}
123
err = git.Push(workspaceRoot, false)
124
if err != nil {
125
return err
126
}
127
return nil
128
},
129
},
130
}
131
132
f := features.New("GitActions").
133
WithLabel("component", "workspace").
134
Assess("it can run git actions", func(testCtx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
135
ctx, cancel := context.WithTimeout(testCtx, time.Duration(5*len(tests))*time.Minute)
136
defer cancel()
137
138
api := integration.NewComponentAPI(ctx, cfg.Namespace(), kubeconfig, cfg.Client())
139
t.Cleanup(func() {
140
api.Done(t)
141
})
142
143
ffs := []struct {
144
Name string
145
FF string
146
}{
147
{Name: "classic"},
148
}
149
150
for _, ff := range ffs {
151
for _, test := range tests {
152
test := test
153
t.Run(test.ContextURL+"_"+ff.Name, func(t *testing.T) {
154
t.Parallel()
155
if test.Skip {
156
t.SkipNow()
157
}
158
159
username := username + ff.Name
160
userId, err := api.CreateUser(username, userToken)
161
if err != nil {
162
t.Fatal(err)
163
}
164
165
if err := api.UpdateUserFeatureFlag(userId, ff.FF); err != nil {
166
t.Fatal(err)
167
}
168
169
nfo, stopWs, err := integration.LaunchWorkspaceFromContextURL(t, ctx, test.ContextURL, username, api)
170
if err != nil {
171
t.Fatal(err)
172
}
173
t.Cleanup(func() {
174
sctx, scancel := context.WithTimeout(context.Background(), 5*time.Minute)
175
defer scancel()
176
177
sapi := integration.NewComponentAPI(sctx, cfg.Namespace(), kubeconfig, cfg.Client())
178
defer sapi.Done(t)
179
180
_, err := stopWs(false, sapi)
181
if err != nil {
182
t.Fatal(err)
183
}
184
})
185
186
rsa, closer, err := integration.Instrument(integration.ComponentWorkspace, "workspace", cfg.Namespace(), kubeconfig, cfg.Client(), integration.WithInstanceID(nfo.LatestInstance.ID))
187
if err != nil {
188
t.Fatal(err)
189
}
190
defer rsa.Close()
191
integration.DeferCloser(t, closer)
192
193
git := integration.Git(rsa)
194
err = test.Action(rsa, git, test.WorkspaceRoot)
195
if err != nil {
196
t.Fatal(err)
197
}
198
t.Log("test finished successfully")
199
})
200
}
201
}
202
return testCtx
203
}).
204
Feature()
205
206
testEnv.Test(t, f)
207
}
208
209