Ctrl K
ComunidadGuías…

agent/proto/script_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package proto_test

import (
	"testing"
	"time"

	"github.com/google/uuid"
	"github.com/stretchr/testify/require"
	"google.golang.org/protobuf/encoding/protowire"
	"google.golang.org/protobuf/proto"
	"google.golang.org/protobuf/types/known/durationpb"

	agentproto "github.com/coder/coder/v2/agent/proto"
)

func TestScriptDependenciesRoundTrip(t *testing.T) {
	t.Parallel()

	id, logSourceID := uuid.New(), uuid.New()
	want := &agentproto.Manifest{
		Scripts: []*agentproto.WorkspaceAgentScript{{
			Id:              id[:],
			LogSourceId:     logSourceID[:],
			DisplayName:     "Install tools",
			RunOnStart:      true,
			ResourceAddress: "coder_script.install_tools",
			Dependencies: []*agentproto.WorkspaceAgentScriptDependency{
				{
					PrerequisiteResourceAddress: "coder_script.clone_repo",
					Requirement:                 agentproto.WorkspaceAgentScriptDependency_REQUIREMENT_SUCCESS,
				},
				{
					PrerequisiteResourceAddress: "coder_script.warm_cache",
					Requirement:                 agentproto.WorkspaceAgentScriptDependency_REQUIREMENT_COMPLETION,
				},
			},
		}},
	}

	data, err := proto.Marshal(want)
	require.NoError(t, err)

	got := &agentproto.Manifest{}
	require.NoError(t, proto.Unmarshal(data, got))
	require.True(t, proto.Equal(want, got))
}

// A script with neither new field set must encode to the same bytes it did
// before fields 11 and 12 existed, so an older agent sees nothing new.
// Walking the tags instead of comparing against a recorded byte string
// keeps the test stable when unrelated fields are added later.
func TestUnorderedScriptEncodesWithoutNewFields(t *testing.T) {
	t.Parallel()

	id, logSourceID := uuid.New(), uuid.New()
	script := &agentproto.WorkspaceAgentScript{
		Id:          id[:],
		LogSourceId: logSourceID[:],
		Script:      "git clone ...",
		RunOnStart:  true,
		Timeout:     durationpb.New(2 * time.Minute),
		DisplayName: "Clone repo",
	}
	data, err := proto.Marshal(script)
	require.NoError(t, err)
	require.NotEmpty(t, data)

	for len(data) > 0 {
		num, typ, n := protowire.ConsumeTag(data)
		require.Positive(t, n)
		require.LessOrEqual(t, int(num), 10, "field %d must not be encoded when it is not set", num)
		data = data[n:]

		n = protowire.ConsumeFieldValue(num, typ, data)
		require.Positive(t, n)
		data = data[n:]
	}
}