diff --git a/src/androidTest/java/com/nutomic/syncthingandroid/test/syncthing/RestApiTest.java b/src/androidTest/java/com/nutomic/syncthingandroid/test/syncthing/RestApiTest.java index 927cfaa3..c59983ee 100644 --- a/src/androidTest/java/com/nutomic/syncthingandroid/test/syncthing/RestApiTest.java +++ b/src/androidTest/java/com/nutomic/syncthingandroid/test/syncthing/RestApiTest.java @@ -91,6 +91,15 @@ public class RestApiTest extends AndroidTestCase { assertEquals("1 GiB/s", RestApi.readableTransferRate(getContext(), 8589934592L)); } + @SmallTest + public void testConvertNotCrashing() { + long[] values = new long[]{-1, 0, 1, 2, 4, 8, 16, 1024, 2^10, 2^15, 2^20, 2^25, 2^30}; + for (long l : values) { + assertNotSame("", RestApi.readableFileSize(getContext(), l)); + assertNotSame("", RestApi.readableTransferRate(getContext(), l)); + } + } + @MediumTest public void testGetConnections() throws InterruptedException { final CountDownLatch latch = new CountDownLatch(1); diff --git a/src/main/java/com/nutomic/syncthingandroid/syncthing/RestApi.java b/src/main/java/com/nutomic/syncthingandroid/syncthing/RestApi.java index d04fd1be..8c372b51 100644 --- a/src/main/java/com/nutomic/syncthingandroid/syncthing/RestApi.java +++ b/src/main/java/com/nutomic/syncthingandroid/syncthing/RestApi.java @@ -568,13 +568,19 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener, } /** - * Converts a number of bytes to a human readable transfer rate in bits (eg 100 Kb/s). + * Converts a number of bytes to a human readable transfer rate in bytes per second + * (eg 100 KiB/s). */ public static String readableTransferRate(Context context, long bits) { final String[] units = context.getResources().getStringArray(R.array.transfer_rate_units); - if (bits <= 0) return "0 " + units[0]; long bytes = bits / 8; + if (bytes <= 0) return "0 " + units[0]; int digitGroups = (int) (Math.log10(bytes) / Math.log10(1024)); + if (digitGroups < 0 || digitGroups > 4) + throw new ArrayIndexOutOfBoundsException("bits=" + Long.toString(bits) + + ", bytes=" + Long.toString(bytes) + + " (int) digitGroups=" + Integer.toString(digitGroups) + + " (double) digitGroups=" + Double.toString(Math.log10(bytes) / Math.log10(1024))); return new DecimalFormat("#,##0.#") .format(bytes / Math.pow(1024, digitGroups)) + " " + units[digitGroups]; }