73 lines
4.9 KiB
Java
73 lines
4.9 KiB
Java
package com.bbflight.background_downloader;
|
|
|
|
import android.app.job.JobInfo;
|
|
import android.content.ComponentName;
|
|
import android.net.NetworkCapabilities;
|
|
import android.net.NetworkRequest;
|
|
|
|
/** Runs against the real Android 9 framework classes, not stubbed builders. */
|
|
public final class DownloadNetworkPolicyProbe {
|
|
private static int checks;
|
|
private static void check(boolean value, String message) {
|
|
checks++;
|
|
if (!value) throw new AssertionError(message);
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
// Android's getuid JNI library is not loaded by a plain host JVM.
|
|
// Fixture only the process identity; capability matching and JobInfo
|
|
// below remain the real unmodified Android framework implementation.
|
|
libcore.io.Os originalOs = libcore.io.Libcore.os;
|
|
libcore.io.Libcore.os = (libcore.io.Os) java.lang.reflect.Proxy.newProxyInstance(
|
|
libcore.io.Os.class.getClassLoader(), new Class<?>[]{libcore.io.Os.class},
|
|
(proxy, method, arguments) -> method.getName().equals("getuid")
|
|
? 10000 : method.invoke(originalOs, arguments));
|
|
NetworkCapabilities cellular = new NetworkCapabilities()
|
|
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
|
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
|
|
cellular.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
|
|
cellular.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN);
|
|
NetworkCapabilities wifi = new NetworkCapabilities(cellular)
|
|
.removeTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
|
|
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
|
|
ComponentName service = new ComponentName("org.reelbox.app", "DownloadTestService");
|
|
|
|
// Reproduce why NETWORK_TYPE_ANY queues despite a reachable media host.
|
|
JobInfo legacy = new JobInfo.Builder(1, service)
|
|
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).build();
|
|
check(legacy.getRequiredNetwork().hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED),
|
|
"Legacy ANY must reproduce the hidden validation requirement");
|
|
check(!legacy.getRequiredNetwork().networkCapabilities.satisfiedByNetworkCapabilities(cellular),
|
|
"Legacy request should reject an unvalidated internet-capable network");
|
|
|
|
NetworkRequest any = DownloadNetworkPolicy.request(false);
|
|
NetworkRequest wifiOnly = DownloadNetworkPolicy.request(true);
|
|
check(any.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET), "Internet is still required");
|
|
check(!any.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED), "No external validation requirement");
|
|
check(!any.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN), "VPNs remain allowed");
|
|
check(any.networkCapabilities.satisfiedByNetworkCapabilities(cellular), "Unvalidated cellular/VPN allowed");
|
|
check(any.networkCapabilities.satisfiedByNetworkCapabilities(wifi), "Unvalidated Wi-Fi/VPN allowed");
|
|
check(wifiOnly.hasTransport(NetworkCapabilities.TRANSPORT_WIFI), "Preserve Wi-Fi-only preference");
|
|
check(!wifiOnly.networkCapabilities.satisfiedByNetworkCapabilities(cellular), "Wi-Fi-only rejects cellular");
|
|
check(wifiOnly.networkCapabilities.satisfiedByNetworkCapabilities(wifi), "Wi-Fi-only accepts unvalidated Wi-Fi/VPN");
|
|
check(!any.networkCapabilities.satisfiedByNetworkCapabilities(new NetworkCapabilities()), "No-internet network rejected");
|
|
NetworkCapabilities vpnCellular = new NetworkCapabilities(cellular)
|
|
.addTransportType(NetworkCapabilities.TRANSPORT_VPN);
|
|
NetworkCapabilities vpnWifi = new NetworkCapabilities(wifi)
|
|
.addTransportType(NetworkCapabilities.TRANSPORT_VPN);
|
|
check(any.networkCapabilities.satisfiedByNetworkCapabilities(vpnCellular), "Explicit cellular-backed VPN allowed");
|
|
check(!wifiOnly.networkCapabilities.satisfiedByNetworkCapabilities(vpnCellular), "Wi-Fi-only rejects cellular-backed VPN");
|
|
check(wifiOnly.networkCapabilities.satisfiedByNetworkCapabilities(vpnWifi), "Explicit Wi-Fi-backed VPN allowed");
|
|
check(!wifiOnly.networkCapabilities.satisfiedByNetworkCapabilities(
|
|
new NetworkCapabilities(wifi).removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)),
|
|
"Wi-Fi without internet capability rejected");
|
|
|
|
JobInfo custom = new JobInfo.Builder(2, service).setRequiredNetwork(any).build();
|
|
check(!custom.getRequiredNetwork().hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED),
|
|
"JobScheduler must not re-add validation to an explicit request");
|
|
check(custom.getRequiredNetwork().networkCapabilities.satisfiedByNetworkCapabilities(cellular),
|
|
"UIDT-style explicit request can use the unvalidated network");
|
|
System.out.println("PASS DownloadNetworkPolicy: " + checks + " real Android framework assertions");
|
|
}
|
|
}
|