001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.commons.net.telnet;
018
019 import junit.framework.TestCase;
020 import java.io.InputStream;
021 import java.io.OutputStream;
022
023 /***
024 * JUnit functional test for TelnetClient.
025 * Connects to the weather forecast service
026 * rainmaker.wunderground.com and asks for Los Angeles forecast.
027 * <p>
028 * @author Bruno D'Avanzo
029 ***/
030 public class TelnetClientFunctionalTest extends TestCase
031 {
032 protected TelnetClient tc1;
033
034 /***
035 * main for running the test.
036 ***/
037 public static void main(String args[])
038 {
039 junit.textui.TestRunner.run(TelnetClientFunctionalTest.class);
040 }
041
042 /***
043 * test setUp
044 ***/
045 @Override
046 protected void setUp()
047 {
048 tc1 = new TelnetClient();
049 }
050
051 /***
052 * Do the functional test:
053 * - connect to the weather service
054 * - press return on the first menu
055 * - send LAX on the second menu
056 * - send X to exit
057 ***/
058 public void testFunctionalTest() throws Exception
059 {
060 boolean testresult = false;
061 tc1.connect("rainmaker.wunderground.com", 3000);
062
063 InputStream is = tc1.getInputStream();
064 OutputStream os = tc1.getOutputStream();
065
066 boolean cont = waitForString(is, "Return to continue:", 30000);
067 if (cont)
068 {
069 os.write("\n".getBytes());
070 os.flush();
071 cont = waitForString(is, "city code--", 30000);
072 }
073 if (cont)
074 {
075 os.write("LAX\n".getBytes());
076 os.flush();
077 cont = waitForString(is, "Los Angeles", 30000);
078 }
079 if (cont)
080 {
081 cont = waitForString(is, "X to exit:", 30000);
082 }
083 if (cont)
084 {
085 os.write("X\n".getBytes());
086 os.flush();
087 tc1.disconnect();
088 testresult = true;
089 }
090
091 assertTrue(testresult);
092 }
093
094
095 /***
096 * Helper method. waits for a string with timeout
097 ***/
098 public boolean waitForString(InputStream is, String end, long timeout) throws Exception
099 {
100 byte buffer[] = new byte[32];
101 long starttime = System.currentTimeMillis();
102
103 String readbytes = "";
104 while((readbytes.indexOf(end) < 0) &&
105 ((System.currentTimeMillis() - starttime) < timeout))
106 {
107 if(is.available() > 0)
108 {
109 int ret_read = is.read(buffer);
110 readbytes = readbytes + new String(buffer, 0, ret_read);
111 }
112 else
113 {
114 Thread.sleep(500);
115 }
116 }
117
118 if(readbytes.indexOf(end) >= 0)
119 {
120 return (true);
121 }
122 else
123 {
124 return (false);
125 }
126 }
127 }