package unit; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * CWE-407 unit test: neutron-0001 * IptablesFirewallDriver.trusted_ports list vs set membership. * * Slow path: trusted_ports is a List — O(n) contains + O(n) remove = O(n²) per call. * Fast path: trusted_ports is a Set — O(1) contains + O(1) remove = O(n) per call. */ public class NeutronTrustedPortsAlgorithm { // --- slow: list-backed trusted ports (defective) --- static long processTrustedPortsSlow(List trustedPorts, List portIds) { long ops = 0; for (String port : portIds) { ops++; // loop iteration boolean found = false; for (String tp : trustedPorts) { // O(n) scan ops++; if (tp.equals(port)) { found = true; break; } } if (!found) { trustedPorts.add(port); } } return ops; } static long removeTrustedPortsSlow(List trustedPorts, List portIds) { long ops = 0; for (String port : portIds) { ops++; boolean found = false; int idx = -1; for (int i = 0; i < trustedPorts.size(); i++) { // O(n) scan ops++; if (trustedPorts.get(i).equals(port)) { found = true; idx = i; break; } } if (found) { trustedPorts.remove(idx); // O(n) shift // count the remove scan as ops too ops += trustedPorts.size(); } } return ops; } // --- fast: set-backed trusted ports (fixed) --- static long processTrustedPortsFast(Set trustedPorts, List portIds) { long ops = 0; for (String port : portIds) { ops++; // loop iteration + O(1) contains + O(1) add if (!trustedPorts.contains(port)) { trustedPorts.add(port); } } return ops; } static long removeTrustedPortsFast(Set trustedPorts, List portIds) { long ops = 0; for (String port : portIds) { ops++; // O(1) contains + O(1) remove trustedPorts.remove(port); } return ops; } public static void main(String[] args) { int N = 2000; int passed = 0; int total = 0; // Build initial trusted ports list/set List slowList = new ArrayList<>(); Set fastSet = new HashSet<>(); List portIds = new ArrayList<>(); for (int i = 0; i < N; i++) { String p = "port-" + i; slowList.add(p); fastSet.add(p); } // New port_ids — N ports not yet trusted List newPortIds = new ArrayList<>(); for (int i = N; i < 2 * N; i++) { newPortIds.add("port-" + i); } // Remove port_ids — first N ports for (int i = 0; i < N; i++) { portIds.add("port-" + i); } // Test 1: process (add) — slow vs fast ops List slowListCopy = new ArrayList<>(slowList); Set fastSetCopy = new HashSet<>(fastSet); long slowOps = processTrustedPortsSlow(slowListCopy, newPortIds); long fastOps = processTrustedPortsFast(fastSetCopy, newPortIds); total++; assert slowOps > fastOps * 10 : "process: slow=" + slowOps + " fast=" + fastOps + " speedup insufficient"; System.out.println("Test 1 PASS: process_trusted_ports slow=" + slowOps + " ops, fast=" + fastOps + " ops, speedup=" + (slowOps / Math.max(1, fastOps)) + "x"); passed++; // Test 2: remove — slow vs fast ops List slowListRemove = new ArrayList<>(slowList); Set fastSetRemove = new HashSet<>(fastSet); long slowRemOps = removeTrustedPortsSlow(slowListRemove, portIds); long fastRemOps = removeTrustedPortsFast(fastSetRemove, portIds); total++; assert slowRemOps > fastRemOps * 10 : "remove: slow=" + slowRemOps + " fast=" + fastRemOps + " speedup insufficient"; System.out.println("Test 2 PASS: remove_trusted_ports slow=" + slowRemOps + " ops, fast=" + fastRemOps + " ops, speedup=" + (slowRemOps / Math.max(1, fastRemOps)) + "x"); passed++; // Test 3: correctness — same elements result List corSlow = new ArrayList<>(slowList); Set corFast = new HashSet<>(fastSet); processTrustedPortsSlow(corSlow, newPortIds); processTrustedPortsFast(corFast, newPortIds); total++; assert new HashSet<>(corSlow).equals(corFast) : "process: slow and fast produce different results"; System.out.println("Test 3 PASS: process_trusted_ports slow and fast agree"); passed++; // Test 4: remove correctness List remSlow = new ArrayList<>(slowList); Set remFast = new HashSet<>(fastSet); removeTrustedPortsSlow(remSlow, portIds); removeTrustedPortsFast(remFast, portIds); total++; assert new HashSet<>(remSlow).equals(remFast) : "remove: slow and fast produce different results"; System.out.println("Test 4 PASS: remove_trusted_ports slow and fast agree"); passed++; System.out.println(passed + "/" + total + " PASS"); } }