In this article, I will demonstrate the use of a custom Telnet function that I have created as a precondition to running our E2E testing. The function uses a Java API that interacts with PowerShell console named jPowerShell.
The Problem
Some systems (for example a mail server) are blocked to ping, direct UI navigation via selenium or an API call. These systems only accept Telnet connection on certain ports. We need to test these systems as part of our E2E tests. Instead of running many E2E tests that will fail because the server/service is down, we want to verify that the Telnet connection succeeded and only then we should continue to perform our tests.
Enabling Telnet On Windows
In order to enable Telnet, go to windows features and turn on Telnet client feature:
Telnet a Service
Example telnet command on google SMTP server in port 25:
telnet smtp.gmail.com 25
This is the result of a successful connection:
In our automation testing, we need a status code or a Boolean result to determine if our connection worked. We can’t get them using this command. Let’s explore what Powershell has to offer us regarding this subject.
Telnet on Powershell
After reading this article I realized I can get a Telnet response object when running this command:
New-Object System.Net.Sockets.TcpClient("smtp.gmail.com", 25)
The response was:
Client : System.Net.Sockets.Socket Available : 0 Connected : True ExclusiveAddressUse : False ReceiveBufferSize : 65536 SendBufferSize : 65536 ReceiveTimeout : 0 SendTimeout : 0 LingerState : System.Net.Sockets.LingerOption NoDelay : False
In order to extract only the “Connected” value from this object I used Powershell pipe operator and selected only this property:
New-Object System.Net.Sockets.TcpClient("smtp.gmail.com", 25) | Select -ExpandProperty Connected
The response is:
True
Telnet on Java using PowerShell
With this knowledge in hand, the next step is to create a function that accepts two parameters: the IP of the server and his port. The function should perform a Telnet and return a Boolean response for the Telnet success status. The function looks like this:
public boolean canTelnet(String host, int port) { PowerShellResponse response = PowerShell.executeSingleCommand(String.format( "New-Object System.Net.Sockets.TcpClient('%s', %d) | Select -ExpandProperty Connected", host, port)); return response.getCommandOutput().equalsIgnoreCase("True"); }
Now, with Java and PowerShell combined our Telnet test looks like this:
@BeforeTest public void testConnection() throws Exception { Assert.assertTrue(canTelnet("smtp.gmail.com", 25)); }
In case this verification fails, the following tests in our test suite will not run.
In conclusion
In this article, we saw the problem that we were facing when we needed to perform some kind of a “health check” on servers that are only accessible via Telnet. Then, through PowerShell and Java, we came with a programmatic solution that is compatible with our test automation framework.
Happy testing!