Tests: POP3 pipelining tests.
diff --git a/mail_pop3.t b/mail_pop3.t
index fb6fc47..db6d3ad 100644
--- a/mail_pop3.t
+++ b/mail_pop3.t
@@ -12,6 +12,7 @@
 use Test::More;
 
 use MIME::Base64;
+use Socket qw/ CRLF /;
 
 BEGIN { use FindBin; chdir($FindBin::Bin); }
 
@@ -89,7 +90,7 @@
 EOF
 
 $t->run_daemon(\&Test::Nginx::POP3::pop3_test_daemon);
-$t->run()->plan(20);
+$t->run()->plan(28);
 
 $t->waitforsocket('127.0.0.1:' . port(8111));
 
@@ -193,6 +194,51 @@
 $s->send('AUTH EXTERNAL ' . encode_base64('test@example.com', ''));
 $s->ok('auth external with username');
 
+# pipelining
+
+$s = Test::Nginx::POP3->new();
+$s->read();
+
+$s->send('INVALID COMMAND WITH ARGUMENTS' . CRLF
+	. 'NOOP');
+$s->check(qr/^-ERR/, 'pipelined invalid command');
+
+TODO: {
+local $TODO = 'not yet' unless $t->has_version('1.21.0');
+
+$s->ok('pipelined noop after invalid command');
+
+}
+
+$s->send('USER test@example.com' . CRLF
+	. 'PASS secret' . CRLF
+	. 'QUIT');
+$s->ok('pipelined user');
+
+TODO: {
+local $TODO = 'not yet' unless $t->has_version('1.21.0');
+
+$s->ok('pipelined pass');
+$s->ok('pipelined quit');
+
+}
+
+$s = Test::Nginx::POP3->new();
+$s->read();
+
+$s->send('AUTH LOGIN' . CRLF
+	. encode_base64('test@example.com', '') . CRLF
+	. encode_base64('secret', ''));
+$s->check(qr/\+ VXNlcm5hbWU6/, 'pipelined auth username challenge');
+
+TODO: {
+local $TODO = 'not yet' unless $t->has_version('1.21.0');
+
+$s->check(qr/\+ UGFzc3dvcmQ6/, 'pipelined auth password challenge');
+$s->ok('pipelined auth');
+
+}
+
 ###############################################################################
 
 sub get_auth_caps {