IdTestCmdTCPServer.pas 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. unit IdTestCmdTCPServer;
  2. {
  3. session from known non-indy smtp:
  4. -----------------------------------------
  5. 220 mail.example.com ESMTP
  6. ?
  7. 500 5.5.1 Command unrecognized: "?"
  8. -----------------------------------------
  9. non-indy pop3
  10. -----------------------------------------
  11. +OK DBMAIL pop3 server ready to rock
  12. ?
  13. -ERR your command does not compute
  14. -----------------------------------------
  15. current indy cmdserver functionality:
  16. -----------------------------------------
  17. 200 Test Greeting
  18. ?
  19. 400-Unknown Command
  20. 400 ?
  21. -----------------------------------------
  22. }
  23. interface
  24. uses
  25. IdCmdTCPServer,
  26. IdCommandHandlers,
  27. IdContext,
  28. IdGlobal,
  29. IdIOHandlerStack,
  30. IdLogDebug,
  31. IdTCPClient,
  32. IdTCPConnection,
  33. IdTest,
  34. IdSys;
  35. type
  36. TIdTestCmdTCPServer = class(TIdTest)
  37. private
  38. //use a basic tcpclient to ensure isolate errors to the server component
  39. FClient: TIdTCPClient;
  40. FServer: TIdCmdTCPServer;
  41. procedure CommandTEST(ASender: TIdCommand);
  42. procedure CommandError(ASender: TIdCommand);
  43. procedure GetGreeting;
  44. protected
  45. procedure SetUp;override;
  46. procedure TearDown;override;
  47. published
  48. procedure TestCompleteCommand;
  49. procedure TestResultCode;
  50. procedure TestServerException;
  51. procedure TestUnknownCommand;
  52. end;
  53. EIdTestException = class(Exception);
  54. implementation
  55. const
  56. cTestCommand='TEST';
  57. cTestResponse='TestResponse';
  58. cTestCode=202;
  59. cNotTestCode=203;
  60. cErrorCommand='CAUSEERROR';
  61. cErrorResponse='My Error Message';
  62. cUnknownCommand='UNKNOWN';
  63. cTestPort=20202;
  64. cGreetingText = 'Test Greeting';
  65. procedure TIdTestCmdTCPServer.CommandError(ASender: TIdCommand);
  66. begin
  67. raise EIdTestException.Create(cErrorResponse);
  68. end;
  69. procedure TIdTestCmdTCPServer.CommandTEST(ASender: TIdCommand);
  70. begin
  71. ASender.Reply.SetReply(cTestCode,cTestResponse);
  72. end;
  73. procedure TIdTestCmdTCPServer.SetUp;
  74. var
  75. aCommand:TIdCommandHandler;
  76. begin
  77. inherited;
  78. FServer:= TIdCmdTCPServer.Create(nil);
  79. FServer.DefaultPort:=cTestPort;
  80. FServer.HelpReply.Code := '111';
  81. FServer.Greeting.Code := '200';
  82. FServer.Greeting.Text.Text := cGreetingText;
  83. Assert(FServer.Greeting.NumericCode<>0);
  84. aCommand:=FServer.CommandHandlers.Add;
  85. aCommand.Command := cTestCommand;
  86. aCommand.OnCommand := CommandTEST;
  87. aCommand:=FServer.CommandHandlers.Add;
  88. aCommand.Command := cErrorCommand;
  89. aCommand.OnCommand := CommandError;
  90. //uncomment to test using external telnet app
  91. //Sleep(5*60*1000);
  92. //setup client
  93. FClient:= TIdTCPClient.Create(nil);
  94. FClient.Port:=cTestPort;
  95. FClient.Host:='127.0.0.1';
  96. FClient.ReadTimeout:=1000;
  97. FClient.ConnectTimeout:=1000;
  98. //start
  99. FServer.Active:=True;
  100. FClient.Connect;
  101. GetGreeting;
  102. end;
  103. procedure TIdTestCmdTCPServer.TearDown;
  104. begin
  105. Sys.FreeAndNil(FClient);
  106. Sys.FreeAndNil(FServer);
  107. inherited;
  108. end;
  109. procedure TIdTestCmdTCPServer.TestCompleteCommand;
  110. //check that commands are only processed after EOL is sent
  111. var
  112. aStr:string;
  113. begin
  114. FClient.IOHandler.Write('TE');
  115. aStr:=FClient.IOHandler.Readln;
  116. Assert(aStr = '',aStr);
  117. FClient.IOHandler.Write('ST' + EOL);
  118. Assert(FClient.GetResponse(cTestCode) = cTestCode);
  119. Assert(FClient.LastCmdResult.Text.Text = cTestResponse + EOL);
  120. end;
  121. procedure TIdTestCmdTCPServer.GetGreeting;
  122. //greeting is sent by server immediately after connect
  123. //already read in setup
  124. var
  125. aResponse:integer;
  126. aStr:string;
  127. begin
  128. aResponse:=FClient.GetResponse(200);
  129. Assert(aResponse = 200);
  130. aStr := FClient.LastCmdResult.Text.Text;
  131. Assert(aStr = cGreetingText+EOL, aStr);
  132. end;
  133. procedure TIdTestCmdTCPServer.TestResultCode;
  134. //check unexpected resultcode raises error
  135. //TEST doesnt return 203, so this should fail
  136. var
  137. aExpected:Boolean;
  138. begin
  139. try
  140. FClient.SendCmd(cTestCommand,[cNotTestCode]);
  141. aExpected:=False;
  142. except
  143. aExpected:=True;
  144. end;
  145. Assert(aExpected);
  146. //SendCmd function result invalid here due to exception raised
  147. Assert(FClient.LastCmdResult.NumericCode=cTestCode);
  148. end;
  149. procedure TIdTestCmdTCPServer.TestServerException;
  150. //check exception on server sent to client ok.
  151. //exceptions should be response 500
  152. //possible to get actual server-side exception class?
  153. var
  154. aResponse: integer;
  155. aStr:string;
  156. begin
  157. FClient.IOHandler.WriteLn(cErrorCommand);
  158. aResponse:=FClient.GetResponse(500);
  159. aStr:=FClient.LastCmdResult.Text.Text;
  160. Assert(aResponse=500);
  161. Assert(aStr=cErrorResponse+EOL);
  162. end;
  163. procedure TIdTestCmdTCPServer.TestUnknownCommand;
  164. //check that unknown command is handled correctly
  165. //see TIdCmdTCPServer.CreateReplyUnknownCommand
  166. var
  167. aResponse:integer;
  168. aStr:string;
  169. begin
  170. aResponse:=FClient.SendCmd(cUnknownCommand);
  171. Assert(aResponse=400);
  172. aStr:=FClient.LastCmdResult.Text.Text;
  173. Assert(aStr='Unknown Command'+EOL+cUnknownCommand+EOL);
  174. end;
  175. initialization
  176. TIdTest.RegisterTest(TIdTestCmdTCPServer);
  177. end.