diff --git a/src/se/vidstige/jadb/JadbDevice.java b/src/se/vidstige/jadb/JadbDevice.java index d2afcbb..dbf5361 100644 --- a/src/se/vidstige/jadb/JadbDevice.java +++ b/src/se/vidstige/jadb/JadbDevice.java @@ -4,7 +4,11 @@ import se.vidstige.jadb.managers.Bash; import java.io.*; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class JadbDevice { private final String serial; diff --git a/src/se/vidstige/jadb/managers/PropertyManager.java b/src/se/vidstige/jadb/managers/PropertyManager.java new file mode 100644 index 0000000..181cee8 --- /dev/null +++ b/src/se/vidstige/jadb/managers/PropertyManager.java @@ -0,0 +1,53 @@ +package se.vidstige.jadb.managers; + +import se.vidstige.jadb.JadbDevice; +import se.vidstige.jadb.JadbException; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A class which works with properties, uses getprop and setprop methods of android shell + */ +public class PropertyManager { + private final JadbDevice device; + + public PropertyManager(JadbDevice device) { + this.device = device; + } + + public Map getprop() throws IOException, JadbException { + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(device.executeShell("getprop"))); + return parseProp(bufferedReader); + } + + private Map parseProp(BufferedReader bufferedReader) throws IOException { + final Pattern pattern = Pattern.compile("^\\[([a-zA-Z0-9_.-]*)\\]:.\\[([a-zA-Z0-9_.-]*)\\]"); + + HashMap result = new HashMap<>(); + + String line; + Matcher matcher = pattern.matcher(""); + + while ((line = bufferedReader.readLine()) != null) { + matcher.reset(line); + + if (matcher.find()) { + if (matcher.groupCount() < 2) { + System.err.println("Property line: " + line + " does not match patter. Ignoring"); + continue; + } + String key = matcher.group(1); + String value = matcher.group(2); + result.put(key, value); + } + } + + return result; + } +} diff --git a/test/se/vidstige/jadb/test/unit/MockedTestCases.java b/test/se/vidstige/jadb/test/unit/MockedTestCases.java index 944e9e7..c56001c 100644 --- a/test/se/vidstige/jadb/test/unit/MockedTestCases.java +++ b/test/se/vidstige/jadb/test/unit/MockedTestCases.java @@ -8,6 +8,7 @@ import se.vidstige.jadb.JadbConnection; import se.vidstige.jadb.JadbDevice; import se.vidstige.jadb.JadbException; import se.vidstige.jadb.RemoteFile; +import se.vidstige.jadb.managers.PropertyManager; import se.vidstige.jadb.test.fakes.FakeAdbServer; import java.io.ByteArrayInputStream; @@ -17,6 +18,7 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.List; +import java.util.Map; public class MockedTestCases { diff --git a/test/se/vidstige/jadb/test/unit/PropertyManagerTest.java b/test/se/vidstige/jadb/test/unit/PropertyManagerTest.java new file mode 100644 index 0000000..dadf17c --- /dev/null +++ b/test/se/vidstige/jadb/test/unit/PropertyManagerTest.java @@ -0,0 +1,95 @@ +package se.vidstige.jadb.test.unit; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import se.vidstige.jadb.JadbConnection; +import se.vidstige.jadb.JadbDevice; +import se.vidstige.jadb.managers.PropertyManager; +import se.vidstige.jadb.test.fakes.FakeAdbServer; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +public class PropertyManagerTest { + private final String DEVICE_SERIAL = "serial-123"; + + private FakeAdbServer server; + private JadbConnection connection; + private JadbDevice device; + + @Before + public void setUp() throws Exception { + server = new FakeAdbServer(15037); + server.start(); + server.add(DEVICE_SERIAL); + connection = new JadbConnection("localhost", 15037); + + device = connection.getDevices().get(0); + } + + @After + public void tearDown() throws Exception { + server.stop(); + server.verifyExpectations(); + } + + @Test + public void testGetPropsStandardFormat() throws Exception { + //Arrange + Map expected = new HashMap<>(); + expected.put("bluetooth.hciattach", "true"); + expected.put("bluetooth.status", "off"); + + String response = "[bluetooth.status]: [off] \n" + + "[bluetooth.hciattach]: [true]"; + + server.expectShell(DEVICE_SERIAL, "getprop").returns(response); + + //Act + Map actual = new PropertyManager(device).getprop(); + + //Assert + assertEquals(expected, actual); + } + + @Test + public void testGetPropsMalformedIgnoredString() throws Exception { + //Arrange + Map expected = new HashMap<>(); + expected.put("bluetooth.hciattach", "true"); + expected.put("bluetooth.status", "off"); + + String response = "[bluetooth.status]: [off]\n" + + "[malformed_line]\n" + + "[bluetooth.hciattach]: [true]"; + + server.expectShell(DEVICE_SERIAL, "getprop").returns(response); + + //Act + Map actual = new PropertyManager(device).getprop(); + + //Assert + assertEquals(expected, actual); + } + + @Test + public void testGetPropsMalformedNotUsedString() throws Exception { + //Arrange + Map expected = new HashMap<>(); + expected.put("bluetooth.status", "off"); + + String response = "[bluetooth.status]: [off]\n" + + "malformed[bluetooth.hciattach]: [true]"; + + server.expectShell(DEVICE_SERIAL, "getprop").returns(response); + + //Act + Map actual = new PropertyManager(device).getprop(); + + //Assert + assertEquals(expected, actual); + } +}