1
0
mirror of https://blitiri.com.ar/repos/chasquid synced 2025-12-17 14:37:02 +00:00

dovecot: Add tests for more error cases

This patch adds more tests for the dovecot library, in particular:
 - Protocol errors (invalid versions, etc.).
 - Invalid command (cli-specific test).
 - Connection breakups.
This commit is contained in:
Alberto Bertogli
2018-06-04 01:20:51 +01:00
parent 36692b52d3
commit cf81fbee74
6 changed files with 104 additions and 0 deletions

View File

@@ -0,0 +1,37 @@
# Break the handhake early.
client unix_listen .dovecot-client
c = ./dovecot-auth-cli .dovecot auth username password
client <- VERSION 1 1
client <~ CPID
# We are supposed to send the handshake here.
client close
c <- no: error receiving handshake: EOF
c wait 0
# Break before sending the final response.
client unix_listen .dovecot-client
c = ./dovecot-auth-cli .dovecot auth username password
client -> VERSION 1 1
client -> SPID 12345
client -> CUID 12345
client -> COOKIE lovelycookie
client -> MECH PLAIN
client -> MECH LOGIN
client -> DONE
client <- VERSION 1 1
client <~ CPID
client <- AUTH 1 PLAIN service=smtp secured no-penalty nologin resp=dXNlcm5hbWUAdXNlcm5hbWUAcGFzc3dvcmQ=
# We're supposed to send the OK/FAIL here.
client close
c <- no: error receiving response: EOF
c wait 0

View File

@@ -0,0 +1,32 @@
# Invalid version
userdb unix_listen .dovecot-userdb
c = ./dovecot-auth-cli .dovecot exists username
userdb -> VERSION 0
c <~ no: error receiving version
c wait 0
# No SPID (send "NOSPID" instead
userdb unix_listen .dovecot-userdb
c = ./dovecot-auth-cli .dovecot exists username
userdb -> VERSION 1 1
userdb -> NOSPID
c <~ no: error receiving SPID:
c wait 0
# Break before sending the final response.
userdb unix_listen .dovecot-userdb
c = ./dovecot-auth-cli .dovecot exists username
userdb -> VERSION 1 1
userdb -> SPID 12345
userdb <- VERSION 1 1
userdb <- USER 1 username service=smtp
userdb close
c <- no: error receiving response: EOF
c wait 0

View File

@@ -0,0 +1,15 @@
userdb unix_listen .dovecot-userdb
c = ./dovecot-auth-cli .dovecot exists username
userdb -> VERSION 1 1
userdb -> SPID 12345
userdb <- VERSION 1 1
userdb <- USER 1 username service=smtp
userdb -> OTHER
c <~ no: invalid response:
c wait 0

View File

@@ -0,0 +1,4 @@
c = ./dovecot-auth-cli .missingsocket something
c <- unknown subcommand
c wait 0

View File

@@ -117,3 +117,9 @@ func mustListen(t *testing.T, path string) *net.UnixListener {
return l return l
} }
func TestNotASocket(t *testing.T) {
if isUnixSocket("/doesnotexist") {
t.Errorf("isUnixSocket(/doesnotexist) returned true")
}
}

View File

@@ -42,6 +42,8 @@ class Process (object):
def wait(self): def wait(self):
return self.cmd.wait() return self.cmd.wait()
def close(self):
return self.cmd.terminate()
class Sock (object): class Sock (object):
"""A (generic) socket. """A (generic) socket.
@@ -77,6 +79,10 @@ class Sock (object):
self.has_conn.wait() self.has_conn.wait()
return self.connr.readline() return self.connr.readline()
def close(self):
self.connr.close()
self.connw.close()
self.sock.close()
class UnixSock (Sock): class UnixSock (Sock):
def __init__(self, addr): def __init__(self, addr):
@@ -239,6 +245,10 @@ class Interpreter (object):
self.runtime_error("return code did not match:\n" self.runtime_error("return code did not match:\n"
+ " expected %s, got %d" % (params, retcode)) + " expected %s, got %d" % (params, retcode))
# close Close the process.
elif op == "close":
self.procs[proc].close()
else: else:
self.syntax_error("unknown syntax") self.syntax_error("unknown syntax")