forked from hswaw/hscloud
69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
|
package ident
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"errors"
|
||
|
"net"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
// TestE2E performs an end-to-end test of the ident client and server,
|
||
|
// exercising as much functionality as possible.
|
||
|
func TestE2E(t *testing.T) {
|
||
|
lis, err := net.Listen("tcp", "127.0.0.1:0")
|
||
|
if err != nil {
|
||
|
t.Fatalf("Listen: %v", err)
|
||
|
}
|
||
|
defer lis.Close()
|
||
|
|
||
|
isrv := NewServer()
|
||
|
isrv.HandleFunc(func(ctx context.Context, w ResponseWriter, r *Request) {
|
||
|
switch r.ServerPort {
|
||
|
case 1:
|
||
|
w.SendError(NoUser)
|
||
|
default:
|
||
|
w.SendIdent(&IdentResponse{
|
||
|
UserID: "q3k",
|
||
|
})
|
||
|
}
|
||
|
})
|
||
|
go isrv.Serve(lis)
|
||
|
target := lis.Addr().String()
|
||
|
|
||
|
ctx := context.Background()
|
||
|
|
||
|
// Full end-to-end test, from high-level client Query call, to server
|
||
|
// handler.
|
||
|
|
||
|
// This call should succeed.
|
||
|
resp, err := Query(ctx, target, 123, 234)
|
||
|
if err != nil {
|
||
|
t.Fatalf("Query: %v", err)
|
||
|
}
|
||
|
if want, got := "q3k", resp.UserID; want != got {
|
||
|
t.Errorf("Resp.UserID: wanted %q, got %q", want, got)
|
||
|
}
|
||
|
|
||
|
// This call should error out and return an error that can be converted
|
||
|
// back into ErrorResponse.
|
||
|
resp, err = Query(ctx, target, 123, 1)
|
||
|
if err == nil {
|
||
|
t.Fatalf("Query returned nil error")
|
||
|
}
|
||
|
identErr := &IdentError{}
|
||
|
if errors.As(err, &identErr) {
|
||
|
if want, got := NoUser, identErr.Inner; want != got {
|
||
|
t.Errorf("Query error is %q, wanted %q", want, got)
|
||
|
}
|
||
|
} else {
|
||
|
t.Errorf("Query error did not match AnyError")
|
||
|
}
|
||
|
// Test matches against specific errors.
|
||
|
if errors.Is(err, &IdentError{UnknownError}) {
|
||
|
t.Errorf("Query error should not have matched UnknownError")
|
||
|
}
|
||
|
if !errors.Is(err, &IdentError{NoUser}) {
|
||
|
t.Errorf("Query error should have matcher NoUser")
|
||
|
}
|
||
|
}
|