146 lines
5.4 KiB
Java
146 lines
5.4 KiB
Java
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<String> trustedPorts, List<String> 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<String> trustedPorts, List<String> 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<String> trustedPorts, List<String> 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<String> trustedPorts, List<String> 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<String> slowList = new ArrayList<>();
|
|
Set<String> fastSet = new HashSet<>();
|
|
List<String> 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<String> 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<String> slowListCopy = new ArrayList<>(slowList);
|
|
Set<String> 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<String> slowListRemove = new ArrayList<>(slowList);
|
|
Set<String> 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<String> corSlow = new ArrayList<>(slowList);
|
|
Set<String> 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<String> remSlow = new ArrayList<>(slowList);
|
|
Set<String> 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");
|
|
}
|
|
}
|