App 2.43.5: update checks log what happens

Each check writes down the networks Android sees, the server's name lookup,
how a failure happened and how many reports wait, and on a failure whether
the internet answers at all, to tell a SIM without data from a server that is
down. The report goes to a USB stick and, once online, the server. No address
or token is written. Tried on the emulator. Not tried on the car.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LhzAVaUyqcw5PkGjz4mWW6
This commit is contained in:
2026-11-01 10:21:15 +01:00
co-authored by Claude Opus 5.5
parent 6b55bec419
commit e52d7f01fc
14 changed files with 301 additions and 15 deletions
@@ -0,0 +1,67 @@
package com.evsuite.abrp;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import java.io.IOException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Collections;
import javax.net.ssl.SSLHandshakeException;
public class UpdateDiagnosisTest {
@Test
public void errorsAreToldApart() {
assertTrue(UpdateDiagnosis.failure(new UnknownHostException()).contains("no data connection"));
assertTrue(UpdateDiagnosis.failure(new SocketTimeoutException()).contains("in time"));
assertTrue(UpdateDiagnosis.failure(new ConnectException()).contains("no connection"));
assertTrue(UpdateDiagnosis.failure(new SSLHandshakeException("x")).contains("in between"));
assertTrue(UpdateDiagnosis.failure(new IOException("Release API returned 401")).contains("token"));
assertTrue(UpdateDiagnosis.failure(new IOException("Invalid release response")).contains("not a list"));
assertEquals("unknown failure", UpdateDiagnosis.failure(null));
}
@Test
public void anErrorsOwnTextNeverReachesTheLog() {
String secret = "https://car.example.com/v1/app/releases?token=abc";
for (Throwable t : Arrays.asList(new UnknownHostException(secret), new SocketTimeoutException(secret),
new ConnectException(secret), new SSLHandshakeException(secret), new IOException(secret),
new RuntimeException(secret))) {
String line = UpdateDiagnosis.failure(t);
assertFalse(line, line.contains("example"));
assertFalse(line, line.contains("abc"));
}
}
@Test
public void statusesSayWhoIsAtFault() {
assertTrue(UpdateDiagnosis.status(302).contains("SIM without data"));
assertTrue(UpdateDiagnosis.status(401).contains("token"));
assertTrue(UpdateDiagnosis.status(403).contains("token"));
assertTrue(UpdateDiagnosis.status(404).contains("does not know"));
assertTrue(UpdateDiagnosis.status(502).contains("forge"));
assertTrue(UpdateDiagnosis.status(418).contains("HTTP 418"));
}
@Test
public void onlyA204IsTheInternetWorking() {
assertTrue(UpdateDiagnosis.internet(204).startsWith("the internet works"));
assertTrue(UpdateDiagnosis.internet(200).contains("in between"));
assertTrue(UpdateDiagnosis.internet(302).contains("SIM without data"));
}
@Test
public void aNetworkInOneLine() {
assertEquals("cellular, in use, offers internet, not confirmed by Android, roaming",
UpdateDiagnosis.network(Collections.singletonList("cellular"), true, false, true, true));
assertEquals("unknown type, no internet, confirmed by Android",
UpdateDiagnosis.network(Collections.emptyList(), false, true, false, false));
}
}