diff options
| author | jEzEk <[email protected]> | 2018-10-26 03:45:55 +0200 |
|---|---|---|
| committer | jEzEk <[email protected]> | 2018-10-26 03:52:53 +0200 |
| commit | 788010f11d65572ca0cea2caf65ade6db4a274de (patch) | |
| tree | f8a599e858f2feacdeb5b487d8b90bc9bf5f5005 | |
| parent | 10df72a1f6ebc4703bef26e015c364ee155dc51f (diff) | |
tests double close, close with pending requests
(*Conn).Close panic recover in tests
| -rw-r--r-- | xgb_test.go | 62 |
1 files changed, 46 insertions, 16 deletions
diff --git a/xgb_test.go b/xgb_test.go index b10f4bf..6931c3d 100644 --- a/xgb_test.go +++ b/xgb_test.go @@ -217,6 +217,17 @@ func TestConnOnNonBlockingDummyXServer(t *testing.T) { return nil } } + checkClosed := func(c *Conn) error { + select { + case eoe, ok := <-c.eventChan: + if ok { + return fmt.Errorf("(*Conn).eventChan should be closed, but is not and returns %v", eoe) + } + case <-time.After(timeout): + return fmt.Errorf("(*Conn).eventChan should be closed, but is not and was blocking for %v", timeout) + } + return nil + } testCases := []struct { description string @@ -225,6 +236,14 @@ func TestConnOnNonBlockingDummyXServer(t *testing.T) { {"close", []func(*Conn) error{}, }, + {"double close", + []func(*Conn) error{ + func(c *Conn) error { + c.Close() + return nil + }, + }, + }, {"checked requests with reply", []func(*Conn) error{ checkedReply(false), @@ -261,23 +280,28 @@ func TestConnOnNonBlockingDummyXServer(t *testing.T) { waitEvent(false), }, }, + {"close with pending requests", + []func(*Conn) error{ + func(c *Conn) error { + c.conn.(*dNC).ReadLock() + defer c.conn.(*dNC).ReadUnlock() + c.NewRequest([]byte("reply"), c.NewCookie(false, true)) + c.Close() + return nil + }, + checkClosed, + }, + }, {"unexpected conn close", []func(*Conn) error{ func(c *Conn) error { c.conn.Close() if ev, err := c.WaitForEvent(); ev != nil || err != nil { - return fmt.Errorf("after conn close WaitForEvent() = (%v, %v), want (nil, nil)", ev, err) - } - select { - case eoe, ok := <-c.eventChan: - if ok { - return fmt.Errorf("(*Conn).eventChan should be closed by now, but is not and returns %v", eoe) - } - case <-time.After(timeout): - return fmt.Errorf("(*Conn).eventChan should be closed by now, but is not and was blocking for %v", timeout) + return fmt.Errorf("WaitForEvent() = (%v, %v), want (nil, nil)", ev, err) } return nil }, + checkClosed, }, }, } @@ -338,14 +362,20 @@ func TestConnOnNonBlockingDummyXServer(t *testing.T) { } } - c.Close() - select { - case eoe, ok := <-c.eventChan: - if ok { - t.Errorf("(*Conn).eventChan should be closed after (*Conn),Close(), but is not and returned %v", eoe) + recovered := false + func() { + defer func() { + if err := recover(); err != nil { + t.Errorf("(*Conn).Close() panic recover: %v", err) + recovered = true + } + }() + c.Close() + }() + if !recovered { + if err := checkClosed(c); err != nil { + t.Error(err) } - case <-time.After(timeout): - t.Errorf("(*Conn).eventChan should be closed after (*Conn),Close(), but is not and was blocking for %v", timeout) } rlm.checkTesting(t) |
