// Copyright (c) 2020 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 ports import ( "context" "testing" "github.com/golang/mock/gomock" "github.com/google/go-cmp/cmp" gitpod "github.com/gitpod-io/gitpod/gitpod-protocol" ) func TestPortsConfig(t *testing.T) { tests := []struct { Desc string GitpodConfig *gitpod.GitpodConfig Expectation *PortConfigTestExpectations }{ { Desc: "no configs", Expectation: &PortConfigTestExpectations{}, }, { Desc: "instance port config", GitpodConfig: &gitpod.GitpodConfig{ Ports: []*gitpod.PortsItems{ { Port: 9229, OnOpen: "ignore", Visibility: "public", Name: "Nice Port Name", Description: "Nice Port Description", }, }, }, Expectation: &PortConfigTestExpectations{ InstancePortConfigs: []*gitpod.PortConfig{ { Port: 9229, OnOpen: "ignore", Visibility: "public", Name: "Nice Port Name", Description: "Nice Port Description", }, }, }, }, { Desc: "instance range config", GitpodConfig: &gitpod.GitpodConfig{ Ports: []*gitpod.PortsItems{ { Port: "9229-9339", OnOpen: "ignore", Visibility: "public", Name: "Nice Port Name", Description: "Nice Port Description", }, }, }, Expectation: &PortConfigTestExpectations{ InstanceRangeConfigs: []*RangeConfig{ { PortsItems: gitpod.PortsItems{ Port: "9229-9339", OnOpen: "ignore", Visibility: "public", Description: "Nice Port Description", Name: "Nice Port Name", }, Start: 9229, End: 9339, }, }, }, }, } for _, test := range tests { t.Run(test.Desc, func(t *testing.T) { configService := &testGitpodConfigService{ configs: make(chan *gitpod.GitpodConfig), } defer close(configService.configs) context, cancel := context.WithCancel(context.Background()) defer cancel() workspaceID := "test" ctrl := gomock.NewController(t) defer ctrl.Finish() service := NewConfigService(workspaceID, configService) updates, errors := service.Observe(context) actual := &PortConfigTestExpectations{} if test.GitpodConfig != nil { go func() { configService.configs <- test.GitpodConfig }() select { case err := <-errors: t.Fatal(err) case change := <-updates: actual.InstanceRangeConfigs = change.instanceRangeConfigs for _, config := range change.instancePortConfigs { actual.InstancePortConfigs = append(actual.InstancePortConfigs, &config.PortConfig) } } } if diff := cmp.Diff(test.Expectation, actual); diff != "" { t.Errorf("unexpected output (-want +got):\n%s", diff) } }) } } type PortConfigTestExpectations struct { InstancePortConfigs []*gitpod.PortConfig InstanceRangeConfigs []*RangeConfig } type testGitpodConfigService struct { configs chan *gitpod.GitpodConfig } func (service *testGitpodConfigService) Watch(ctx context.Context) { } func (service *testGitpodConfigService) Observe(ctx context.Context) <-chan *gitpod.GitpodConfig { return service.configs }