    1   /*
    2    * Copyright 2003-2004 The Apache Software Foundation
    3    *
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    *
    8    *     http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  package org.apache.commons.net.telnet;
    17
    18  import junit.framework.TestCase;
    19  import java.io.InputStream;
    20  import java.io.OutputStream;
    21
    22  /****
    23   * JUnit functional test for TelnetClient.
    24   * Connects to the weather forecast service
    25   * rainmaker.wunderground.com and asks for Los Angeles forecast.
    26   * <p>
    27   * @author Bruno D'Avanzo
    28   ***/
    29  public class TelnetClientFunctionalTest extends TestCase
    30  {
    31      protected TelnetClient tc1;
    32
    33      /****
    34       * main for running the test.
    35       ***/
    36      public static void main(String args[])
    37      {
    38          junit.textui.TestRunner.run(TelnetClientFunctionalTest.class);
    39      }
    40
    41      /****
    42       * test setUp
    43       ***/
    44      protected void setUp()
    45      {
    46          tc1 = new TelnetClient();
    47      }
    48
    49      /****
    50       * Do the functional test:
    51       * - connect to the weather service
    52       * - press return on the first menu
    53       * - send LAX on the second menu
    54       * - send X to exit
    55       ***/
    56      public void testFunctionalTest() throws Exception
    57      {
    58          boolean testresult = false;
    59          tc1.connect("rainmaker.wunderground.com", 3000);
    60
    61          InputStream is = tc1.getInputStream();
    62          OutputStream os = tc1.getOutputStream();
    63
    64          boolean cont = waitForString(is, "Return to continue:", 30000);
    65          if (cont)
    66          {
    67              os.write("\n".getBytes());
    68              os.flush();
    69              cont = waitForString(is, "city code--", 30000);
    70          }
    71          if (cont)
    72          {
    73              os.write("LAX\n".getBytes());
    74              os.flush();
    75              cont = waitForString(is, "Los Angeles", 30000);
    76          }
    77          if (cont)
    78          {
    79              cont = waitForString(is, "X to exit:", 30000);
    80          }
    81          if (cont)
    82          {
    83              os.write("X\n".getBytes());
    84              os.flush();
    85              tc1.disconnect();
    86              testresult = true;
    87          }
    88
    89          assertTrue(testresult);
    90      }
    91
    92
    93      /****
    94       * Helper method. waits for a string with timeout
    95       ***/
    96      public boolean waitForString(InputStream is, String end, long timeout) throws Exception
    97      {
    98          byte buffer[] = new byte[32];
    99          long starttime = System.currentTimeMillis();
    100
    101         String readbytes = new String();
    102         while((readbytes.indexOf(end) < 0) &&
    103               ((System.currentTimeMillis() - starttime) < timeout))
    104         {
    105             if(is.available() > 0)
    106             {
    107                 int ret_read = is.read(buffer);
    108                 readbytes = readbytes + new String(buffer, 0, ret_read);
    109             }
    110             else
    111             {
    112                 Thread.sleep(500);
    113             }
    114         }
    115
    116         if(readbytes.indexOf(end) >= 0)
    117         {
    118             return (true);
    119         }
    120         else
    121         {
    122             return (false);
    123         }
    124     }
    125 }