Path: blob/main/test/tests/ide/vscode/python_ws_test.go
2501 views
// Copyright (c) 2020 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package ide56import (7"context"8"crypto/sha256"9"encoding/base64"10"errors"11"fmt"12"os"13"testing"14"time"1516"sigs.k8s.io/e2e-framework/pkg/envconf"17"sigs.k8s.io/e2e-framework/pkg/features"1819protocol "github.com/gitpod-io/gitpod/gitpod-protocol"20agent "github.com/gitpod-io/gitpod/test/pkg/agent/workspace/api"21"github.com/gitpod-io/gitpod/test/pkg/integration"22)2324func poolTask(task func() (bool, error)) (bool, error) {25timeout := time.After(10 * time.Minute)26ticker := time.Tick(20 * time.Second)27for {28select {29case <-timeout:30return false, errors.New("timed out")31case <-ticker:32ok, err := task()33if err != nil {34return false, err35} else if ok {36return true, nil37}38}39}40}4142func TestPythonExtWorkspace(t *testing.T) {43userToken, _ := os.LookupEnv("USER_TOKEN")44integration.SkipWithoutUsername(t, username)45integration.SkipWithoutUserToken(t, userToken)4647f := features.New("PythonExtensionWorkspace").48WithLabel("component", "server").49Assess("it can run python extension in a workspace", func(testCtx context.Context, t *testing.T, cfg *envconf.Config) context.Context {50ctx, cancel := context.WithTimeout(testCtx, 5*time.Minute)51defer cancel()5253api := integration.NewComponentAPI(ctx, cfg.Namespace(), kubeconfig, cfg.Client())54t.Cleanup(func() {55api.Done(t)56})5758userId, err := api.CreateUser(username, userToken)59if err != nil {60t.Fatal(err)61}6263serverOpts := []integration.GitpodServerOpt{integration.WithGitpodUser(username)}64server, err := api.GitpodServer(serverOpts...)65if err != nil {66t.Fatal(err)67}6869_, err = server.UpdateLoggedInUser(ctx, &protocol.User{70AdditionalData: &protocol.AdditionalUserData{71IdeSettings: &protocol.IDESettings{72DefaultIde: "code-latest",73},74},75})76if err != nil {77t.Fatalf("cannot set ide to vscode insiders: %q", err)78}7980nfo, stopWs, err := integration.LaunchWorkspaceFromContextURL(t, ctx, "github.com/gitpod-io/python-test-workspace", username, api)81if err != nil {82t.Fatal(err)83}84defer func() {85sctx, scancel := context.WithTimeout(context.Background(), 5*time.Minute)86defer scancel()8788sapi := integration.NewComponentAPI(sctx, cfg.Namespace(), kubeconfig, cfg.Client())89defer sapi.Done(t)9091stopWs(true, sapi)92}()9394_, err = integration.WaitForWorkspaceStart(t, ctx, nfo.LatestInstance.ID, nfo.Workspace.ID, api)95if err != nil {96t.Fatal(err)97}9899serverConfig, err := integration.GetServerConfig(cfg.Namespace(), cfg.Client())100if err != nil {101t.Fatal(err)102}103104hash := sha256.Sum256([]byte(userId + serverConfig.Session.Secret))105secretKey, err := api.CreateGitpodOneTimeSecret(fmt.Sprintf("%x", hash))106if err != nil {107t.Fatal(err)108}109110sessionCookie, err := api.GitpodSessionCookie(userId, secretKey)111if err != nil {112t.Fatal(err)113}114115rsa, closer, err := integration.Instrument(integration.ComponentWorkspace, "workspace", cfg.Namespace(), kubeconfig, cfg.Client(), integration.WithInstanceID(nfo.LatestInstance.ID), integration.WithWorkspacekitLift(true))116if err != nil {117t.Fatal(err)118}119defer rsa.Close()120integration.DeferCloser(t, closer)121122_, err = poolTask(func() (bool, error) {123var resp agent.ExecResponse124err = rsa.Call("WorkspaceAgent.Exec", &agent.ExecRequest{125Dir: "/workspace/python-test-workspace",126Command: "test",127Args: []string{128"-f",129"__init_task_done__",130},131}, &resp)132133return resp.ExitCode == 0, nil134})135if err != nil {136t.Fatal(err)137}138139serverUrl, err := api.GetServerEndpoint()140141jsonCookie := fmt.Sprintf(142`{"name": "%v","value": "%v", "url": "%v","expires": %v,"httpOnly": %v,"secure": %v,"sameSite": "Lax"}`,143sessionCookie.Name,144sessionCookie.Value,145serverUrl,146sessionCookie.Expires.Unix(),147sessionCookie.HttpOnly,148sessionCookie.Secure,149)150151var resp agent.ExecResponse152err = rsa.Call("WorkspaceAgent.Exec", &agent.ExecRequest{153Dir: "/workspace/python-test-workspace",154Command: "yarn",155Args: []string{156"gp-code-server-test",157fmt.Sprintf("--endpoint=%s", nfo.LatestInstance.IdeURL),158"--workspacePath=./src/testWorkspace",159"--extensionDevelopmentPath=./out",160"--extensionTestsPath=./out/test/suite",161},162Env: []string{163fmt.Sprintf("AUTH_COOKIE=%s", base64.StdEncoding.EncodeToString([]byte(jsonCookie))),164},165}, &resp)166167if err != nil {168t.Fatal(err)169}170171t.Log("Ide integration stdout:\n", resp.Stdout)172if resp.ExitCode != 0 {173t.Log("Ide integration stderr:\n", resp.Stderr)174t.Fatal("There was an error running ide test")175}176177return testCtx178}).179Feature()180181testEnv.Test(t, f)182}183184185