diff --git a/src/se/vidstige/jadb/JadbDevice.java b/src/se/vidstige/jadb/JadbDevice.java index 3c09e8b..404dc8e 100644 --- a/src/se/vidstige/jadb/JadbDevice.java +++ b/src/se/vidstige/jadb/JadbDevice.java @@ -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 list(String remotePath) throws IOException, JadbException { diff --git a/src/se/vidstige/jadb/Util.java b/src/se/vidstige/jadb/Util.java deleted file mode 100644 index 0dcf202..0000000 --- a/src/se/vidstige/jadb/Util.java +++ /dev/null @@ -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()); - } -} diff --git a/src/se/vidstige/jadb/server/AdbDeviceResponder.java b/src/se/vidstige/jadb/server/AdbDeviceResponder.java index b019f42..5985d5d 100644 --- a/src/se/vidstige/jadb/server/AdbDeviceResponder.java +++ b/src/se/vidstige/jadb/server/AdbDeviceResponder.java @@ -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 list(String path) throws IOException; } diff --git a/src/se/vidstige/jadb/server/AdbProtocolHandler.java b/src/se/vidstige/jadb/server/AdbProtocolHandler.java index 7112a51..2d6f112 100644 --- a/src/se/vidstige/jadb/server/AdbProtocolHandler.java +++ b/src/se/vidstige/jadb/server/AdbProtocolHandler.java @@ -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) { diff --git a/test/se/vidstige/jadb/test/fakes/FakeAdbServer.java b/test/se/vidstige/jadb/test/fakes/FakeAdbServer.java index bc1b7ab..7e96bf3 100644 --- a/test/se/vidstige/jadb/test/fakes/FakeAdbServer.java +++ b/test/se/vidstige/jadb/test/fakes/FakeAdbServer.java @@ -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 fileExpectations = new ArrayList<>(); private List shellExpectations = new ArrayList<>(); private List listExpectations = new ArrayList<>(); + private List 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 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; + } } } diff --git a/test/se/vidstige/jadb/test/unit/MockedTestCases.java b/test/se/vidstige/jadb/test/unit/MockedTestCases.java index 4c1edb7..5b88943 100644 --- a/test/se/vidstige/jadb/test/unit/MockedTestCases.java +++ b/test/se/vidstige/jadb/test/unit/MockedTestCases.java @@ -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");