go.nanomsg.org/mangos/v3@v3.4.3-0.20240217232803-46464076f1f5/internal/test/closed.go (about) 1 // Copyright 2019 The Mangos Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use 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 test 16 17 import ( 18 "sync" 19 "testing" 20 "time" 21 22 "go.nanomsg.org/mangos/v3" 23 "go.nanomsg.org/mangos/v3/protocol" 24 ) 25 26 // VerifyClosedSend verifies that Send on the socket created returns protocol.ErrClosed if it is closed. 27 func VerifyClosedSend(t *testing.T, f func() (mangos.Socket, error)) { 28 s, err := f() 29 MustSucceed(t, err) 30 MustSucceed(t, s.Close()) 31 err = s.Send([]byte{}) 32 MustFail(t, err) 33 MustBeTrue(t, err == protocol.ErrClosed) 34 } 35 36 // VerifyClosedRecv verifies that Recv on the socket created returns protocol.ErrClosed if it is closed. 37 func VerifyClosedRecv(t *testing.T, f func() (mangos.Socket, error)) { 38 s, err := f() 39 MustSucceed(t, err) 40 MustSucceed(t, s.Close()) 41 _, err = s.Recv() 42 MustFail(t, err) 43 MustBeTrue(t, err == protocol.ErrClosed) 44 } 45 46 // VerifyClosedClose verifies that Close on an already closed socket returns protocol.ErrClosed. 47 func VerifyClosedClose(t *testing.T, f func() (mangos.Socket, error)) { 48 s, err := f() 49 MustSucceed(t, err) 50 MustSucceed(t, s.Close()) 51 err = s.Close() 52 MustFail(t, err) 53 MustBeTrue(t, err == protocol.ErrClosed) 54 } 55 56 // VerifyClosedListen verifies that Listen returns protocol.ErrClosed on a closed socket. 57 func VerifyClosedListen(t *testing.T, f func() (mangos.Socket, error)) { 58 s := GetSocket(t, f) 59 AddMockTransport() 60 MustClose(t, s) 61 MustBeError(t, s.Listen(AddrMock()), protocol.ErrClosed) 62 } 63 64 // VerifyClosedDial verifies that Dial returns protocol.ErrClosed on a closed socket. 65 func VerifyClosedDial(t *testing.T, f func() (mangos.Socket, error)) { 66 s := GetSocket(t, f) 67 AddMockTransport() 68 MustClose(t, s) 69 err := s.DialOptions(AddrMock(), map[string]interface{}{ 70 mangos.OptionDialAsynch: true, 71 }) 72 MustBeError(t, err, protocol.ErrClosed) 73 } 74 75 func VerifyClosedAddPipe(t *testing.T, f func() (mangos.Socket, error)) { 76 AddMockTransport() 77 s := GetSocket(t, f) 78 peer := s.Info().Peer 79 d, mc := GetMockDialer(t, s) 80 var wg sync.WaitGroup 81 wg.Add(1) 82 pass := false 83 go func() { 84 defer wg.Done() 85 // The pipe is connected, but then immediately detached. 86 MustSucceed(t, d.Dial()) 87 pass = true 88 }() 89 90 time.Sleep(time.Millisecond * 10) 91 mc.DeferClose(true) 92 MustSucceed(t, s.Close()) 93 time.Sleep(time.Millisecond * 20) 94 mp := mc.NewPipe(peer) 95 MustSucceed(t, mc.AddPipe(mp)) 96 time.Sleep(time.Millisecond * 10) 97 mc.DeferClose(false) 98 wg.Wait() 99 MustBeTrue(t, pass) 100 } 101 102 func VerifyClosedContext(t *testing.T, f func() (mangos.Socket, error)) { 103 s := GetSocket(t, f) 104 c, e := s.OpenContext() 105 MustSucceed(t, e) 106 MustNotBeNil(t, c) 107 MustSucceed(t, c.Close()) 108 MustBeError(t, c.Close(), mangos.ErrClosed) 109 110 c, e = s.OpenContext() 111 MustSucceed(t, e) 112 MustNotBeNil(t, c) 113 114 MustSucceed(t, s.Close()) 115 MustBeError(t, c.Close(), mangos.ErrClosed) 116 117 _, e = s.OpenContext() 118 MustBeError(t, e, mangos.ErrClosed) 119 }