Path: blob/main/components/supervisor/pkg/ports/served-ports_test.go
2500 views
// Copyright (c) 2020 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package ports56import (7"bytes"8"context"9"io"10"net"11"os"12"strings"13"testing"14"time"1516"github.com/google/go-cmp/cmp"17)1819const validTCPInput = ` sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode200: 00000000:59D8 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 57008615 1 0000000000000000 100 0 0 10 0211: 00000000:17C0 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 57020850 1 0000000000000000 100 0 0 10 0222: 0100007F:170C 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 57019442 1 0000000000000000 100 0 0 10 0233: 0100007F:EB64 0100007F:59D7 01 00000000:00000000 02:00000348 00000000 33333 0 57010758 2 0000000000000000 20 4 1 10 -1244: 940C380A:59D8 0302380A:BFFC 01 00000000:00000000 00:00000000 00000000 33333 0 57015718 3 0000000000000000 20 4 29 61 1725`2627const validTCP6Input = ` sl local_address remote_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode280: 00000000000000000000000000000000:59D7 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 57007063 1 0000000000000000 100 0 0 10 0291: 00000000000000000000000000000000:8C3C 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 57022992 1 0000000000000000 100 0 0 10 0302: 00000000000000000000000001000000:170C 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 57019446 1 0000000000000000 100 0 0 10 0313: 00000000000000000000000000000000:8CF0 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 57018070 1 0000000000000000 100 0 0 10 0324: 0000000000000000FFFF0000940C380A:59D7 0000000000000000FFFF00006100840A:E45C 06 00000000:00000000 03:00001002 00000000 0 0 0 3 0000000000000000335: 0000000000000000FFFF0000940C380A:59D7 0000000000000000FFFF00006100840A:E38A 06 00000000:00000000 03:00000D46 00000000 0 0 0 3 0000000000000000346: 0000000000000000FFFF0000940C380A:59D7 0000000000000000FFFF0000030C380A:DBFE 01 00000000:00000000 02:000005D2 00000000 33333 0 57015690 2 0000000000000000 20 4 0 10 -1357: 0000000000000000FFFF0000940C380A:59D7 0000000000000000FFFF00006100840A:E08A 06 00000000:00000000 03:000003E6 00000000 0 0 0 3 00000000000000003620: 0000000000000000FFFF00000100007F:59D7 0000000000000000FFFF00000100007F:EB64 01 00000000:00000000 02:000003D2 00000000 33333 0 57014424 2 0000000000000000 20 4 0 10 -1`3738func TestObserve(t *testing.T) {39type Expectation [][]ServedPort40tests := []struct {41Name string42FileContents []string43Expectation Expectation44}{45{46Name: "basic positive",47FileContents: []string{48"", "",49validTCPInput, validTCP6Input,50},51Expectation: Expectation{52{53{Address: net.IPv4(127, 0, 0, 1), Port: 5900, BoundToLocalhost: true},54{Address: net.IPv4zero, Port: 6080},55{Address: net.IPv4zero, Port: 23000},56{Address: net.IPv6loopback, Port: 5900, BoundToLocalhost: true},57{Address: net.IPv6zero, Port: 22999},58{Address: net.IPv6zero, Port: 35900},59{Address: net.IPv6zero, Port: 36080},60},61},62},63{64Name: "the same port bound locally on ip4 and ip6",65FileContents: []string{66"", "",67`680: 00000000:17C0 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21757239 1 0000000000000000 100 0 0 10 0691: 0100007F:170C 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21752303 1 0000000000000000 100 0 0 10 0702: 00000000:59D8 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21752496 1 0000000000000000 100 0 0 10 0`,71`720: 00000000000000000000000000000000:EA60 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21750982 1 0000000000000000 100 0 0 10 0731: 00000000000000000000000001000000:170C 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21752306 1 0000000000000000 100 0 0 10 0742: 00000000000000000000000000000000:59D7 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21748173 1 0000000000000000 100 0 0 10 0`,75},76Expectation: Expectation{77{78{Address: net.IPv4(127, 0, 0, 1), Port: 5900, BoundToLocalhost: true},79{Address: net.IPv4zero, Port: 6080},80{Address: net.IPv4zero, Port: 23000},81{Address: net.IPv6loopback, Port: 5900, BoundToLocalhost: true},82{Address: net.IPv6zero, Port: 22999},83{Address: net.IPv6zero, Port: 60000},84},85},86},87{88Name: "the same port bound locally for ip4 and globally for ip6",89FileContents: []string{90"", "",91`920: 00000000:17C0 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21757239 1 0000000000000000 100 0 0 10 0931: 0100007F:170C 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21752303 1 0000000000000000 100 0 0 10 0942: 00000000:59D8 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21752496 1 0000000000000000 100 0 0 10 0`,95`960: 00000000000000000000000000000000:EA60 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21750982 1 0000000000000000 100 0 0 10 0971: 00000000000000000000000000000000:170C 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21752306 1 0000000000000000 100 0 0 10 0982: 00000000000000000000000000000000:59D7 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21748173 1 0000000000000000 100 0 0 10 0`,99},100Expectation: Expectation{101{102{Address: net.IPv4(127, 0, 0, 1), Port: 5900, BoundToLocalhost: true},103{Address: net.IPv4zero, Port: 6080},104{Address: net.IPv4zero, Port: 23000},105{Address: net.IPv6zero, Port: 5900, BoundToLocalhost: false},106{Address: net.IPv6zero, Port: 22999},107{Address: net.IPv6zero, Port: 60000},108},109},110},111{112Name: "the same port bound globally for ip4 and locally for ip6",113FileContents: []string{114"", "",115`1160: 00000000:17C0 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21757239 1 0000000000000000 100 0 0 10 01171: 00000000:170C 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21752303 1 0000000000000000 100 0 0 10 01182: 00000000:59D8 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21752496 1 0000000000000000 100 0 0 10 0`,119`1200: 00000000000000000000000000000000:EA60 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21750982 1 0000000000000000 100 0 0 10 01211: 00000000000000000000000001000000:170C 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21752306 1 0000000000000000 100 0 0 10 01222: 00000000000000000000000000000000:59D7 00000000000000000000000000000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 21748173 1 0000000000000000 100 0 0 10 0`,123},124Expectation: Expectation{125{126{Address: net.IPv4zero, Port: 5900},127{Address: net.IPv4zero, Port: 6080},128{Address: net.IPv4zero, Port: 23000},129{Address: net.IPv6loopback, Port: 5900, BoundToLocalhost: true},130{Address: net.IPv6zero, Port: 22999},131{Address: net.IPv6zero, Port: 60000},132},133},134},135{136Name: "multiple ports bound locally and globally",137FileContents: []string{138"", "",139`1400: AD0E600A:240D 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 53934502 1 0000000000000000 100 0 0 10 01411: 0100007F:240D 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 53938101 1 0000000000000000 100 0 0 10 01422: 00000000:59D8 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 53939555 1 0000000000000000 100 0 0 10 01433: 0100007F:6989 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 54384751 1 0000000000000000 100 0 0 10 10241444: AD0E600A:6989 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 53934503 1 0000000000000000 100 0 0 10 01455: 0100007F:AC48 0100007F:59D7 01 00000000:00000000 02:000004A8 00000000 0 0 53921525 2 0000000000000000 20 4 0 10 -11466: 0100007F:6989 0100007F:C74E 01 00000000:00000000 02:0000653F 00000000 33333 0 54366989 2 0000000000000000 20 4 31 10 -11477: 0100007F:AC40 0100007F:59D7 01 00000000:00000000 02:000004A8 00000000 0 0 53944840 2 0000000000000000 20 4 0 10 -11488: 0100007F:B5D8 0100007F:59D7 01 00000000:00000000 02:0000018F 00000000 0 0 54068010 2 0000000000000000 20 4 0 10 -11499: 0100007F:AC42 0100007F:59D7 01 00000000:00000000 02:000004C2 00000000 0 0 53938397 2 0000000000000000 20 4 0 10 -115010: 0100007F:AC46 0100007F:59D7 01 00000000:00000000 02:000004C2 00000000 0 0 53921524 2 0000000000000000 20 4 0 10 -115111: AD0E600A:B8CC F61BC768:01BB 01 00000000:00000000 02:0000034A 00000000 0 0 53880829 2 0000000000000000 21 4 26 10 -115212: 0100007F:C74E 0100007F:6989 01 00000000:00000000 02:0000077F 00000000 33333 0 54384853 2 0000000000000000 20 4 30 10 -115313: 0100007F:AC44 0100007F:59D7 01 00000000:00000000 02:00000300 00000000 0 0 53932419 2 0000000000000000 20 4 22 10 -115414: 0100007F:AC4A 0100007F:59D7 01 00000000:00000000 02:000004C2 00000000 0 0 53920639 2 0000000000000000 20 4 0 10 -115515: AD0E600A:BAEA F61BC768:01BB 01 00000000:00000000 00:00000000 00000000 33333 0 53962195 1 0000000000000000 20 4 28 10 -115616: AD0E600A:59D8 760B600A:DA78 01 00000000:00000000 00:00000000 00000000 33333 0 53934581 3 0000000000000000 20 4 27 10 3315717: 0100007F:C6A6 0100007F:6989 01 00000000:00000000 02:00000360 00000000 33333 0 54383783 2 0000000000000000 20 4 30 10 -115818: AD0E600A:59D8 760B600A:DAD0 01 00000000:00000000 00:00000000 00000000 33333 0 53961912 3 0000000000000000 20 4 31 10 -115919: 0100007F:AC66 0100007F:59D7 01 00000000:00000000 00:00000000 00000000 33333 0 53939557 1 0000000000000000 20 4 0 10 -116020: 0100007F:AE52 0100007F:59D7 01 00000000:00000000 00:00000000 00000000 33333 0 53963729 1 0000000000000000 20 4 0 10 -116121: 0100007F:6989 0100007F:C6A6 01 00000000:00000000 02:00006120 00000000 33333 0 54366964 2 0000000000000000 20 4 20 10 -1`,162},163Expectation: Expectation{164{165{Address: net.IPv4(10, 96, 14, 173), Port: 9229},166{Address: net.IPv4(127, 0, 0, 1), Port: 9229, BoundToLocalhost: true},167{Address: net.IPv4zero, Port: 23000},168{Address: net.IPv4(10, 96, 14, 173), Port: 27017, BoundToLocalhost: false},169{Address: net.IPv4(127, 0, 0, 1), Port: 27017, BoundToLocalhost: true},170},171},172},173{174Name: "multiple ports bound locally and globally",175FileContents: []string{176"", "",177`178sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode1790: 220E600A:6989 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 61354170 1 0000000000000000 100 0 0 10 01801: 220E600A:240D 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 61354169 1 0000000000000000 100 0 0 10 01812: 0100007F:240D 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 61232087 1 0000000000000000 100 0 0 10 01823: 00000000:59D8 00000000:0000 0A 00000000:00000000 00:00000000 00000000 33333 0 61285963 1 0000000000000000 100 0 0 10 01834: 0100007F:DD60 0100007F:59D7 01 00000000:00000000 02:00000366 00000000 0 0 61278087 2 0000000000000000 20 4 0 10 -11845: 0100007F:DD5E 0100007F:59D7 01 00000000:00000000 02:00000380 00000000 0 0 61286915 2 0000000000000000 20 4 0 10 -11856: 0100007F:DD64 0100007F:59D7 01 00000000:00000000 02:0000019A 00000000 0 0 61281217 2 0000000000000000 20 4 0 10 -11867: 0100007F:E08C 0100007F:59D7 01 00000000:00000000 02:00000233 00000000 0 0 61342352 2 0000000000000000 20 4 0 10 -11878: 0100007F:DD82 0100007F:59D7 01 00000000:00000000 00:00000000 00000000 33333 0 61285965 1 0000000000000000 20 4 0 10 -11889: 220E600A:59D8 760B600A:E920 01 00000000:00000000 00:00000000 00000000 33333 0 61352088 3 0000000000000000 20 4 27 10 2818910: 0100007F:DD62 0100007F:59D7 01 00000000:00000000 02:0000019A 00000000 0 0 61278088 2 0000000000000000 20 4 0 10 -119011: 0100007F:DD5C 0100007F:59D7 01 00000000:00000000 02:000000FE 00000000 0 0 61232037 2 0000000000000000 20 4 22 10 -119112: 220E600A:BE20 F61BC768:01BB 01 00000000:00000000 00:00000000 00000000 33333 0 61342422 1 0000000000000000 21 4 26 10 -119213: 0100007F:DD5A 0100007F:59D7 01 00000000:00000000 02:0000019A 00000000 0 0 61232036 2 0000000000000000 20 4 0 10 -119314: 0100007F:E0C6 0100007F:59D7 01 00000000:00000000 00:00000000 00000000 33333 0 61342375 1 0000000000000000 20 4 0 10 -119415: 220E600A:BAB0 F61BC768:01BB 01 00000000:00000000 02:00000418 00000000 0 0 61278493 2 0000000000000000 20 4 30 10 -119516: 220E600A:59D8 760B600A:E96C 01 00000000:00000000 00:00000000 00000000 33333 0 61331984 3 0000000000000000 20 4 31 10 -1`,196},197Expectation: Expectation{198{199{Address: net.IPv4(10, 96, 14, 34), Port: 9229},200{Address: net.IPv4(127, 0, 0, 1), Port: 9229, BoundToLocalhost: true},201{Address: net.IPv4zero, Port: 23000},202{Address: net.IPv4(10, 96, 14, 34), Port: 27017},203},204},205},206}207208for _, test := range tests {209t.Run(test.Name, func(t *testing.T) {210var f int211obs := PollingServedPortsObserver{212RefreshInterval: 100 * time.Millisecond,213fileOpener: func(fn string) (io.ReadCloser, error) {214if f >= len(test.FileContents) {215return nil, os.ErrNotExist216}217218res := io.NopCloser(bytes.NewReader([]byte(test.FileContents[f])))219f++220return res, nil221},222}223224ctx, cancel := context.WithCancel(context.Background())225updates, errs := obs.Observe(ctx)226go func() {227time.Sleep(500 * time.Millisecond)228cancel()229}()230go func() {231for range errs {232}233}()234235var act Expectation236for up := range updates {237act = append(act, up)238}239240if diff := cmp.Diff(test.Expectation, act); diff != "" {241t.Errorf("unexpected result (-want +got):\n%s", diff)242}243})244}245}246247func TestReadNetTCPFile(t *testing.T) {248type Expectation struct {249Ports []ServedPort250Error error251}252tests := []struct {253Name string254Input string255ListeningOnly bool256Expectation Expectation257}{258{259Name: "valid tcp4 input",260Input: validTCPInput,261ListeningOnly: true,262Expectation: Expectation{263Ports: []ServedPort{264{Address: net.IPv4(127, 0, 0, 1), Port: 5900, BoundToLocalhost: true},265{Address: net.IPv4zero, Port: 6080},266{Address: net.IPv4zero, Port: 23000},267},268},269},270{271Name: "valid tcp6 input",272Input: validTCP6Input,273ListeningOnly: true,274Expectation: Expectation{275Ports: []ServedPort{276{Address: net.IPv6loopback, Port: 5900, BoundToLocalhost: true},277{Address: net.IPv6zero, Port: 22999},278{Address: net.IPv6zero, Port: 35900},279{Address: net.IPv6zero, Port: 36080},280},281},282},283{284Name: "invalid input",285Input: strings.ReplaceAll(validTCPInput, "0A", ""),286ListeningOnly: true,287Expectation: Expectation{},288},289}290291for _, test := range tests {292t.Run(test.Name, func(t *testing.T) {293var act Expectation294act.Ports, act.Error = readNetTCPFile(bytes.NewReader([]byte(test.Input)), test.ListeningOnly)295296if diff := cmp.Diff(test.Expectation, act); diff != "" {297t.Errorf("unexpected result (-want +got):\n%s", diff)298}299})300}301}302303304