From 43f3014f2c297e7fb442dc04f434103a9a5f9abb Mon Sep 17 00:00:00 2001 From: Anton Afanasyeu Date: Thu, 25 Jun 2026 17:49:07 +0200 Subject: [PATCH] mobile: IodineVpnServiceTest lifecycle coverage + ndkVersion 29 - IodineVpnServiceTest: action constants, extras, IodineTunnelBridge state, config sanitize, RemoteAccessMode iodine round-trips - app/build.gradle: ndkVersion 29.0.14206865 (27 had corrupt empty dir) Co-authored-by: Cursor --- app/build.gradle | 1 + .../remoteaccess/IodineVpnServiceTest.java | 89 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 app/src/test/java/com/foxx/androidcast/remoteaccess/IodineVpnServiceTest.java diff --git a/app/build.gradle b/app/build.gradle index b9ccf1d..d07ffca 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,6 +56,7 @@ try { android { namespace 'com.foxx.androidcast' compileSdk 34 + ndkVersion '29.0.14206865' defaultConfig { applicationId "com.foxx.androidcast" diff --git a/app/src/test/java/com/foxx/androidcast/remoteaccess/IodineVpnServiceTest.java b/app/src/test/java/com/foxx/androidcast/remoteaccess/IodineVpnServiceTest.java new file mode 100644 index 0000000..eddc63c --- /dev/null +++ b/app/src/test/java/com/foxx/androidcast/remoteaccess/IodineVpnServiceTest.java @@ -0,0 +1,89 @@ +package com.foxx.androidcast.remoteaccess; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** Unit tests for IodineVpnService lifecycle helpers (no Android runtime required). */ +public class IodineVpnServiceTest { + + @Test + public void actionConstants_areNonNull() { + assertNotNull(IodineVpnService.ACTION_UP); + assertNotNull(IodineVpnService.ACTION_DOWN); + assertTrue(IodineVpnService.ACTION_UP.contains("iodine")); + assertTrue(IodineVpnService.ACTION_DOWN.contains("iodine")); + } + + @Test + public void extraConstants_areNonNull() { + assertNotNull(IodineVpnService.EXTRA_HOST); + assertNotNull(IodineVpnService.EXTRA_PORT); + assertNotNull(IodineVpnService.EXTRA_TUNNEL); + assertNotNull(IodineVpnService.EXTRA_PASSWORD); + } + + @Test + public void actionUp_notEqualsDown() { + assertFalse(IodineVpnService.ACTION_UP.equals(IodineVpnService.ACTION_DOWN)); + } + + // IodineTunnelBridge state — no Android context needed + + @Test + public void tunnelBridge_initiallyNotConnected() { + assertFalse(IodineTunnelBridge.isConnected()); + } + + @Test + public void tunnelBridge_lastDetailInitiallyEmpty() { + String detail = IodineTunnelBridge.getLastDetail(); + assertNotNull(detail); + } + + // IodineConfig integration + + @Test + public void defaultUdpPort_matchesExpected() { + assertEquals(5350, IodineConfig.DEFAULT_UDP_PORT); + } + + @Test + public void defaultPassword_isLabValue() { + assertEquals("zxc123", IodineConfig.DEFAULT_PASSWORD); + } + + @Test + public void sanitize_roundTrip() { + assertEquals("fe.example.org", IodineConfig.sanitizeHost(" fe.example.org ")); + assertEquals(IodineConfig.DEFAULT_SERVER_HOST, IodineConfig.sanitizeHost(null)); + assertEquals(IodineConfig.DEFAULT_SERVER_HOST, IodineConfig.sanitizeHost("")); + assertEquals(IodineConfig.DEFAULT_TUNNEL_DOMAIN, IodineConfig.sanitizeTunnelDomain(null)); + assertEquals(5350, IodineConfig.sanitizePort(-1)); + assertEquals(5350, IodineConfig.sanitizePort(99999)); + assertEquals(443, IodineConfig.sanitizePort(443)); + } + + @Test + public void sanitizePassword_nullFallsBackToDefault() { + assertEquals(IodineConfig.DEFAULT_PASSWORD, IodineConfig.sanitizePassword(null)); + assertEquals("custom", IodineConfig.sanitizePassword("custom")); + } + + // RemoteAccessMode iodine integration + + @Test + public void remoteAccessMode_iodineApiValue() { + assertEquals("iodine", RemoteAccessMode.IODINE.toApiValue()); + assertTrue(RemoteAccessMode.IODINE.isActive()); + } + + @Test + public void remoteAccessMode_fromStored_iodine() { + assertEquals(RemoteAccessMode.IODINE, RemoteAccessMode.fromStored("iodine")); + assertEquals(RemoteAccessMode.IODINE, RemoteAccessMode.fromStored("IODINE")); + } +}