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  }