vaguerent/internal/runner/runner_test.go
2022-04-25 12:23:57 -05:00

146 lines
3.8 KiB
Go

package runner
import (
"context"
"os"
"testing"
"time"
"github.com/stretchr/testify/require"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"github.com/hashicorp/vagrant/internal/server/proto/vagrant_server"
"github.com/hashicorp/vagrant/internal/server/singleprocess"
)
func TestRunnerStart(t *testing.T) {
require := require.New(t)
ctx := context.Background()
client := singleprocess.TestServer(t)
// Initialize our runner
runner, err := New(
WithClient(client),
)
require.NoError(err)
defer runner.Close()
// The runner should not be registered
_, err = client.GetRunner(ctx, &vagrant_server.GetRunnerRequest{RunnerId: runner.Id()})
require.Error(err)
require.Equal(codes.NotFound, status.Code(err))
// Start it
require.NoError(runner.Start())
// The runner should be registered
resp, err := client.GetRunner(ctx, &vagrant_server.GetRunnerRequest{RunnerId: runner.Id()})
require.NoError(err)
require.Equal(runner.Id(), resp.Id)
// Close
require.NoError(runner.Close())
time.Sleep(100 * time.Millisecond)
// The runner should not be registered
_, err = client.GetRunner(ctx, &vagrant_server.GetRunnerRequest{RunnerId: runner.Id()})
require.Error(err)
require.Equal(codes.NotFound, status.Code(err))
}
func TestRunnerStart_config(t *testing.T) {
t.Run("set and unset", func(t *testing.T) {
require := require.New(t)
ctx := context.Background()
client := singleprocess.TestServer(t)
cfgVar := &vagrant_server.ConfigVar{
Scope: &vagrant_server.ConfigVar_Runner{
Runner: &vagrant_server.Ref_Runner{
Target: &vagrant_server.Ref_Runner_Any{
Any: &vagrant_server.Ref_RunnerAny{},
},
},
},
Name: "I_AM_A_TEST_VALUE",
Value: "1234567890",
}
// Initialize our runner
runner := TestRunner(t, WithClient(client))
defer runner.Close()
require.NoError(runner.Start())
// Verify it is not set
require.Empty(os.Getenv(cfgVar.Name))
// Set some config
_, err := client.SetConfig(ctx, &vagrant_server.ConfigSetRequest{Variables: []*vagrant_server.ConfigVar{cfgVar}})
require.NoError(err)
// Should be set
require.Eventually(func() bool {
return os.Getenv(cfgVar.Name) == cfgVar.Value
}, 1000*time.Millisecond, 50*time.Millisecond)
// Unset
cfgVar.Value = ""
_, err = client.SetConfig(ctx, &vagrant_server.ConfigSetRequest{Variables: []*vagrant_server.ConfigVar{cfgVar}})
require.NoError(err)
// Should be unset
require.Eventually(func() bool {
return os.Getenv(cfgVar.Name) == ""
}, 1000*time.Millisecond, 50*time.Millisecond)
})
t.Run("unset with original env", func(t *testing.T) {
require := require.New(t)
ctx := context.Background()
client := singleprocess.TestServer(t)
cfgVar := &vagrant_server.ConfigVar{
Scope: &vagrant_server.ConfigVar_Runner{
Runner: &vagrant_server.Ref_Runner{
Target: &vagrant_server.Ref_Runner_Any{
Any: &vagrant_server.Ref_RunnerAny{},
},
},
},
Name: "I_AM_A_TEST_VALUE",
Value: "1234567890",
}
// Set a value
require.NoError(os.Setenv(cfgVar.Name, "ORIGINAL"))
defer os.Unsetenv(cfgVar.Name)
// Initialize our runner
runner := TestRunner(t, WithClient(client))
defer runner.Close()
require.NoError(runner.Start())
// Set some config
_, err := client.SetConfig(ctx, &vagrant_server.ConfigSetRequest{Variables: []*vagrant_server.ConfigVar{cfgVar}})
require.NoError(err)
// Should be set
require.Eventually(func() bool {
return os.Getenv(cfgVar.Name) == cfgVar.Value
}, 1000*time.Millisecond, 50*time.Millisecond)
// Unset
cfgVar.Value = ""
_, err = client.SetConfig(ctx, &vagrant_server.ConfigSetRequest{Variables: []*vagrant_server.ConfigVar{cfgVar}})
require.NoError(err)
// Should be unset back to original value
require.Eventually(func() bool {
return os.Getenv(cfgVar.Name) == "ORIGINAL"
}, 1000*time.Millisecond, 50*time.Millisecond)
})
}