Changeset 602 in code for trunk/server_test.go


Ignore:
Timestamp:
Oct 5, 2021, 12:03:17 PM (4 years ago)
Author:
contact
Message:

test: add upstream

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/server_test.go

    r600 r602  
    99)
    1010
     11var testServerPrefix = &irc.Prefix{Name: "soju-test-server"}
     12
    1113const (
    1214        testUsername = "soju-test-user"
     
    1416)
    1517
    16 func ircPipe() (ircConn, ircConn) {
     18func createTestDownstream(t *testing.T, srv *Server) ircConn {
    1719        c1, c2 := net.Pipe()
    18         return newNetIRCConn(c1), newNetIRCConn(c2)
     20        go srv.handle(newNetIRCConn(c1))
     21        return newNetIRCConn(c2)
    1922}
    2023
     
    3134}
    3235
    33 func createTestUser(t *testing.T) *Server {
    34         db := createTempDB(t)
    35 
     36func createTestUser(t *testing.T, db Database) *User {
    3637        hashed, err := bcrypt.GenerateFromPassword([]byte(testPassword), bcrypt.DefaultCost)
    3738        if err != nil {
     
    4445        }
    4546
    46         return NewServer(db)
     47        return record
     48}
     49
     50type testUpstream struct {
     51        net.Listener
     52        Accept chan ircConn
     53}
     54
     55func createTestUpstream(t *testing.T, db Database, user *User) (*Network, *testUpstream) {
     56        ln, err := net.Listen("tcp", "localhost:0")
     57        if err != nil {
     58                t.Fatalf("failed to create TCP listener: %v", err)
     59        }
     60
     61        tu := &testUpstream{
     62                Listener: ln,
     63                Accept:   make(chan ircConn),
     64        }
     65
     66        go func() {
     67                defer close(tu.Accept)
     68
     69                for {
     70                        c, err := ln.Accept()
     71                        if isErrClosed(err) {
     72                                break
     73                        } else if err != nil {
     74                                t.Fatalf("failed accepting connection: %v", err)
     75                        }
     76                        tu.Accept <- newNetIRCConn(c)
     77                }
     78        }()
     79
     80        network := &Network{
     81                Name:    "testnet",
     82                Addr:    "irc+insecure://" + ln.Addr().String(),
     83                Nick:    user.Username,
     84                Enabled: true,
     85        }
     86        if err := db.StoreNetwork(user.ID, network); err != nil {
     87                t.Fatalf("failed to store test network: %v", err)
     88        }
     89
     90        return network, tu
    4791}
    4892
     
    58102}
    59103
    60 func authTestUser(t *testing.T, c ircConn) {
     104func registerDownstreamConn(t *testing.T, c ircConn, network *Network) {
    61105        c.WriteMessage(&irc.Message{
    62106                Command: "PASS",
     
    69113        c.WriteMessage(&irc.Message{
    70114                Command: "USER",
    71                 Params:  []string{testUsername, "0", "*", testUsername},
     115                Params:  []string{testUsername + "/" + network.Name, "0", "*", testUsername},
    72116        })
    73117
     
    75119}
    76120
     121func registerUpstreamConn(t *testing.T, c ircConn) {
     122        msg := expectMessage(t, c, "CAP")
     123        if msg.Params[0] != "LS" {
     124                t.Fatalf("invalid CAP LS: got: %v", msg)
     125        }
     126        msg = expectMessage(t, c, "NICK")
     127        nick := msg.Params[0]
     128        if nick != testUsername {
     129                t.Fatalf("invalid NICK: want %q, got: %v", testUsername, msg)
     130        }
     131        expectMessage(t, c, "USER")
     132
     133        c.WriteMessage(&irc.Message{
     134                Prefix:  testServerPrefix,
     135                Command: irc.RPL_WELCOME,
     136                Params:  []string{nick, "Welcome!"},
     137        })
     138        c.WriteMessage(&irc.Message{
     139                Prefix:  testServerPrefix,
     140                Command: irc.RPL_YOURHOST,
     141                Params:  []string{nick, "Your host is soju-test-server"},
     142        })
     143        c.WriteMessage(&irc.Message{
     144                Prefix:  testServerPrefix,
     145                Command: irc.RPL_CREATED,
     146                Params:  []string{nick, "Who cares when the server was created?"},
     147        })
     148        c.WriteMessage(&irc.Message{
     149                Prefix:  testServerPrefix,
     150                Command: irc.RPL_MYINFO,
     151                Params:  []string{nick, testServerPrefix.Name, "soju", "aiwroO", "OovaimnqpsrtklbeI"},
     152        })
     153        c.WriteMessage(&irc.Message{
     154                Prefix:  testServerPrefix,
     155                Command: irc.ERR_NOMOTD,
     156                Params:  []string{nick, "No MOTD"},
     157        })
     158}
     159
    77160func TestServer(t *testing.T) {
    78         srv := createTestUser(t)
     161        db := createTempDB(t)
     162        user := createTestUser(t, db)
     163        network, upstream := createTestUpstream(t, db, user)
     164        defer upstream.Close()
     165
     166        srv := NewServer(db)
    79167        if err := srv.Start(); err != nil {
    80168                t.Fatalf("failed to start server: %v", err)
     
    82170        defer srv.Shutdown()
    83171
    84         c, srvConn := ircPipe()
    85         defer c.Close()
    86         go srv.handle(srvConn)
     172        uc := <-upstream.Accept
     173        defer uc.Close()
     174        registerUpstreamConn(t, uc)
    87175
    88         authTestUser(t, c)
     176        dc := createTestDownstream(t, srv)
     177        defer dc.Close()
     178
     179        registerDownstreamConn(t, dc, network)
    89180}
Note: See TracChangeset for help on using the changeset viewer.