From 206b9c43525a1dff85ca7f7ae7e392bc02d7742d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jari=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Sat, 28 Jan 2017 16:53:13 +0200 Subject: [PATCH 1/4] Allow any character except square brackets in property values PropertyManager failed to get all properties from certain devices because it allowed only [a-zA-Z0-9_.-] characters in values but they can contain other characters too. For example in Nexus 9 ro.product.model is "Nexus 9" (has space). This commit changes allowed characters in property value to contain anything except square brackets. --- .../jadb/managers/PropertyManager.java | 2 +- .../jadb/test/unit/PropertyManagerTest.java | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/se/vidstige/jadb/managers/PropertyManager.java b/src/se/vidstige/jadb/managers/PropertyManager.java index 181cee8..6ab30d8 100644 --- a/src/se/vidstige/jadb/managers/PropertyManager.java +++ b/src/se/vidstige/jadb/managers/PropertyManager.java @@ -27,7 +27,7 @@ public class PropertyManager { } private Map parseProp(BufferedReader bufferedReader) throws IOException { - final Pattern pattern = Pattern.compile("^\\[([a-zA-Z0-9_.-]*)\\]:.\\[([a-zA-Z0-9_.-]*)\\]"); + final Pattern pattern = Pattern.compile("^\\[([a-zA-Z0-9_.-]*)\\]:.\\[([^\\[\\]]*)\\]"); HashMap result = new HashMap<>(); diff --git a/test/se/vidstige/jadb/test/unit/PropertyManagerTest.java b/test/se/vidstige/jadb/test/unit/PropertyManagerTest.java index dadf17c..1b59874 100644 --- a/test/se/vidstige/jadb/test/unit/PropertyManagerTest.java +++ b/test/se/vidstige/jadb/test/unit/PropertyManagerTest.java @@ -55,6 +55,38 @@ public class PropertyManagerTest { assertEquals(expected, actual); } + @Test + public void testGetPropsValueHasSpecialCharacters() throws Exception { + /* Some example properties from Nexus 9: + [ro.product.model]: [Nexus 9] + [ro.product.cpu.abilist]: [arm64-v8a,armeabi-v7a,armeabi] + [ro.retaildemo.video_path]: [/data/preloads/demo/retail_demo.mp4] + [ro.url.legal]: [http://www.google.com/intl/%s/mobile/android/basic/phone-legal.html] + [ro.vendor.build.date]: [Tue Nov 1 18:21:23 UTC 2016] + */ + //Arrange + Map expected = new HashMap<>(); + expected.put("ro.product.model", "Nexus 9"); + expected.put("ro.product.cpu.abilist", "arm64-v8a,armeabi-v7a,armeabi"); + expected.put("ro.retaildemo.video_path", "/data/preloads/demo/retail_demo.mp4"); + expected.put("ro.url.legal", "http://www.google.com/intl/%s/mobile/android/basic/phone-legal.html"); + expected.put("ro.vendor.build.date", "Tue Nov 1 18:21:23 UTC 2016"); + + String response = "[ro.product.model]: [Nexus 9]\n" + + "[ro.product.cpu.abilist]: [arm64-v8a,armeabi-v7a,armeabi]\n" + + "[ro.retaildemo.video_path]: [/data/preloads/demo/retail_demo.mp4]\n" + + "[ro.url.legal]: [http://www.google.com/intl/%s/mobile/android/basic/phone-legal.html]\n" + + "[ro.vendor.build.date]: [Tue Nov 1 18:21:23 UTC 2016]"; + + 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 From a083481f4a5c8e25b468f5c75ef77013ad80376f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jari=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Sat, 28 Jan 2017 16:54:51 +0200 Subject: [PATCH 2/4] PropertyManager's pattern only needs to be compiled once According to Pattern docs "Instances of this class are immutable and are safe for use by multiple concurrent threads." --- src/se/vidstige/jadb/managers/PropertyManager.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/se/vidstige/jadb/managers/PropertyManager.java b/src/se/vidstige/jadb/managers/PropertyManager.java index 6ab30d8..45de99e 100644 --- a/src/se/vidstige/jadb/managers/PropertyManager.java +++ b/src/se/vidstige/jadb/managers/PropertyManager.java @@ -15,6 +15,7 @@ import java.util.regex.Pattern; * A class which works with properties, uses getprop and setprop methods of android shell */ public class PropertyManager { + private final Pattern pattern = Pattern.compile("^\\[([a-zA-Z0-9_.-]*)\\]:.\\[([^\\[\\]]*)\\]"); private final JadbDevice device; public PropertyManager(JadbDevice device) { @@ -27,8 +28,6 @@ public class PropertyManager { } private Map parseProp(BufferedReader bufferedReader) throws IOException { - final Pattern pattern = Pattern.compile("^\\[([a-zA-Z0-9_.-]*)\\]:.\\[([^\\[\\]]*)\\]"); - HashMap result = new HashMap<>(); String line; From 8115621587e08b551536bd50918e606b39319ff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jari=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Sat, 28 Jan 2017 16:57:30 +0200 Subject: [PATCH 3/4] Close PropertyManager's reader after parsing --- src/se/vidstige/jadb/managers/PropertyManager.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/se/vidstige/jadb/managers/PropertyManager.java b/src/se/vidstige/jadb/managers/PropertyManager.java index 45de99e..8b86d59 100644 --- a/src/se/vidstige/jadb/managers/PropertyManager.java +++ b/src/se/vidstige/jadb/managers/PropertyManager.java @@ -23,8 +23,15 @@ public class PropertyManager { } public Map getprop() throws IOException, JadbException { - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(device.executeShell("getprop"))); - return parseProp(bufferedReader); + BufferedReader bufferedReader = null; + try { + bufferedReader = new BufferedReader(new InputStreamReader(device.executeShell("getprop"))); + return parseProp(bufferedReader); + } finally { + if (bufferedReader != null) { + bufferedReader.close(); + } + } } private Map parseProp(BufferedReader bufferedReader) throws IOException { From d3ef914b43ca01a7e10e503570e957179a8645d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jari=20H=C3=A4m=C3=A4l=C3=A4inen?= Date: Mon, 30 Jan 2017 20:50:34 +0200 Subject: [PATCH 4/4] Use try-with-resources to close PropertyManager's reader --- src/se/vidstige/jadb/managers/PropertyManager.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/se/vidstige/jadb/managers/PropertyManager.java b/src/se/vidstige/jadb/managers/PropertyManager.java index 8b86d59..d78de7a 100644 --- a/src/se/vidstige/jadb/managers/PropertyManager.java +++ b/src/se/vidstige/jadb/managers/PropertyManager.java @@ -23,14 +23,9 @@ public class PropertyManager { } public Map getprop() throws IOException, JadbException { - BufferedReader bufferedReader = null; - try { - bufferedReader = new BufferedReader(new InputStreamReader(device.executeShell("getprop"))); + try (BufferedReader bufferedReader = + new BufferedReader(new InputStreamReader(device.executeShell("getprop")))) { return parseProp(bufferedReader); - } finally { - if (bufferedReader != null) { - bufferedReader.close(); - } } }