blob: 7294171758b32bce5a57888716adf46d4dfa4874 [file] [log] [blame] [edit]
package session
import (
"testing"
"github.com/mafredri/cdp/internal/errors"
"github.com/mafredri/cdp/protocol/target"
"github.com/mafredri/cdp/rpcc"
)
type testEventClient struct {
w chan struct{}
done chan struct{}
}
func (c *testEventClient) next() { c.done = make(chan struct{}); close(c.w) }
func (c *testEventClient) markReady() { close(c.done) }
func (c *testEventClient) Ready() <-chan struct{} {
<-c.w
c.w = make(chan struct{})
return c.done
}
func (c *testEventClient) Close() error { return nil }
func (c *testEventClient) RecvMsg(m interface{}) error { panic("not implemented") }
func newTestEventClient() *testEventClient {
return &testEventClient{w: make(chan struct{})}
}
var _ rpcc.Stream = (*testEventClient)(nil)
type testDetacher struct {
*testEventClient
err error
}
func (ev *testDetacher) Recv() (*target.DetachedFromTargetReply, error) {
return nil, ev.err
}
type testMessenger struct {
*testEventClient
err error
}
func (ev *testMessenger) Recv() (*target.ReceivedMessageFromTargetReply, error) {
return nil, ev.err
}
func TestManager_ErrorsAreSentOnErrChan(t *testing.T) {
detached := &testDetacher{testEventClient: newTestEventClient()}
message := &testMessenger{testEventClient: newTestEventClient()}
ev := &sessionEvents{
detached: detached,
message: message,
}
m := Manager{cancel: func() {}, errC: make(chan error, 1)}
go m.watch(ev, nil, make(chan error, 1), m.errC)
message.next()
detached.next()
detached.err = errors.New("detach nope")
detached.markReady()
err := <-m.Err()
if err := errors.Cause(err); err != detached.err {
t.Errorf("got error: %v; want: %v", err, detached.err)
}
detached.next()
message.next()
message.err = errors.New("message nope")
message.markReady()
err = <-m.Err()
if err := errors.Cause(err); err != message.err {
t.Errorf("got error: %v; want: %v", err, message.err)
}
message.next()
// Close the watcher goroutine.
detached.err = rpcc.ErrConnClosing
detached.markReady()
}