Code review changes

Adding the following changes:

* Adding a unit test
* Removing a readToStringFunction
* Adding handler into AdbProtocolHandler to enable testing
*
This commit is contained in:
Daniel Llewellyn 2019-01-06 19:09:15 +00:00
parent 8a057bc856
commit 4dd168bb16
6 changed files with 78 additions and 43 deletions

View File

@ -1,13 +1,12 @@
package se.vidstige.jadb;
import se.vidstige.jadb.managers.Bash;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import static se.vidstige.jadb.Util.inputStreamToString;
public class JadbDevice {
@SuppressWarnings("squid:S00115")
public enum State {
@ -159,11 +158,11 @@ public class JadbDevice {
* @return success or failure
*/
public boolean enableTcpip(int port) throws IOException, JadbException {
Transport transport = getTransport();
send(transport, String.format("tcpip:%d", port));
String expectedResult = String.format("restarting in TCP Mode: %d", port);
return inputStreamToString(transport.getInputStream()).equals(expectedResult);
try (Transport transport = getTransport()) {
send(transport, String.format("tcpip:%d", port));
String expectedResult = String.format("restarting in TCP Mode: %d\n", port);
return transport.readString(expectedResult.length()).equals(expectedResult);
}
}
public List<RemoteFile> list(String remotePath) throws IOException, JadbException {

View File

@ -1,28 +0,0 @@
package se.vidstige.jadb;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
public class Util {
/**
* Convert an input stream to string
*
* @param inputStream input stream
*
* @return string representation of the input stream
*
* @throws IOException if an error ocurrs reading the input stream
*/
public static String inputStreamToString(InputStream inputStream) throws IOException {
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
return result.toString(StandardCharsets.UTF_8.name());
}
}

View File

@ -3,10 +3,7 @@ package se.vidstige.jadb.server;
import se.vidstige.jadb.JadbException;
import se.vidstige.jadb.RemoteFile;
import java.io.ByteArrayOutputStream;
import java.io.DataInput;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.*;
import java.util.List;
/**
@ -20,6 +17,7 @@ public interface AdbDeviceResponder {
void filePulled(RemoteFile path, ByteArrayOutputStream buffer) throws JadbException, IOException;
void shell(String command, DataOutputStream stdout, DataInput stdin) throws IOException;
void enableIpCommand(String ip, DataOutputStream outputStream) throws IOException;
List<RemoteFile> list(String path) throws IOException;
}

View File

@ -70,6 +70,8 @@ class AdbProtocolHandler implements Runnable {
hostGetState(output);
} else if (command.startsWith("host-serial:")) {
hostSerial(output, command);
} else if (command.startsWith("tcpip:")) {
handleTcpip(output, command);
} else {
throw new ProtocolException("Unknown command: " + command);
}
@ -81,6 +83,11 @@ class AdbProtocolHandler implements Runnable {
return true;
}
private void handleTcpip(DataOutputStream output, String command) throws IOException {
output.writeBytes("OKAY");
selected.enableIpCommand(command.substring("tcpip:".length()), output);
}
private void hostSerial(DataOutput output, String command) throws IOException {
String[] strs = command.split(":",0);
if (strs.length != 3) {

View File

@ -1,15 +1,13 @@
package se.vidstige.jadb.test.fakes;
import com.sun.tools.doclets.standard.Standard;
import se.vidstige.jadb.JadbException;
import se.vidstige.jadb.RemoteFile;
import se.vidstige.jadb.server.AdbDeviceResponder;
import se.vidstige.jadb.server.AdbResponder;
import se.vidstige.jadb.server.AdbServer;
import java.io.ByteArrayOutputStream;
import java.io.DataInput;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.*;
import java.net.ProtocolException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
@ -87,6 +85,10 @@ public class FakeAdbServer implements AdbResponder {
return findBySerial(serial).expectShell(commands);
}
public DeviceResponder.TcpIpException expectTcpip(String serial, String port) {
return findBySerial(serial).expectTcpip(port);
}
public DeviceResponder.ListExpectation expectList(String serial, String remotePath) {
return findBySerial(serial).expectList(remotePath);
}
@ -102,6 +104,7 @@ public class FakeAdbServer implements AdbResponder {
private List<FileExpectation> fileExpectations = new ArrayList<>();
private List<ShellExpectation> shellExpectations = new ArrayList<>();
private List<ListExpectation> listExpectations = new ArrayList<>();
private List<TcpIpException> tcpipExpectations = new ArrayList<>();
private DeviceResponder(String serial, String type) {
this.serial = serial;
@ -156,6 +159,21 @@ public class FakeAdbServer implements AdbResponder {
throw new ProtocolException("Unexpected shell to device " + serial + ": " + command);
}
@Override
public void enableIpCommand(String port, DataOutputStream outputStream) throws IOException {
for (TcpIpException expectation : tcpipExpectations) {
if (expectation.matches(port)) {
tcpipExpectations.remove(expectation);
outputStream.write(String.format("restarting in TCP Mode: %s\n", port).getBytes(StandardCharsets.UTF_8));
outputStream.flush();
return;
}
}
throw new ProtocolException("Unexpected tcpip to device " + serial + ": (port) " + port);
}
@Override
public List<RemoteFile> list(String path) throws IOException {
for (ListExpectation le : listExpectations) {
@ -173,6 +191,32 @@ public class FakeAdbServer implements AdbResponder {
org.junit.Assert.assertEquals(0, listExpectations.size());
}
private static class TcpIpException implements ExpectationBuilder {
private String port;
public TcpIpException(final String port) {
this.port = port;
}
public boolean matches(String cmd) {
return cmd.equals(port);
}
@Override
public void failWith(String message) {
}
@Override
public void withContent(byte[] content) {
}
@Override
public void withContent(String content) {
}
}
private static class FileExpectation implements ExpectationBuilder {
private final RemoteFile path;
private byte[] content;
@ -316,5 +360,11 @@ public class FakeAdbServer implements AdbResponder {
listExpectations.add(expectation);
return expectation;
}
public TcpIpException expectTcpip(String port) {
TcpIpException expectation = new TcpIpException(port);
tcpipExpectations.add(expectation);
return expectation;
}
}
}

View File

@ -12,6 +12,7 @@ import se.vidstige.jadb.test.fakes.FakeAdbServer;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.text.DateFormat;
import java.text.ParseException;
@ -104,6 +105,14 @@ public class MockedTestCases {
device.executeShell("ls", "-l");
}
@Test
public void testExecuteEnableTcpip() throws IOException, JadbException {
server.add("serial-123");
server.expectTcpip("serial-123", "5555");
JadbDevice device = connection.getDevices().get(0);
device.enableTcpip();
}
@Test
public void testExecuteShellQuotesWhitespace() throws Exception {
server.add("serial-123");