Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/test/tests/ide/vscode/python_ws_test.go
2501 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 ide
6
7
import (
8
"context"
9
"crypto/sha256"
10
"encoding/base64"
11
"errors"
12
"fmt"
13
"os"
14
"testing"
15
"time"
16
17
"sigs.k8s.io/e2e-framework/pkg/envconf"
18
"sigs.k8s.io/e2e-framework/pkg/features"
19
20
protocol "github.com/gitpod-io/gitpod/gitpod-protocol"
21
agent "github.com/gitpod-io/gitpod/test/pkg/agent/workspace/api"
22
"github.com/gitpod-io/gitpod/test/pkg/integration"
23
)
24
25
func poolTask(task func() (bool, error)) (bool, error) {
26
timeout := time.After(10 * time.Minute)
27
ticker := time.Tick(20 * time.Second)
28
for {
29
select {
30
case <-timeout:
31
return false, errors.New("timed out")
32
case <-ticker:
33
ok, err := task()
34
if err != nil {
35
return false, err
36
} else if ok {
37
return true, nil
38
}
39
}
40
}
41
}
42
43
func TestPythonExtWorkspace(t *testing.T) {
44
userToken, _ := os.LookupEnv("USER_TOKEN")
45
integration.SkipWithoutUsername(t, username)
46
integration.SkipWithoutUserToken(t, userToken)
47
48
f := features.New("PythonExtensionWorkspace").
49
WithLabel("component", "server").
50
Assess("it can run python extension in a workspace", func(testCtx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
51
ctx, cancel := context.WithTimeout(testCtx, 5*time.Minute)
52
defer cancel()
53
54
api := integration.NewComponentAPI(ctx, cfg.Namespace(), kubeconfig, cfg.Client())
55
t.Cleanup(func() {
56
api.Done(t)
57
})
58
59
userId, err := api.CreateUser(username, userToken)
60
if err != nil {
61
t.Fatal(err)
62
}
63
64
serverOpts := []integration.GitpodServerOpt{integration.WithGitpodUser(username)}
65
server, err := api.GitpodServer(serverOpts...)
66
if err != nil {
67
t.Fatal(err)
68
}
69
70
_, err = server.UpdateLoggedInUser(ctx, &protocol.User{
71
AdditionalData: &protocol.AdditionalUserData{
72
IdeSettings: &protocol.IDESettings{
73
DefaultIde: "code-latest",
74
},
75
},
76
})
77
if err != nil {
78
t.Fatalf("cannot set ide to vscode insiders: %q", err)
79
}
80
81
nfo, stopWs, err := integration.LaunchWorkspaceFromContextURL(t, ctx, "github.com/gitpod-io/python-test-workspace", username, api)
82
if err != nil {
83
t.Fatal(err)
84
}
85
defer func() {
86
sctx, scancel := context.WithTimeout(context.Background(), 5*time.Minute)
87
defer scancel()
88
89
sapi := integration.NewComponentAPI(sctx, cfg.Namespace(), kubeconfig, cfg.Client())
90
defer sapi.Done(t)
91
92
stopWs(true, sapi)
93
}()
94
95
_, err = integration.WaitForWorkspaceStart(t, ctx, nfo.LatestInstance.ID, nfo.Workspace.ID, api)
96
if err != nil {
97
t.Fatal(err)
98
}
99
100
serverConfig, err := integration.GetServerConfig(cfg.Namespace(), cfg.Client())
101
if err != nil {
102
t.Fatal(err)
103
}
104
105
hash := sha256.Sum256([]byte(userId + serverConfig.Session.Secret))
106
secretKey, err := api.CreateGitpodOneTimeSecret(fmt.Sprintf("%x", hash))
107
if err != nil {
108
t.Fatal(err)
109
}
110
111
sessionCookie, err := api.GitpodSessionCookie(userId, secretKey)
112
if err != nil {
113
t.Fatal(err)
114
}
115
116
rsa, closer, err := integration.Instrument(integration.ComponentWorkspace, "workspace", cfg.Namespace(), kubeconfig, cfg.Client(), integration.WithInstanceID(nfo.LatestInstance.ID), integration.WithWorkspacekitLift(true))
117
if err != nil {
118
t.Fatal(err)
119
}
120
defer rsa.Close()
121
integration.DeferCloser(t, closer)
122
123
_, err = poolTask(func() (bool, error) {
124
var resp agent.ExecResponse
125
err = rsa.Call("WorkspaceAgent.Exec", &agent.ExecRequest{
126
Dir: "/workspace/python-test-workspace",
127
Command: "test",
128
Args: []string{
129
"-f",
130
"__init_task_done__",
131
},
132
}, &resp)
133
134
return resp.ExitCode == 0, nil
135
})
136
if err != nil {
137
t.Fatal(err)
138
}
139
140
serverUrl, err := api.GetServerEndpoint()
141
142
jsonCookie := fmt.Sprintf(
143
`{"name": "%v","value": "%v", "url": "%v","expires": %v,"httpOnly": %v,"secure": %v,"sameSite": "Lax"}`,
144
sessionCookie.Name,
145
sessionCookie.Value,
146
serverUrl,
147
sessionCookie.Expires.Unix(),
148
sessionCookie.HttpOnly,
149
sessionCookie.Secure,
150
)
151
152
var resp agent.ExecResponse
153
err = rsa.Call("WorkspaceAgent.Exec", &agent.ExecRequest{
154
Dir: "/workspace/python-test-workspace",
155
Command: "yarn",
156
Args: []string{
157
"gp-code-server-test",
158
fmt.Sprintf("--endpoint=%s", nfo.LatestInstance.IdeURL),
159
"--workspacePath=./src/testWorkspace",
160
"--extensionDevelopmentPath=./out",
161
"--extensionTestsPath=./out/test/suite",
162
},
163
Env: []string{
164
fmt.Sprintf("AUTH_COOKIE=%s", base64.StdEncoding.EncodeToString([]byte(jsonCookie))),
165
},
166
}, &resp)
167
168
if err != nil {
169
t.Fatal(err)
170
}
171
172
t.Log("Ide integration stdout:\n", resp.Stdout)
173
if resp.ExitCode != 0 {
174
t.Log("Ide integration stderr:\n", resp.Stderr)
175
t.Fatal("There was an error running ide test")
176
}
177
178
return testCtx
179
}).
180
Feature()
181
182
testEnv.Test(t, f)
183
}
184
185