aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/imap/capability.rs1
-rw-r--r--tests/behavior.rs25
-rw-r--r--tests/common/fragments.rs18
3 files changed, 42 insertions, 2 deletions
diff --git a/src/imap/capability.rs b/src/imap/capability.rs
index f60c01f..7959832 100644
--- a/src/imap/capability.rs
+++ b/src/imap/capability.rs
@@ -30,6 +30,7 @@ impl Default for ServerCapability {
Capability::Enable,
Capability::Move,
Capability::LiteralPlus,
+ Capability::Idle,
capability_unselect(),
capability_condstore(),
//capability_qresync(),
diff --git a/tests/behavior.rs b/tests/behavior.rs
index 699f59d..2e3c610 100644
--- a/tests/behavior.rs
+++ b/tests/behavior.rs
@@ -11,6 +11,7 @@ fn main() {
rfc6851_imapext_move();
rfc7888_imapext_literal();
rfc4551_imapext_condstore();
+ rfc2177_imapext_idle();
println!("โœ… SUCCESS ๐ŸŒŸ๐Ÿš€๐Ÿฅณ๐Ÿ™๐Ÿฅน");
}
@@ -21,8 +22,6 @@ fn rfc3501_imap4rev1_base() {
capability(imap_socket, Extension::None).context("check server capabilities")?;
login(imap_socket, Account::Alice).context("login test")?;
create_mailbox(imap_socket, Mailbox::Archive).context("created mailbox archive")?;
- // UNSUBSCRIBE IS NOT IMPLEMENTED YET
- //unsubscribe_mailbox(imap_socket).context("unsubscribe from archive")?;
let select_res =
select(imap_socket, Mailbox::Inbox, SelectMod::None).context("select inbox")?;
assert!(select_res.contains("* 0 EXISTS"));
@@ -241,3 +240,25 @@ fn rfc4551_imapext_condstore() {
})
.expect("test fully run");
}
+
+
+fn rfc2177_imapext_idle() {
+ println!("๐Ÿงช rfc2177_imapext_idle");
+ common::aerogramme_provider_daemon_dev(|imap_socket, lmtp_socket| {
+ // Test setup
+ connect(imap_socket).context("server says hello")?;
+ capability(imap_socket, Extension::Idle).context("check server capabilities")?;
+ login(imap_socket, Account::Alice).context("login test")?;
+ select(imap_socket, Mailbox::Inbox, SelectMod::None).context("select inbox")?;
+
+ // Check that new messages from LMTP are correctly detected during idling
+ start_idle(imap_socket).context("can't start idling")?;
+ lmtp_handshake(lmtp_socket).context("handshake lmtp done")?;
+ lmtp_deliver_email(lmtp_socket, Email::Basic).context("mail delivered successfully")?;
+ let srv_msg = stop_idle(imap_socket).context("stop idling")?;
+ assert!(srv_msg.contains("* 1 EXISTS"));
+
+ Ok(())
+ })
+ .expect("test fully run");
+}
diff --git a/tests/common/fragments.rs b/tests/common/fragments.rs
index 29d5d10..7f7967a 100644
--- a/tests/common/fragments.rs
+++ b/tests/common/fragments.rs
@@ -36,6 +36,7 @@ pub enum Extension {
Move,
Condstore,
LiteralPlus,
+ Idle,
}
pub enum Enable {
@@ -114,6 +115,7 @@ pub fn capability(imap: &mut TcpStream, ext: Extension) -> Result<()> {
Extension::Move => Some("MOVE"),
Extension::Condstore => Some("CONDSTORE"),
Extension::LiteralPlus => Some("LITERAL+"),
+ Extension::Idle => Some("IDLE"),
};
let mut buffer: [u8; 6000] = [0; 6000];
@@ -496,6 +498,22 @@ pub fn enable(imap: &mut TcpStream, ask: Enable, done: Option<Enable>) -> Result
Ok(())
}
+pub fn start_idle(imap: &mut TcpStream) -> Result<()> {
+ let mut buffer: [u8; 1500] = [0; 1500];
+ imap.write(&b"98 IDLE\r\n"[..])?;
+ let read = read_lines(imap, &mut buffer, None)?;
+ assert_eq!(read[0], b'+');
+ Ok(())
+}
+
+pub fn stop_idle(imap: &mut TcpStream) -> Result<String> {
+ let mut buffer: [u8; 16536] = [0; 16536];
+ imap.write(&b"DONE\r\n"[..])?;
+ let read = read_lines(imap, &mut buffer, Some(&b"98 OK"[..]))?;
+ let srv_msg = std::str::from_utf8(read)?;
+ Ok(srv_msg.to_string())
+}
+
pub fn logout(imap: &mut TcpStream) -> Result<()> {
imap.write(&b"99 logout\r\n"[..])?;
let mut buffer: [u8; 1500] = [0; 1500];