diff --git a/.gitignore b/.gitignore index 7ab03bf..e4cd96a 100755 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,9 @@ docker-compose.yml # production #/frontend/build +#test results +/tests/benchmark.csv + # misc **/.DS_Store **/.env.local diff --git a/docs/FiregexBenchmark.png b/docs/FiregexBenchmark.png new file mode 100644 index 0000000..9acb796 Binary files /dev/null and b/docs/FiregexBenchmark.png differ diff --git a/tests/README.md b/tests/README.md index 16b60a2..f90f6d6 100644 --- a/tests/README.md +++ b/tests/README.md @@ -28,6 +28,8 @@ The testing methodology will soon be updated with more edge-cases. # Running a Benchmark ./benchmark.py + options: + -h, --help show this help message and exit --address ADDRESS, -a ADDRESS Address of firegex backend --service_port SERVICE_PORT, -P SERVICE_PORT @@ -40,27 +42,12 @@ The testing methodology will soon be updated with more edge-cases. Number of regexes to benchmark with --duration DURATION, -d DURATION Duration of the Benchmark in seconds + --output_file OUTPUT_FILE, -o OUTPUT_FILE + Output results csv file Benchmarks let you evaluate the performance of the proxy. You can run one by typing in a shell ```test.py -p FIREGEX_PASSWORD -r NUM_OF_REGEX -d BENCHMARK_DURATION```. -It uses iperf3 to benchmark the throuput in MB/s of the server, both with proxy, without proxy, and for each new added regex. It will automatically add a new random regex untill it has reached NUM_OF_REGEX specified in the arguments. +It uses iperf3 to benchmark the throughput in MB/s of the server, both with proxy, without proxy, and for each new added regex. It will automatically add a new random regex untill it has reached NUM_OF_REGEX specified in the arguments. -Example output: - - Benchmarking with 30 will start on http://127.0.0.1:5000/ - Sucessfully logged in ✔ - Sucessfully created service Benchmark Service with public port 1337 ✔ - Sucessfully received the internal port 38249 ✔ - Baseline without proxy: 7145.402353788159MB/s - Sucessfully started service with id benchmark-service ✔ - Performance with no regexes: 2255.4573361742887MB/s - Performance with 1 regex(s): 76.51810976542541MB/s - Performance with 2 regex(s): 38.769568516424684MB/s - Performance with 3 regex(s): 25.976997107893663MB/s - Performance with 4 regex(s): 19.539058399917625MB/s - Performance with 5 regex(s): 14.720692718915746MB/s - Performance with 6 regex(s): 13.101487751340413MB/s - Performance with 7 regex(s): 11.237772047509017MB/s - Performance with 8 regex(s): 9.851833265188406MB/s - Performance with 9 regex(s): 8.725255532797124MB/s - Performance with 10 regex(s): 7.891516589287963MB/s \ No newline at end of file +You will find a new benchmark.csv file containg the results. +![Firegex Benchmark](/docs/FiregexBenchmark.png) diff --git a/tests/benchmark.py b/tests/benchmark.py index d07cc27..8d8aa82 100755 --- a/tests/benchmark.py +++ b/tests/benchmark.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -import argparse, socket,secrets, base64, iperf3 +import argparse, socket,secrets, base64, iperf3, csv from time import sleep from requests import Session from multiprocessing import Process @@ -28,6 +28,7 @@ parser.add_argument("--service_name", "-n", type=str , required=False, help='Nam parser.add_argument("--password", "-p", type=str, required=True, help='Firegex password') parser.add_argument("--num_of_regexes", "-r", type=int, required=True, help='Number of regexes to benchmark with') parser.add_argument("--duration", "-d", type=int, required=False, help='Duration of the Benchmark in seconds', default=5) +parser.add_argument("--output_file", "-o", type=str, required=False, help='Output results csv file', default="benchmark.csv") args = parser.parse_args() sep() @@ -74,7 +75,7 @@ def getReading(port): client.server_hostname = '127.0.0.1' client.port = port client.protocol = 'tcp' - return client.run().json['end']['sum_received']['bits_per_second']/8e+6 + return round(client.run().json['end']['sum_received']['bits_per_second']/8e+6 , 3) server = Process(target=startServer) server.start() @@ -83,7 +84,7 @@ sleep(1) #Get baseline reading puts(f"Baseline without proxy: ", color=colors.blue, end='') -print(f"{getReading(internal_port)}MB/s") +print(f"{getReading(internal_port)} MB/s") #Start firewall req = s.get(f"{args.address}api/service/{service_id}/start") @@ -97,7 +98,7 @@ sleep(1) results = [] puts(f"Performance with no regexes: ", color=colors.yellow , end='') results.append(getReading(args.service_port)) -print(f"{results[0]}MB/s") +print(f"{results[0]} MB/s") #Add all the regexs for i in range(1,args.num_of_regexes+1): @@ -107,10 +108,14 @@ for i in range(1,args.num_of_regexes+1): assert req.json()["status"] == "ok", f"Test Failed: Couldn't add regex {req.text}" puts(f"Performance with {i} regex(s): ", color=colors.red, end='') results.append(getReading(args.service_port)) - print(f"{results[i]}MB/s") + print(f"{results[i]} MB/s") -print("Results:") -print(results) +with open(args.output_file,'w') as f: + writer = csv.writer(f) + for i,result in enumerate(results): + writer.writerow([i,result]) + +puts(f"Sucessfully written results to {args.output_file} ✔", color=colors.magenta) #Delete the Service req = s.get(f"{args.address}api/service/{service_id}/delete")