go.nanomsg.org/mangos/v3@v3.4.3-0.20240217232803-46464076f1f5/internal/test/options.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  	"reflect"
    19  	"testing"
    20  	"time"
    21  
    22  	"go.nanomsg.org/mangos/v3"
    23  )
    24  
    25  // VerifyInvalidOption verifies that invalid options fail.
    26  func VerifyInvalidOption(t *testing.T, f func() (mangos.Socket, error)) {
    27  	s, err := f()
    28  	MustSucceed(t, err)
    29  	_, err = s.GetOption("NoSuchOption")
    30  	MustBeError(t, err, mangos.ErrBadOption)
    31  
    32  	MustBeError(t, s.SetOption("NoSuchOption", 0), mangos.ErrBadOption)
    33  	MustSucceed(t, s.Close())
    34  }
    35  
    36  // VerifyOptionDuration validates time.Duration options
    37  func VerifyOptionDuration(t *testing.T, f func() (mangos.Socket, error), option string) {
    38  	s, err := f()
    39  	MustSucceed(t, err)
    40  	val, err := s.GetOption(option)
    41  	MustSucceed(t, err)
    42  	MustBeTrue(t, reflect.TypeOf(val) == reflect.TypeOf(time.Duration(0)))
    43  
    44  	MustSucceed(t, s.SetOption(option, time.Second))
    45  	val, err = s.GetOption(option)
    46  	MustSucceed(t, err)
    47  	MustBeTrue(t, val.(time.Duration) == time.Second)
    48  
    49  	MustBeError(t, s.SetOption(option, time.Now()), mangos.ErrBadValue)
    50  	MustBeError(t, s.SetOption(option, "junk"), mangos.ErrBadValue)
    51  	MustSucceed(t, s.Close())
    52  }
    53  
    54  // VerifyOptionInt validates integer options.
    55  func VerifyOptionInt(t *testing.T, f func() (mangos.Socket, error), option string) {
    56  	s, err := f()
    57  	MustSucceed(t, err)
    58  	val, err := s.GetOption(option)
    59  	MustSucceed(t, err)
    60  	MustBeTrue(t, reflect.TypeOf(val) == reflect.TypeOf(1))
    61  
    62  	MustSucceed(t, s.SetOption(option, 2))
    63  	val, err = s.GetOption(option)
    64  	MustSucceed(t, err)
    65  	MustBeTrue(t, val.(int) == 2)
    66  
    67  	MustBeError(t, s.SetOption(option, time.Now()), mangos.ErrBadValue)
    68  	MustBeError(t, s.SetOption(option, "junk"), mangos.ErrBadValue)
    69  	MustSucceed(t, s.Close())
    70  }
    71  
    72  // VerifyOptionQLen validates queue length options.
    73  func VerifyOptionQLen(t *testing.T, f func() (mangos.Socket, error), option string) {
    74  	s, err := f()
    75  	MustSucceed(t, err)
    76  	val, err := s.GetOption(option)
    77  	MustSucceed(t, err)
    78  	MustBeTrue(t, reflect.TypeOf(val) == reflect.TypeOf(1))
    79  
    80  	MustSucceed(t, s.SetOption(option, 2))
    81  	val, err = s.GetOption(option)
    82  	MustSucceed(t, err)
    83  	MustBeTrue(t, val.(int) == 2)
    84  
    85  	// Queue lengths are not permitted to be negative.
    86  	MustBeError(t, s.SetOption(option, -1), mangos.ErrBadValue)
    87  
    88  	MustBeError(t, s.SetOption(option, time.Now()), mangos.ErrBadValue)
    89  	MustBeError(t, s.SetOption(option, "junk"), mangos.ErrBadValue)
    90  	MustSucceed(t, s.Close())
    91  }
    92  
    93  // VerifyOptionBool validates bool options.
    94  func VerifyOptionBool(t *testing.T, f func() (mangos.Socket, error), option string) {
    95  	s, err := f()
    96  	MustSucceed(t, err)
    97  	val, err := s.GetOption(option)
    98  	MustSucceed(t, err)
    99  	MustBeTrue(t, reflect.TypeOf(val) == reflect.TypeOf(true))
   100  
   101  	MustSucceed(t, s.SetOption(option, true))
   102  	val, err = s.GetOption(option)
   103  	MustSucceed(t, err)
   104  	MustBeTrue(t, val.(bool))
   105  
   106  	MustSucceed(t, s.SetOption(option, false))
   107  	val, err = s.GetOption(option)
   108  	MustSucceed(t, err)
   109  	MustBeFalse(t, val.(bool))
   110  
   111  	MustBeError(t, s.SetOption(option, time.Now()), mangos.ErrBadValue)
   112  	MustBeError(t, s.SetOption(option, "junk"), mangos.ErrBadValue)
   113  	MustSucceed(t, s.Close())
   114  }
   115  
   116  // VerifyOptionTTL validates OptionTTL.
   117  func VerifyOptionTTL(t *testing.T, f func() (mangos.Socket, error)) {
   118  	VerifyOptionInt(t, f, mangos.OptionTTL)
   119  	SetTTLZero(t, f)
   120  	SetTTLNegative(t, f)
   121  	SetTTLTooBig(t, f)
   122  	SetTTL(t, f)
   123  }
   124  
   125  // VerifyOptionMaxRecvSize validates OptionMaxRecvSize.
   126  func VerifyOptionMaxRecvSize(t *testing.T, f func() (mangos.Socket, error)) {
   127  	VerifyOptionInt(t, f, mangos.OptionMaxRecvSize)
   128  	// Max Receive size must not be negative.
   129  	s := GetSocket(t, f)
   130  	MustBeError(t, s.SetOption(mangos.OptionMaxRecvSize, -1), mangos.ErrBadValue)
   131  	// Can set it to zero.
   132  	MustSucceed(t, s.SetOption(mangos.OptionMaxRecvSize, 0))
   133  	// Can set it to some other values
   134  	MustSucceed(t, s.SetOption(mangos.OptionMaxRecvSize, 1024))
   135  }