github.com/SagerNet/gvisor@v0.0.0-20210707092255-7731c139d75c/test/iptables/iptables.go (about) 1 // Copyright 2019 The gVisor Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // Package iptables contains a set of iptables tests implemented as TestCases 16 package iptables 17 18 import ( 19 "context" 20 "fmt" 21 "net" 22 "time" 23 ) 24 25 // IPExchangePort is the port the container listens on to receive the IP 26 // address of the local process. 27 const IPExchangePort = 2349 28 29 // TerminalStatement is the last statement in the test runner. 30 const TerminalStatement = "Finished!" 31 32 // TestTimeout is the timeout used for all tests. 33 const TestTimeout = 10 * time.Second 34 35 // NegativeTimeout is the time tests should wait to establish the negative 36 // case, i.e. that connections are not made. 37 const NegativeTimeout = 2 * time.Second 38 39 // A TestCase contains one action to run in the container and one to run 40 // locally. The actions run concurrently and each must succeed for the test 41 // pass. 42 type TestCase interface { 43 // Name returns the name of the test. 44 Name() string 45 46 // ContainerAction runs inside the container. It receives the IP of the 47 // local process. 48 ContainerAction(ctx context.Context, ip net.IP, ipv6 bool) error 49 50 // LocalAction runs locally. It receives the IP of the container. 51 LocalAction(ctx context.Context, ip net.IP, ipv6 bool) error 52 53 // ContainerSufficient indicates whether ContainerAction's return value 54 // alone indicates whether the test succeeded. 55 ContainerSufficient() bool 56 57 // LocalSufficient indicates whether LocalAction's return value alone 58 // indicates whether the test succeeded. 59 LocalSufficient() bool 60 } 61 62 // baseCase provides defaults for ContainerSufficient and LocalSufficient when 63 // both actions are required to finish. 64 type baseCase struct{} 65 66 // ContainerSufficient implements TestCase.ContainerSufficient. 67 func (*baseCase) ContainerSufficient() bool { 68 return false 69 } 70 71 // LocalSufficient implements TestCase.LocalSufficient. 72 func (*baseCase) LocalSufficient() bool { 73 return false 74 } 75 76 // localCase provides defaults for ContainerSufficient and LocalSufficient when 77 // only the local action is required to finish. 78 type localCase struct{} 79 80 // ContainerSufficient implements TestCase.ContainerSufficient. 81 func (*localCase) ContainerSufficient() bool { 82 return false 83 } 84 85 // LocalSufficient implements TestCase.LocalSufficient. 86 func (*localCase) LocalSufficient() bool { 87 return true 88 } 89 90 // containerCase provides defaults for ContainerSufficient and LocalSufficient 91 // when only the container action is required to finish. 92 type containerCase struct{} 93 94 // ContainerSufficient implements TestCase.ContainerSufficient. 95 func (*containerCase) ContainerSufficient() bool { 96 return true 97 } 98 99 // LocalSufficient implements TestCase.LocalSufficient. 100 func (*containerCase) LocalSufficient() bool { 101 return false 102 } 103 104 // Tests maps test names to TestCase. 105 // 106 // New TestCases are added by calling RegisterTestCase in an init function. 107 var Tests = map[string]TestCase{} 108 109 // RegisterTestCase registers tc so it can be run. 110 func RegisterTestCase(tc TestCase) { 111 if _, ok := Tests[tc.Name()]; ok { 112 panic(fmt.Sprintf("TestCase %s already registered.", tc.Name())) 113 } 114 Tests[tc.Name()] = tc 115 }