github.com/gdamore/mangos@v1.4.0/test/maxrx_test.go (about) 1 // Copyright 2018 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 "bytes" 19 "testing" 20 "time" 21 22 "nanomsg.org/go-mangos" 23 "nanomsg.org/go-mangos/protocol/rep" 24 "nanomsg.org/go-mangos/protocol/req" 25 "nanomsg.org/go-mangos/transport/tcp" 26 "nanomsg.org/go-mangos/transport/ws" 27 ) 28 29 func TestMaxRxSizeInvalidNegative(t *testing.T) { 30 srep, err := rep.NewSocket() 31 if err != nil { 32 t.Errorf("Failed to make REP: %v", err) 33 return 34 } 35 defer srep.Close() 36 37 err = srep.SetOption(mangos.OptionMaxRecvSize, -1) 38 switch err { 39 case mangos.ErrBadValue: // expected result 40 case nil: 41 t.Errorf("Negative test fail, permitted negative max recv size") 42 default: 43 t.Errorf("Negative test fail (-1), wrong error %v", err) 44 } 45 } 46 47 func TestMaxRxSizeInvalidNotInt(t *testing.T) { 48 srep, err := rep.NewSocket() 49 if err != nil { 50 t.Errorf("Failed to make REP: %v", err) 51 return 52 } 53 defer srep.Close() 54 55 err = srep.SetOption(mangos.OptionMaxRecvSize, "garbage") 56 switch err { 57 case mangos.ErrBadValue: // expected result 58 case nil: 59 t.Errorf("Negative test fail, permitted non-int value") 60 default: 61 t.Errorf("Negative test fail (garbage), wrong error %v", err) 62 } 63 } 64 65 func TestMaxRxSizeSet(t *testing.T) { 66 srep, err := rep.NewSocket() 67 if err != nil { 68 t.Errorf("Failed to make REP: %v", err) 69 return 70 } 71 defer srep.Close() 72 73 err = srep.SetOption(mangos.OptionMaxRecvSize, 100) 74 if err != nil { 75 t.Errorf("Failed SetOption: %v", err) 76 return 77 } 78 79 v, err := srep.GetOption(mangos.OptionMaxRecvSize) 80 if err != nil { 81 t.Errorf("Failed GetOption: %v", err) 82 return 83 } 84 if val, ok := v.(int); !ok { 85 t.Errorf("Returned value not type int") 86 } else if val != 100 { 87 t.Errorf("Returned value %d not %d", val, 100) 88 } 89 } 90 91 func TestMaxRxSizeDefault(t *testing.T) { 92 srep, err := rep.NewSocket() 93 if err != nil { 94 t.Errorf("Failed to make REP: %v", err) 95 return 96 } 97 defer srep.Close() 98 99 v, err := srep.GetOption(mangos.OptionMaxRecvSize) 100 if err != nil { 101 t.Errorf("Failed GetOption: %v", err) 102 return 103 } 104 if val, ok := v.(int); !ok { 105 t.Errorf("Returned value not type int") 106 } else if val != 1024*1024 { 107 t.Errorf("Returned value %d not %d", val, 1024*1024) 108 } 109 } 110 111 func testMaxRx(t *testing.T, addr string, tran mangos.Transport) { 112 maxrx := 100 113 114 rp, err := rep.NewSocket() 115 if err != nil { 116 t.Errorf("Failed to make REP: %v", err) 117 return 118 } 119 defer rp.Close() 120 rp.AddTransport(tran) 121 122 // Now try setting the option 123 err = rp.SetOption(mangos.OptionMaxRecvSize, maxrx) 124 if err != nil { 125 t.Errorf("Failed set MaxRecvSize: %v", err) 126 return 127 } 128 // At this point, we can issue requests on rq, and read them from rp. 129 if err = rp.SetOption(mangos.OptionRecvDeadline, time.Millisecond*20); err != nil { 130 t.Errorf("Failed set recv deadline") 131 return 132 } 133 if err = rp.Listen(addr); err != nil { 134 t.Errorf("Failed listen: %v", err) 135 return 136 } 137 138 rq, err := req.NewSocket() 139 if err != nil { 140 t.Errorf("Failed to make REQ: %v", err) 141 return 142 } 143 defer rq.Close() 144 rq.AddTransport(tran) 145 146 if err = rq.Dial(addr); err != nil { 147 t.Errorf("Failed dial: %v", err) 148 return 149 } 150 151 time.Sleep(time.Millisecond * 10) 152 153 msg1 := make([]byte, maxrx+1) 154 msg2 := make([]byte, maxrx+1) 155 for i := 0; i < len(msg1); i++ { 156 msg1[i] = 'A' + byte(i%26) 157 msg2[i] = 'A' + byte(i%26) 158 } 159 160 // NB: maxrx *includes* the header. 161 if err = rq.Send(msg1[:maxrx-8]); err != nil { 162 t.Errorf("Failed first send: %v", err) 163 return 164 } 165 v, err := rp.Recv() 166 if err != nil { 167 t.Errorf("Failed first recv: %v", err) 168 return 169 } else if !bytes.Equal(v, msg2[:maxrx-8]) { 170 t.Errorf("Got wrong message: %v", v) 171 return 172 } else { 173 t.Logf("Got good message") 174 } 175 176 if err = rq.Send(msg1); err != nil { 177 t.Errorf("Failed send drop: %v", err) 178 return 179 } 180 181 v, err = rp.Recv() 182 switch err { 183 case mangos.ErrRecvTimeout: // expected 184 t.Logf("MaxRx honored") 185 case nil: 186 t.Errorf("Message not dropped: %v", v) 187 default: 188 t.Errorf("Got unexpected error: %v", err) 189 } 190 } 191 192 func TestMaxRxTCP(t *testing.T) { 193 testMaxRx(t, AddrTestTCP, tcp.NewTransport()) 194 } 195 196 func TestMaxRxWS(t *testing.T) { 197 testMaxRx(t, AddrTestWS, ws.NewTransport()) 198 }