Skip to content

Commit d2e4254

Browse files
introduce --download-only and --upload-only flags (#150)
* introduce --download-only and --upload-only flags * update simple speedtest example * fix clippy issues * make upload-only and download-only exclusive
1 parent ee35cf2 commit d2e4254

File tree

4 files changed

+53
-19
lines changed

4 files changed

+53
-19
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ Options:
4242
Force usage of IPv6
4343
-d, --disable-dynamic-max-payload-size
4444
Disables dynamically skipping tests with larger payload sizes if the tests for the previous payload size took longer than 5 seconds
45+
--download-only
46+
Test download speed only
47+
--upload-only
48+
Test upload speed only
4549
-h, --help
4650
Print help
4751
-V, --version

examples/simple_speedtest.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ fn main() {
1010
ipv4: false, // don't force ipv4 usage
1111
ipv6: false, // don't force ipv6 usage
1212
verbose: false,
13+
upload_only: false,
14+
download_only: false,
1315
nr_tests: 5,
1416
nr_latency_tests: 20,
1517
max_payload_size: PayloadSize::M10,

src/lib.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,26 @@ pub struct SpeedTestCLIOptions {
7272
/// size took longer than 5 seconds
7373
#[arg(short, long)]
7474
pub disable_dynamic_max_payload_size: bool,
75+
76+
/// Test download speed only
77+
#[arg(long, conflicts_with = "upload_only")]
78+
pub download_only: bool,
79+
80+
/// Test upload speed only
81+
#[arg(long, conflicts_with = "download_only")]
82+
pub upload_only: bool,
83+
}
84+
85+
impl SpeedTestCLIOptions {
86+
/// Returns whether download tests should be performed
87+
pub fn should_download(&self) -> bool {
88+
self.download_only || !self.upload_only
89+
}
90+
91+
/// Returns whether upload tests should be performed
92+
pub fn should_upload(&self) -> bool {
93+
self.upload_only || !self.download_only
94+
}
7595
}
7696

7797
fn parse_payload_size(input_string: &str) -> Result<PayloadSize, String> {

src/speedtest.rs

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -88,25 +88,33 @@ pub fn speed_test(client: Client, options: SpeedTestCLIOptions) -> Vec<Measureme
8888
println!("{metadata}");
8989
}
9090
run_latency_test(&client, options.nr_latency_tests, options.output_format);
91-
let payload_sizes = PayloadSize::sizes_from_max(options.max_payload_size);
92-
let mut measurements = run_tests(
93-
&client,
94-
test_download,
95-
TestType::Download,
96-
payload_sizes.clone(),
97-
options.nr_tests,
98-
options.output_format,
99-
options.disable_dynamic_max_payload_size,
100-
);
101-
measurements.extend(run_tests(
102-
&client,
103-
test_upload,
104-
TestType::Upload,
105-
payload_sizes.clone(),
106-
options.nr_tests,
107-
options.output_format,
108-
options.disable_dynamic_max_payload_size,
109-
));
91+
let payload_sizes = PayloadSize::sizes_from_max(options.max_payload_size.clone());
92+
let mut measurements = Vec::new();
93+
94+
if options.should_download() {
95+
measurements.extend(run_tests(
96+
&client,
97+
test_download,
98+
TestType::Download,
99+
payload_sizes.clone(),
100+
options.nr_tests,
101+
options.output_format,
102+
options.disable_dynamic_max_payload_size,
103+
));
104+
}
105+
106+
if options.should_upload() {
107+
measurements.extend(run_tests(
108+
&client,
109+
test_upload,
110+
TestType::Upload,
111+
payload_sizes.clone(),
112+
options.nr_tests,
113+
options.output_format,
114+
options.disable_dynamic_max_payload_size,
115+
));
116+
}
117+
110118
log_measurements(
111119
&measurements,
112120
payload_sizes,

0 commit comments

Comments
 (0)