Skip to content

Commit bd20d1f

Browse files
committed
hugetop: print human readable sizes by default
Consistent with the hugetop command of `procps-ng`, change the default size to a format suitable for human reading Closes: #687
1 parent 37b2ff5 commit bd20d1f

1 file changed

Lines changed: 112 additions & 3 deletions

File tree

src/uu/hugetop/src/hugetop.rs

Lines changed: 112 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
5757

5858
let limit = matches.get_one::<usize>("lines").copied();
5959
let numa = matches.get_flag("numa");
60-
let human = matches.get_flag("human");
60+
let human = true;
6161
let once = matches.get_flag("once");
6262
let delay = *matches.get_one::<u64>("delay").unwrap_or(&0);
6363

@@ -176,7 +176,7 @@ fn print_procs(human: bool, limit: Option<usize>) {
176176
}
177177
}
178178

179-
fn print_node(node: &str, pools: &[HugePagePool], human: bool) {
179+
fn format_node_line(node: &str, pools: &[HugePagePool], human: bool) -> String {
180180
let mut line = String::new();
181181
line.push_str(node);
182182
line.push(':');
@@ -198,7 +198,11 @@ fn print_node(node: &str, pools: &[HugePagePool], human: bool) {
198198
));
199199
}
200200

201-
println!("{}", line);
201+
line
202+
}
203+
204+
fn print_node(node: &str, pools: &[HugePagePool], human: bool) {
205+
println!("{}", format_node_line(node, pools, human));
202206
}
203207

204208
fn format_kb(kb: u64, human: bool) -> String {
@@ -463,4 +467,109 @@ mod tests {
463467
assert_eq!(pools[0].total_pages, 10);
464468
assert_eq!(pools[0].free_pages, 3);
465469
}
470+
471+
#[test]
472+
#[cfg(target_os = "linux")]
473+
fn format_kb_defaults_to_human_readable() {
474+
assert_eq!(format_kb(64, true), "64Ki");
475+
assert_eq!(format_kb(1536, true), "1.5Mi");
476+
assert_eq!(format_kb(1048576, true), "1.0Gi");
477+
}
478+
479+
#[test]
480+
#[cfg(target_os = "linux")]
481+
fn format_kb_non_human_readable() {
482+
assert_eq!(format_kb(64, false), "64");
483+
assert_eq!(format_kb(1536, false), "1536");
484+
assert_eq!(format_kb(1048576, false), "1048576");
485+
}
486+
487+
#[test]
488+
#[cfg(target_os = "linux")]
489+
fn format_node_line_in_human_readable_mode() {
490+
let pools = vec![HugePagePool {
491+
size_kb: 2048,
492+
total_pages: 10,
493+
free_pages: 3,
494+
reserved_pages: 2,
495+
surplus_pages: 1,
496+
}];
497+
498+
assert_eq!(
499+
format_node_line("node(s)", &pools, true),
500+
"node(s): 2.0Mi - 3/10"
501+
);
502+
}
503+
504+
#[test]
505+
#[cfg(target_os = "linux")]
506+
fn format_node_line_non_human_mode() {
507+
let pools = vec![HugePagePool {
508+
size_kb: 2048,
509+
total_pages: 10,
510+
free_pages: 3,
511+
reserved_pages: 2,
512+
surplus_pages: 1,
513+
}];
514+
515+
assert_eq!(
516+
format_node_line("node(s)", &pools, false),
517+
"node(s): 2048kB - 3/10"
518+
);
519+
}
520+
521+
#[test]
522+
#[cfg(target_os = "linux")]
523+
fn format_node_line_multiple_pools() {
524+
let pools = vec![
525+
HugePagePool {
526+
size_kb: 2048,
527+
total_pages: 10,
528+
free_pages: 3,
529+
reserved_pages: 2,
530+
surplus_pages: 1,
531+
},
532+
HugePagePool {
533+
size_kb: 1048576,
534+
total_pages: 2,
535+
free_pages: 1,
536+
reserved_pages: 0,
537+
surplus_pages: 0,
538+
},
539+
];
540+
541+
assert_eq!(
542+
format_node_line("node(s)", &pools, true),
543+
"node(s): 2.0Mi - 3/10, 1.0Gi - 1/2"
544+
);
545+
}
546+
547+
#[test]
548+
#[cfg(target_os = "linux")]
549+
fn humanized_si_units() {
550+
// si=true uses powers of 1000, suffix without "i"
551+
assert_eq!(humanized(0, true), "0B");
552+
assert_eq!(humanized(1, true), "1.0K"); // 1024 bytes → 1.0K
553+
assert_eq!(humanized(10, true), "10K"); // integer when value >= 10
554+
assert_eq!(humanized(1, false), "1.0Ki"); // binary: 1024 bytes → 1.0Ki
555+
assert_eq!(humanized(1024, true), "1.0M"); // 1024*1024 bytes → 1.0M
556+
}
557+
558+
#[test]
559+
#[cfg(target_os = "linux")]
560+
fn humanized_small_values() {
561+
// level==0: bytes < 100, return raw bytes with "B" suffix
562+
assert_eq!(humanized(0, false), "0B");
563+
assert_eq!(humanized(0, true), "0B");
564+
}
565+
566+
#[test]
567+
#[cfg(target_os = "linux")]
568+
fn humanized_integer_rounding() {
569+
// When value >= 10.0, use integer format (no decimal)
570+
// 10240 kiB → 10 MiB (10.0 >= 10 → integer)
571+
assert_eq!(humanized(10240, false), "10Mi");
572+
// 10485760 kiB → 10 GiB
573+
assert_eq!(humanized(10485760, false), "10Gi");
574+
}
466575
}

0 commit comments

Comments
 (0)