github.com/minio/minio@v0.0.0-20240328213742-3f72439b8a27/internal/http/check_port_test.go (about) 1 // Copyright (c) 2015-2023 MinIO, Inc. 2 // 3 // This file is part of MinIO Object Storage stack 4 // 5 // This program is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Affero General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // This program is distributed in the hope that it will be useful 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Affero General Public License for more details. 14 // 15 // You should have received a copy of the GNU Affero General Public License 16 // along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 package http 19 20 import ( 21 "fmt" 22 "net" 23 "runtime" 24 "strconv" 25 "testing" 26 ) 27 28 // Tests for port availability logic written for server startup sequence. 29 func TestCheckPortAvailability(t *testing.T) { 30 if runtime.GOOS != "linux" { 31 t.Skip() 32 } 33 34 l, err := net.Listen("tcp", "localhost:0") // ask kernel for a free port. 35 if err != nil { 36 t.Fatal(err) 37 } 38 defer l.Close() 39 40 port := l.Addr().(*net.TCPAddr).Port 41 42 testCases := []struct { 43 host string 44 port int 45 expectedErr error 46 }{ 47 {"", port, fmt.Errorf("listen tcp :%v: bind: address already in use", port)}, 48 {"127.0.0.1", port, fmt.Errorf("listen tcp 127.0.0.1:%v: bind: address already in use", port)}, 49 } 50 51 for _, testCase := range testCases { 52 err := CheckPortAvailability(testCase.host, strconv.Itoa(testCase.port), TCPOptions{}) 53 switch { 54 case testCase.expectedErr == nil: 55 if err != nil { 56 t.Fatalf("error: expected = <nil>, got = %v", err) 57 } 58 case err == nil: 59 t.Fatalf("error: expected = %v, got = <nil>", testCase.expectedErr) 60 case testCase.expectedErr.Error() != err.Error(): 61 t.Fatalf("error: expected = %v, got = %v", testCase.expectedErr, err) 62 } 63 } 64 }