public void TestPOP3TransactionSafety()
        {
            Account account = SingletonProvider <TestSetup> .Instance.AddAccount(_domain, "*****@*****.**", "test");

            SmtpClientSimulator.StaticSend(account.Address, account.Address, "Test", "TestBody");
            Pop3ClientSimulator.AssertMessageCount(account.Address, "test", 1);

            var sim = new Pop3ClientSimulator();

            sim.ConnectAndLogon(account.Address, "test");

            // Now delete the message using an IMAP client.
            var imapSimulator = new ImapClientSimulator();

            Assert.IsTrue(imapSimulator.ConnectAndLogon(account.Address, "test"));
            Assert.IsTrue(imapSimulator.SelectFolder("INBOX"));
            Assert.IsTrue(imapSimulator.SetDeletedFlag(1));
            Assert.IsTrue(imapSimulator.Expunge());
            Assert.AreEqual(0, imapSimulator.GetMessageCount("Inbox"));

            SmtpClientSimulator.StaticSend(account.Address, account.Address, "Test", "TestBody");
            ImapClientSimulator.AssertMessageCount(account.Address, "test", "Inbox", 1);

            // This deletion should not have any effect, since the POP3 connection is referencing an old message.
            sim.DELE(1);
            sim.QUIT();

            Assert.AreEqual(1, imapSimulator.GetMessageCount("Inbox"));
        }
        public void TestDELEInvalid()
        {
            Account account = SingletonProvider <TestSetup> .Instance.AddAccount(_domain, "*****@*****.**", "test");

            for (int i = 1; i <= 10; i++)
            {
                SmtpClientSimulator.StaticSend(account.Address, account.Address, "Test", "TestBody" + i.ToString());
            }

            Pop3ClientSimulator.AssertMessageCount(account.Address, "test", 10);

            var sim = new Pop3ClientSimulator();

            sim.ConnectAndLogon(account.Address, "test");
            Assert.IsFalse(sim.DELE(0));
            Assert.IsFalse(sim.DELE(-1));
            Assert.IsFalse(sim.DELE(1000));
            Assert.IsTrue(sim.DELE(5));
        }
        public void TestUIDLWithDeleted()
        {
            Account account = SingletonProvider <TestSetup> .Instance.AddAccount(_domain, "*****@*****.**", "test");

            for (int i = 1; i <= 10; i++)
            {
                SmtpClientSimulator.StaticSend(account.Address, account.Address, "Test", "TestBody" + i.ToString());
            }

            Pop3ClientSimulator.AssertMessageCount(account.Address, "test", 10);

            var sim = new Pop3ClientSimulator();

            sim.ConnectAndLogon(account.Address, "test");
            sim.DELE(2);
            sim.DELE(4);
            string result = sim.UIDL();

            Assert.IsTrue(result.Contains("8 messages"));
            Assert.IsTrue(result.Contains("\r\n1"));
            Assert.IsTrue(result.Contains("\r\n3"));
            Assert.IsTrue(result.Contains("\r\n5"));
            Assert.IsTrue(result.Contains("\r\n."));
        }
        public void TestAttachmentEncoding()
        {
            string[] testFiles = GetTestFiles();

            SingletonProvider <TestSetup> .Instance.AddAccount(_domain, "*****@*****.**", "test");

            foreach (string testFile in testFiles)
            {
                Trace.WriteLine(testFile);

                string fileHash = GetFileHash(testFile);

                var mail = new MailMessage();
                mail.From = new MailAddress("*****@*****.**");
                mail.To.Add("*****@*****.**");
                mail.Subject = "Test";
                mail.Attachments.Add(new Attachment(testFile));

                SendMessage(mail);

                Pop3ClientSimulator.AssertMessageCount("*****@*****.**", "test", 1);

                var sim = new Pop3ClientSimulator();
                sim.ConnectAndLogon("*****@*****.**", "test");
                string fileContent = sim.RETR(1);
                sim.DELE(1);
                sim.QUIT();


                var message = new Message();

                try
                {
                    File.WriteAllText(message.Filename, fileContent);
                    message.RefreshContent();

                    message.Attachments[0].SaveAs(message.Filename);
                    string fileHashAfter = GetFileHash(message.Filename);

                    Assert.AreEqual(fileHash, fileHashAfter);
                }
                finally
                {
                    File.Delete(message.Filename);
                }
            }
        }