2022-12-08 13:05:19 -03:00

134 lines
3.5 KiB
Go

// Copyright (c) 2021 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.
package orchestrator
import (
"testing"
"time"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"google.golang.org/protobuf/types/known/timestamppb"
"github.com/gitpod-io/gitpod/image-builder/api"
wsmanapi "github.com/gitpod-io/gitpod/ws-manager/api"
)
func TestExtractBuildResponse(t *testing.T) {
const (
buildID = "build-id"
ref = "ref"
baseref = "base-ref"
startedAt int64 = 12345
url = "https://some-url.some-domain.com"
ownerToken = "super-secret-owner-token"
)
tests := []struct {
Name string
Mod func(*wsmanapi.WorkspaceStatus)
Expectation func(*api.BuildResponse)
}{
{
Name: "running",
Mod: func(ws *wsmanapi.WorkspaceStatus) {},
Expectation: func(br *api.BuildResponse) {},
},
{
Name: "done",
Mod: func(ws *wsmanapi.WorkspaceStatus) {
ws.Phase = wsmanapi.WorkspacePhase_STOPPING
},
Expectation: func(br *api.BuildResponse) {
br.Status = api.BuildStatus_done_success
br.Info.Status = br.Status
},
},
{
Name: "done stopped",
Mod: func(ws *wsmanapi.WorkspaceStatus) {
ws.Phase = wsmanapi.WorkspacePhase_STOPPED
},
Expectation: func(br *api.BuildResponse) {
br.Status = api.BuildStatus_done_success
br.Info.Status = br.Status
},
},
{
Name: "done task failed",
Mod: func(ws *wsmanapi.WorkspaceStatus) {
ws.Phase = wsmanapi.WorkspacePhase_STOPPING
ws.Conditions.HeadlessTaskFailed = "image build failed"
},
Expectation: func(br *api.BuildResponse) {
br.Status = api.BuildStatus_done_failure
br.Info.Status = br.Status
br.Message = "image build failed"
},
},
{
Name: "done workspace failed",
Mod: func(ws *wsmanapi.WorkspaceStatus) {
ws.Phase = wsmanapi.WorkspacePhase_STOPPING
ws.Conditions.Failed = "image build failed"
},
Expectation: func(br *api.BuildResponse) {
br.Status = api.BuildStatus_done_failure
br.Info.Status = br.Status
br.Message = "image build failed"
},
},
}
for _, test := range tests {
t.Run(test.Name, func(t *testing.T) {
status := &wsmanapi.WorkspaceStatus{
Id: buildID,
Metadata: &wsmanapi.WorkspaceMetadata{
MetaId: buildID,
Annotations: map[string]string{
annotationRef: ref,
annotationBaseRef: baseref,
},
StartedAt: timestamppb.New(time.Unix(startedAt, 0)),
},
Conditions: &wsmanapi.WorkspaceConditions{},
Phase: wsmanapi.WorkspacePhase_RUNNING,
Auth: &wsmanapi.WorkspaceAuthentication{
OwnerToken: ownerToken,
},
Spec: &wsmanapi.WorkspaceSpec{
Url: url,
},
}
test.Mod(status)
act := extractBuildResponse(status)
exp := &api.BuildResponse{
Ref: ref,
BaseRef: baseref,
Status: api.BuildStatus_running,
Info: &api.BuildInfo{
BuildId: buildID,
Ref: ref,
BaseRef: baseref,
Status: api.BuildStatus_running,
StartedAt: startedAt,
LogInfo: &api.LogInfo{
Url: url,
Headers: map[string]string{
"x-gitpod-owner-token": status.Auth.OwnerToken,
},
},
},
}
test.Expectation(exp)
if diff := cmp.Diff(exp, act, cmpopts.IgnoreUnexported(api.BuildResponse{}, api.BuildInfo{}, api.LogInfo{})); diff != "" {
t.Errorf("extractBuildResponse() mismatch (-want +got):\n%s", diff)
}
})
}
}