From 63dba694af688e0e392277abd282d004c5fa9b6b Mon Sep 17 00:00:00 2001 From: Denton Gentry Date: Sun, 24 Jul 2022 09:10:37 -0700 Subject: [PATCH 1/2] DnsConfig: don't use signed bytes when printing. intToInetString(0x0101a8c0) returns "-64.-88.1.1" because Java integers are always signed. There is not a %u format specifier. Though the quads of an IP address literally are bytes, they can be left as an int to pass to String.format. This allows room for sign bits, so intToInetString(0x0101a8c0) returns "192.168.1.1" Signed-off-by: Denton Gentry --- android/src/main/java/com/tailscale/ipn/DnsConfig.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/android/src/main/java/com/tailscale/ipn/DnsConfig.java b/android/src/main/java/com/tailscale/ipn/DnsConfig.java index 7dc047d..243b27c 100644 --- a/android/src/main/java/com/tailscale/ipn/DnsConfig.java +++ b/android/src/main/java/com/tailscale/ipn/DnsConfig.java @@ -231,10 +231,10 @@ public class DnsConfig { String intToInetString(int hostAddress) { return String.format(java.util.Locale.ROOT, "%d.%d.%d.%d", - (byte)(0xff & hostAddress), - (byte)(0xff & (hostAddress >> 8)), - (byte)(0xff & (hostAddress >> 16)), - (byte)(0xff & (hostAddress >> 24))); + (0xff & hostAddress), + (0xff & (hostAddress >> 8)), + (0xff & (hostAddress >> 16)), + (0xff & (hostAddress >> 24))); } // getDnsServersFromNetworkInfo retrieves DNS servers using ConnectivityManager From 283dd77bccccf4861057905b6eb74438642b90b6 Mon Sep 17 00:00:00 2001 From: Denton Gentry Date: Sun, 24 Jul 2022 10:51:34 -0700 Subject: [PATCH 2/2] Add a unit test for DnsConfig.intToInetString adds JUnit dependencies and basic gradle support to run unit tests, and a test for DnsConfig.intToInetString(). Signed-off-by: Denton Gentry --- Makefile | 6 +++--- android/build.gradle | 1 + .../java/com/tailscale/ipn/DnsConfig.java | 2 +- .../java/com/tailscale/ipn/DnsConfigTest.java | 21 +++++++++++++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 android/src/test/java/com/tailscale/ipn/DnsConfigTest.java diff --git a/Makefile b/Makefile index 1fa4378..4c4f93b 100644 --- a/Makefile +++ b/Makefile @@ -53,7 +53,7 @@ endif $(DEBUG_APK): toolchain mkdir -p android/libs go run gioui.org/cmd/gogio -buildmode archive -target android -appid $(APPID) -tags novulkan -o $(AAR) github.com/tailscale/tailscale-android/cmd/tailscale - (cd android && ./gradlew assemblePlayDebug) + (cd android && ./gradlew test assemblePlayDebug) mv android/build/outputs/apk/play/debug/android-play-debug.apk $@ rundebug: $(DEBUG_APK) @@ -66,7 +66,7 @@ rundebug: $(DEBUG_APK) tailscale-fdroid.apk: toolchain mkdir -p android/libs go run gioui.org/cmd/gogio -buildmode archive -target android -appid $(APPID) -tags novulkan -o $(AAR) github.com/tailscale/tailscale-android/cmd/tailscale - (cd android && ./gradlew assembleFdroidDebug) + (cd android && ./gradlew test assembleFdroidDebug) mv android/build/outputs/apk/fdroid/debug/android-fdroid-debug.apk $@ # This target is also used by the F-Droid builder. @@ -76,7 +76,7 @@ release_aar: go run gioui.org/cmd/gogio -ldflags "-X tailscale.com/version.Long=$(VERSIONNAME) -X tailscale.com/version.Short=$(VERSIONNAME_SHORT) -X tailscale.com/version.GitCommit=$(TAILSCALE_COMMIT) -X tailscale.com/version.ExtraGitCommit=$(OUR_VERSION)" -buildmode archive -target android -appid $(APPID) -tags novulkan -o $(AAR) github.com/tailscale/tailscale-android/cmd/tailscale $(RELEASE_AAB): release_aar - (cd android && ./gradlew bundlePlayRelease) + (cd android && ./gradlew test bundlePlayRelease) mv ./android/build/outputs/bundle/playRelease/android-play-release.aab $@ release: $(RELEASE_AAB) diff --git a/android/build.gradle b/android/build.gradle index c263472..eeb8c34 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -50,6 +50,7 @@ dependencies { implementation "androidx.browser:browser:1.2.0" implementation "androidx.security:security-crypto:1.1.0-alpha03" implementation ':ipn@aar' + testCompile "junit:junit:4.12" // Non-free dependencies. playImplementation 'com.google.android.gms:play-services-auth:18.0.0' diff --git a/android/src/main/java/com/tailscale/ipn/DnsConfig.java b/android/src/main/java/com/tailscale/ipn/DnsConfig.java index 243b27c..5c2cdbc 100644 --- a/android/src/main/java/com/tailscale/ipn/DnsConfig.java +++ b/android/src/main/java/com/tailscale/ipn/DnsConfig.java @@ -229,7 +229,7 @@ public class DnsConfig { } - String intToInetString(int hostAddress) { + public String intToInetString(int hostAddress) { return String.format(java.util.Locale.ROOT, "%d.%d.%d.%d", (0xff & hostAddress), (0xff & (hostAddress >> 8)), diff --git a/android/src/test/java/com/tailscale/ipn/DnsConfigTest.java b/android/src/test/java/com/tailscale/ipn/DnsConfigTest.java new file mode 100644 index 0000000..b93e168 --- /dev/null +++ b/android/src/test/java/com/tailscale/ipn/DnsConfigTest.java @@ -0,0 +1,21 @@ +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import com.tailscale.ipn.DnsConfig; + +public class DnsConfigTest { + DnsConfig dns; + + @Before + public void setup() { + dns = new DnsConfig(null); + } + + @Test + public void dnsConfig_intToInetStringTest() { + assertEquals(dns.intToInetString(0x0101a8c0), "192.168.1.1"); + assertEquals(dns.intToInetString(0x04030201), "1.2.3.4"); + assertEquals(dns.intToInetString(0), "0.0.0.0"); + } +}