SMTPProcessorTest.cs
上传用户:wdhx888
上传日期:2017-06-08
资源大小:112k
文件大小:6k
源码类别:

WEB邮件程序

开发平台:

C#

  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. using System.Threading;
  6. using log4net;
  7. using log4net.Config;
  8. using NUnit.Framework;
  9. using EricDaugherty.CSES.Net;
  10. namespace EricDaugherty.CSES.SmtpServer
  11. {
  12. [TestFixture]
  13. /// <summary>Tests the SMTPProcessor class.</summary>
  14. public class SMTPProcessorTest
  15. {
  16. #region Variables
  17. private static readonly IPEndPoint endPoint = new IPEndPoint( IPAddress.Loopback, 9900 );
  18. private TcpListener listener;
  19. private MemoryMessageSpool messageSpool;
  20. #endregion
  21. #region Constructor
  22. public SMTPProcessorTest()
  23. {
  24. LogManager.ResetConfiguration();
  25. BasicConfigurator.Configure();
  26. messageSpool = new MemoryMessageSpool();
  27. }
  28. #endregion
  29. #region SetUp/TearDown
  30. [SetUp]
  31. public void Setup()
  32. {
  33. messageSpool.ClearSpool();
  34. Thread listener = new Thread( new ThreadStart( Listener ) );
  35. listener.IsBackground = true;
  36. listener.Start();
  37. // Block for a second to make sure the socket gets started.
  38. Thread.Sleep( 1000 );
  39. }
  40. private void Listener()
  41. {
  42. try
  43. {
  44. SMTPProcessor processor = new SMTPProcessor( "testdomain.com", messageSpool );
  45. listener = new TcpListener( endPoint );
  46. listener.Start();
  47. System.Console.WriteLine( "Socket listener started..." );
  48. Socket clientSocket = listener.AcceptSocket();
  49. processor.ProcessConnection( clientSocket );
  50. }
  51. catch( Exception exception )
  52. {
  53. System.Console.WriteLine( "Exception in Listener: " + exception );
  54. System.Console.WriteLine( exception.StackTrace );
  55. }
  56. }
  57. [TearDown]
  58. public void Teardown()
  59. {
  60. listener.Stop();
  61. }
  62. #endregion
  63. [Test]
  64. public void BasicConnectionTest()
  65. {
  66. Socket socket = Connect();
  67. Disconnect( socket );
  68. }
  69. [Test]
  70. public void MailFromAddressParsingTest()
  71. {
  72. Socket socket = Connect();
  73. CheckResponse( socket, "mail from:username@domain.com", "451" );
  74. CheckResponse( socket, "mail from:<user@name@domain.com>", "451" );
  75. CheckResponse( socket, "mail from:<user name@domain123.com>", "250" );
  76. Disconnect( socket );
  77. }
  78. [Test]
  79. public void RcptToAddressParsingTest()
  80. {
  81. Socket socket = Connect();
  82. CheckResponse( socket, "mail from:<user name@domain123.com>", "250" );
  83. CheckResponse( socket, "rcpt to:username@domain.com", "451" );
  84. CheckResponse( socket, "rcpt to:<user@name@domain.com>", "451" );
  85. CheckResponse( socket, "rcpt to:<user name@domain123.com>", "550" );
  86. CheckResponse( socket, "rcpt to:<username@domain.com>", "550" );
  87. CheckResponse( socket, "rcpt to:<username@testdomain.com>", "250" );
  88. CheckResponse( socket, "rcpt to:<user_100@testdomain.com>", "250" );
  89. Disconnect( socket );
  90. }
  91. [Test]
  92. public void DataTest()
  93. {
  94. Socket socket = Connect();
  95. CheckResponse( socket, "mail from:<user name@domain123.com>", "250" );
  96. CheckResponse( socket, "rcpt to:<username@testdomain.com>", "250" );
  97. CheckResponse( socket, "data", "354" );
  98. WriteLine( socket, "Date: Tue, 4 Nov 2003 10:13:27 -0600 (CST)" );
  99. WriteLine( socket, "Subject: Test" );
  100. WriteLine( socket, "" );
  101. WriteLine( socket, "Message Body." );
  102. CheckResponse( socket, ".", "250" );
  103. Disconnect( socket );
  104. SMTPMessage message = messageSpool.NextMessage();
  105. System.Console.WriteLine( "Message Recieved: " );
  106. System.Console.Write( message.Data );
  107. }
  108. #region Helper Methods
  109. private Socket Connect()
  110. {
  111. System.Console.WriteLine( "Connecting..." );
  112. Socket socket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
  113. socket.Connect( endPoint ); 
  114. // Read Welcome Message
  115. string line = ReadLine( socket );
  116. Assertion.Assert( "Welcome Message not recieved.", line.StartsWith( "220" ) );
  117. // Helo
  118. WriteLine( socket, "helo nunittestdomain.com" );
  119. line = ReadLine( socket );
  120. Assertion.Assert( "Helo response incorrect.", line.Equals( "250 testdomain.com" ) );
  121. return socket;
  122. }
  123. private void Disconnect( Socket socket )
  124. {
  125. // Quit
  126. WriteLine( socket, "quit" );
  127. string line = ReadLine( socket );
  128. Assertion.Assert( "Quit ack incorrect.", line.StartsWith( "221" ) );
  129. socket.Close();
  130. }
  131. private void CheckResponse( Socket socket, string command, string responseCode )
  132. {
  133. String line = WriteAndRead( socket, command );
  134. Assertion.Assert( command + " did not result in the correct response code: " + responseCode, line.StartsWith( responseCode ) );
  135. }
  136. /// <summary>Helper method to combine a write and a read.</summary>
  137. public string WriteAndRead( Socket socket, string data )
  138. {
  139. WriteLine( socket, data );
  140. return ReadLine( socket );
  141. }
  142. /// <summary>
  143. /// Writes the string to the socket as an entire line.  This
  144. /// method will append the end of line characters, so the data
  145. /// parameter should not contain them.
  146. /// </summary>
  147. /// <param name="socket">The socket to write to.</param>
  148. /// <param name="data>The data to write the the client.</param>
  149. public void WriteLine( Socket socket, string data )
  150. {
  151. System.Console.WriteLine( "Wrote: " + data );
  152. socket.Send( Encoding.ASCII.GetBytes( data + "rn" ) );
  153. }
  154. /// <summary>
  155. /// Reads an entire line from the socket.  This method
  156. /// will block until an entire line has been read.
  157. /// </summary>
  158. /// <param name="socket"></param>
  159. public String ReadLine( Socket socket )
  160. {
  161. byte[] inputBuffer = new byte[80];
  162. int count;
  163. StringBuilder inputString = new StringBuilder();
  164. String currentValue;
  165. // Read from the socket until an entire line has been read.
  166. do
  167. {
  168. // Read the input data.
  169. count = socket.Receive( inputBuffer );
  170. inputString.Append( Encoding.ASCII.GetString( inputBuffer, 0, count ) );
  171. currentValue = inputString.ToString();
  172. }
  173. while( currentValue.IndexOf( "rn" ) == -1 );
  174. // Strip off EOL.
  175. currentValue = currentValue.Remove( currentValue.IndexOf( "rn" ), 2 );
  176. System.Console.WriteLine( "Read Line: " + currentValue );
  177. return currentValue;
  178. }
  179. #endregion
  180. }
  181. }