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"); } }