github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/cli/get_test.go (about) 1 package cli 2 3 import ( 4 "context" 5 "net" 6 "path/filepath" 7 "strconv" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 13 "k8s.io/cli-runtime/pkg/genericclioptions" 14 "k8s.io/kubectl/pkg/cmd/util" 15 ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" 16 17 "github.com/tilt-dev/tilt-apiserver/pkg/server/testdata" 18 "github.com/tilt-dev/tilt/internal/hud/server" 19 "github.com/tilt-dev/tilt/internal/store" 20 "github.com/tilt-dev/tilt/internal/testutils" 21 "github.com/tilt-dev/tilt/internal/testutils/tempdir" 22 "github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1" 23 "github.com/tilt-dev/tilt/pkg/assets" 24 "github.com/tilt-dev/tilt/pkg/model" 25 "github.com/tilt-dev/wmclient/pkg/analytics" 26 "github.com/tilt-dev/wmclient/pkg/dirs" 27 ) 28 29 func TestGet(t *testing.T) { 30 f := newServerFixture(t) 31 32 err := f.client.Create(f.ctx, &v1alpha1.Cmd{ 33 ObjectMeta: metav1.ObjectMeta{Name: "my-sleep"}, 34 Spec: v1alpha1.CmdSpec{ 35 Args: []string{"sleep", "1"}, 36 }, 37 }) 38 require.NoError(t, err) 39 40 streams, _, out, _ := genericclioptions.NewTestIOStreams() 41 get := newGetCmd(streams) 42 get.register() 43 44 err = get.run(f.ctx, []string{"cmd", "my-sleep"}) 45 require.NoError(t, err) 46 47 assert.Contains(t, out.String(), `NAME CREATED AT 48 my-sleep`) 49 } 50 51 type staticConnProvider struct { 52 l net.Listener 53 } 54 55 func newStaticConnProvider(t testing.TB) *staticConnProvider { 56 l, err := net.Listen("tcp", "localhost:0") 57 require.NoError(t, err) 58 return &staticConnProvider{l: l} 59 } 60 61 func (p *staticConnProvider) Dial(network, address string) (net.Conn, error) { 62 return net.Dial(network, p.l.Addr().String()) 63 } 64 func (p *staticConnProvider) DialContext(ctx context.Context, network, address string) (net.Conn, error) { 65 return (&net.Dialer{}).DialContext(ctx, network, p.l.Addr().String()) 66 } 67 func (p *staticConnProvider) Listen(network, address string) (net.Listener, error) { 68 return p.l, nil 69 } 70 71 type serverFixture struct { 72 *tempdir.TempDirFixture 73 ctx context.Context 74 cancel func() 75 hudsc *server.HeadsUpServerController 76 client ctrlclient.Client 77 analytics *analytics.MemoryAnalytics 78 79 origPort int 80 } 81 82 func newServerFixture(t *testing.T) *serverFixture { 83 f := tempdir.NewTempDirFixture(t) 84 util.BehaviorOnFatal(func(err string, code int) { 85 t.Fatal(err) 86 }) 87 88 dir := dirs.NewTiltDevDirAt(f.Path()) 89 90 ctx, a, _ := testutils.CtxAndAnalyticsForTest() 91 ctx, cancel := context.WithCancel(ctx) 92 apiConnProvider := newStaticConnProvider(t) 93 _, apiPortString, _ := net.SplitHostPort(apiConnProvider.l.Addr().String()) 94 apiPort, err := strconv.Atoi(apiPortString) 95 require.NoError(t, err) 96 cfg, err := server.ProvideTiltServerOptions(ctx, model.TiltBuild{}, apiConnProvider, 97 "corgi-charge", testdata.CertKey(), server.APIServerPort(apiPort)) 98 require.NoError(t, err) 99 100 webListener, err := server.ProvideWebListener("localhost", model.WebPort(0)) 101 require.NoError(t, err) 102 103 _, webPortString, _ := net.SplitHostPort(webListener.Addr().String()) 104 webPort, err := strconv.Atoi(webPortString) 105 require.NoError(t, err) 106 107 cfgAccess := server.ProvideConfigAccess(dir) 108 hudsc := server.ProvideHeadsUpServerController(cfgAccess, model.ProvideAPIServerName(model.WebPort(webPort)), 109 webListener, cfg, &server.HeadsUpServer{}, assets.NewFakeServer(), model.WebURL{}) 110 st := store.NewTestingStore() 111 require.NoError(t, hudsc.SetUp(ctx, st)) 112 113 scheme := v1alpha1.NewScheme() 114 client, err := ctrlclient.New(cfg.GenericConfig.LoopbackClientConfig, ctrlclient.Options{Scheme: scheme}) 115 require.NoError(t, err) 116 117 t.Setenv("TILT_CONFIG", filepath.Join(f.Path(), "config")) 118 119 origPort := defaultWebPort 120 defaultWebPort = webPort 121 122 ret := &serverFixture{ 123 TempDirFixture: f, 124 ctx: ctx, 125 cancel: cancel, 126 hudsc: hudsc, 127 client: client, 128 origPort: origPort, 129 analytics: a, 130 } 131 132 t.Cleanup(ret.TearDown) 133 return ret 134 } 135 136 func (f *serverFixture) TearDown() { 137 f.hudsc.TearDown(f.ctx) 138 f.cancel() 139 defaultWebPort = f.origPort 140 util.DefaultBehaviorOnFatal() 141 }