mirror of
https://github.com/imsnif/bandwhich.git
synced 2026-02-09 01:59:18 +08:00
feat(layout): 'Window' ordering ability (#118)
* Window ordering ability Added ability to change display order of the windows using tab. Added a help tooltip. * fix redundant clone * fix fmt check * cargo fmt fix 2 * Fixed help layout and added tests * Fix fmt check
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -11,4 +11,4 @@ debian/*
|
||||
!debian/control
|
||||
!debian/copyright
|
||||
!debian/rules
|
||||
!debian/source
|
||||
!debian/source
|
||||
@@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
* Ability to change the window layout with <TAB> (https://github.com/imsnif/bandwhich/pull/118) - [@Louis-Lesage](https://github.com/Louis-Lesage)
|
||||
|
||||
### Fixed
|
||||
* Add terabytes as a display unit (for cumulative mode) (https://github.com/imsnif/bandwhich/pull/168) - [@TheLostLambda](https://github.com/TheLostLambda)
|
||||
|
||||
|
||||
@@ -9,10 +9,14 @@ pub struct HelpText {
|
||||
pub show_dns: bool,
|
||||
}
|
||||
|
||||
const TEXT_WHEN_PAUSED: &str = " Press <SPACE> to resume";
|
||||
const TEXT_WHEN_NOT_PAUSED: &str = " Press <SPACE> to pause";
|
||||
const FIRST_WIDTH_BREAKPOINT: u16 = 76;
|
||||
const SECOND_WIDTH_BREAKPOINT: u16 = 54;
|
||||
|
||||
const TEXT_WHEN_PAUSED: &str = " Press <SPACE> to resume.";
|
||||
const TEXT_WHEN_NOT_PAUSED: &str = " Press <SPACE> to pause.";
|
||||
const TEXT_WHEN_DNS_NOT_SHOWN: &str = " (DNS queries hidden).";
|
||||
const TEXT_WHEN_DNS_SHOWN: &str = " (DNS queries shown).";
|
||||
const TEXT_TAB_TIP: &str = " Use <TAB> to rearrange tables.";
|
||||
|
||||
impl HelpText {
|
||||
pub fn render(&self, frame: &mut Frame<impl Backend>, rect: Rect) {
|
||||
@@ -23,14 +27,22 @@ impl HelpText {
|
||||
TEXT_WHEN_NOT_PAUSED
|
||||
};
|
||||
|
||||
let dns_content = if self.show_dns {
|
||||
let dns_content = if rect.width <= FIRST_WIDTH_BREAKPOINT {
|
||||
""
|
||||
} else if self.show_dns {
|
||||
TEXT_WHEN_DNS_SHOWN
|
||||
} else {
|
||||
TEXT_WHEN_DNS_NOT_SHOWN
|
||||
};
|
||||
|
||||
let tab_text = if rect.width <= SECOND_WIDTH_BREAKPOINT {
|
||||
""
|
||||
} else {
|
||||
TEXT_TAB_TIP
|
||||
};
|
||||
|
||||
[Text::styled(
|
||||
format!("{}{}", pause_content, dns_content),
|
||||
format!("{}{}{}", pause_content, tab_text, dns_content),
|
||||
Style::default().modifier(Modifier::BOLD),
|
||||
)]
|
||||
};
|
||||
|
||||
@@ -99,12 +99,12 @@ impl<'a> Layout<'a> {
|
||||
self.build_three_children_layout(rect)
|
||||
}
|
||||
}
|
||||
pub fn render(&self, frame: &mut Frame<impl Backend>, rect: Rect) {
|
||||
pub fn render(&self, frame: &mut Frame<impl Backend>, rect: Rect, ui_offset: usize) {
|
||||
let (top, app, bottom) = top_app_and_bottom_split(rect);
|
||||
let layout_slots = self.build_layout(app);
|
||||
for i in 0..layout_slots.len() {
|
||||
if let Some(rect) = layout_slots.get(i) {
|
||||
if let Some(child) = self.children.get(i) {
|
||||
if let Some(child) = self.children.get((i + ui_offset) % self.children.len()) {
|
||||
child.render(frame, *rect);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ where
|
||||
display_connection_string(
|
||||
connection,
|
||||
ip_to_host,
|
||||
&connection_network_data.interface_name
|
||||
&connection_network_data.interface_name,
|
||||
),
|
||||
connection_network_data.total_bytes_uploaded,
|
||||
connection_network_data.total_bytes_downloaded,
|
||||
@@ -79,7 +79,7 @@ where
|
||||
));
|
||||
}
|
||||
}
|
||||
pub fn draw(&mut self, paused: bool, show_dns: bool) {
|
||||
pub fn draw(&mut self, paused: bool, show_dns: bool, ui_offset: usize) {
|
||||
let state = &self.state;
|
||||
let children = self.get_tables_to_display();
|
||||
self.terminal
|
||||
@@ -95,7 +95,7 @@ where
|
||||
children,
|
||||
footer: help_text,
|
||||
};
|
||||
layout.render(&mut frame, size);
|
||||
layout.render(&mut frame, size, ui_offset);
|
||||
})
|
||||
.unwrap();
|
||||
}
|
||||
@@ -127,6 +127,11 @@ where
|
||||
}
|
||||
children
|
||||
}
|
||||
|
||||
pub fn get_table_count(&self) -> usize {
|
||||
self.get_tables_to_display().len()
|
||||
}
|
||||
|
||||
pub fn update_state(
|
||||
&mut self,
|
||||
connections_to_procs: HashMap<LocalSocket, String>,
|
||||
|
||||
27
src/main.rs
27
src/main.rs
@@ -15,7 +15,7 @@ use os::OnSigWinch;
|
||||
|
||||
use ::pnet::datalink::{DataLinkReceiver, NetworkInterface};
|
||||
use ::std::collections::HashMap;
|
||||
use ::std::sync::atomic::{AtomicBool, Ordering};
|
||||
use ::std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
||||
use ::std::sync::{Arc, Mutex};
|
||||
use ::std::thread::park_timeout;
|
||||
use ::std::{thread, time};
|
||||
@@ -121,6 +121,7 @@ where
|
||||
{
|
||||
let running = Arc::new(AtomicBool::new(true));
|
||||
let paused = Arc::new(AtomicBool::new(false));
|
||||
let ui_offset = Arc::new(AtomicUsize::new(0));
|
||||
let dns_shown = opts.show_dns;
|
||||
|
||||
let mut active_threads = vec![];
|
||||
@@ -144,11 +145,17 @@ where
|
||||
.spawn({
|
||||
let ui = ui.clone();
|
||||
let paused = paused.clone();
|
||||
let ui_offset = ui_offset.clone();
|
||||
|
||||
move || {
|
||||
on_winch({
|
||||
Box::new(move || {
|
||||
let mut ui = ui.lock().unwrap();
|
||||
ui.draw(paused.load(Ordering::SeqCst), dns_shown);
|
||||
ui.draw(
|
||||
paused.load(Ordering::SeqCst),
|
||||
dns_shown,
|
||||
ui_offset.load(Ordering::SeqCst),
|
||||
);
|
||||
})
|
||||
});
|
||||
}
|
||||
@@ -162,7 +169,11 @@ where
|
||||
.spawn({
|
||||
let running = running.clone();
|
||||
let paused = paused.clone();
|
||||
let ui_offset = ui_offset.clone();
|
||||
|
||||
let network_utilization = network_utilization.clone();
|
||||
let ui = ui.clone();
|
||||
|
||||
move || {
|
||||
while running.load(Ordering::Acquire) {
|
||||
let render_start_time = Instant::now();
|
||||
@@ -185,13 +196,14 @@ where
|
||||
{
|
||||
let mut ui = ui.lock().unwrap();
|
||||
let paused = paused.load(Ordering::SeqCst);
|
||||
let ui_offset = ui_offset.load(Ordering::SeqCst);
|
||||
if !paused {
|
||||
ui.update_state(sockets_to_procs, utilization, ip_to_host);
|
||||
}
|
||||
if raw_mode {
|
||||
ui.output_text(&mut write_to_stdout);
|
||||
} else {
|
||||
ui.draw(paused, dns_shown);
|
||||
ui.draw(paused, dns_shown, ui_offset);
|
||||
}
|
||||
}
|
||||
let render_duration = render_start_time.elapsed();
|
||||
@@ -213,8 +225,11 @@ where
|
||||
.spawn({
|
||||
let running = running.clone();
|
||||
let display_handler = display_handler.thread().clone();
|
||||
|
||||
move || {
|
||||
for evt in keyboard_events {
|
||||
let mut ui = ui.lock().unwrap();
|
||||
|
||||
match evt {
|
||||
Event::Key(Key::Ctrl('c')) | Event::Key(Key::Char('q')) => {
|
||||
running.store(false, Ordering::Release);
|
||||
@@ -226,6 +241,12 @@ where
|
||||
paused.fetch_xor(true, Ordering::SeqCst);
|
||||
display_handler.unpark();
|
||||
}
|
||||
Event::Key(Key::Char('\t')) => {
|
||||
let table_count = ui.get_table_count();
|
||||
let new = ui_offset.load(Ordering::SeqCst) + 1 % table_count;
|
||||
ui_offset.store(new, Ordering::SeqCst);
|
||||
ui.draw(paused.load(Ordering::SeqCst), dns_shown, new);
|
||||
}
|
||||
_ => (),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries shown).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries shown).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -30,5 +30,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────────────────┘└─────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -30,5 +30,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
source: src/tests/cases/ui.rs
|
||||
expression: "&terminal_draw_events_mirror[1]"
|
||||
---
|
||||
98Bps
|
||||
|
||||
|
||||
|
||||
5 0Bps / 28Bps
|
||||
4 0Bps / 26Bps
|
||||
1 0Bps / 22Bps
|
||||
2 0Bps / 21Bps
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
3.3.3.3 0Bps / 28Bps
|
||||
2.2.2.2 0Bps / 26Bps
|
||||
1.1.1.1 0Bps / 22Bps
|
||||
4.4.4.4 0Bps / 21Bps
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
---
|
||||
source: src/tests/cases/ui.rs
|
||||
expression: "&terminal_draw_events_mirror[0]"
|
||||
---
|
||||
Total Up / Down: 0Bps / 0Bps
|
||||
┌Utilization by process name────────────────────┐
|
||||
│Process Up / Down │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
└───────────────────────────────────────────────┘
|
||||
┌Utilization by remote address──────────────────┐
|
||||
│Remote Address Up / Down │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
└───────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause.
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
source: src/tests/cases/ui.rs
|
||||
expression: "&terminal_draw_events_mirror[1]"
|
||||
---
|
||||
98Bps
|
||||
|
||||
|
||||
|
||||
5 1 0Bps / 28Bps
|
||||
4 1 0Bps / 26Bps
|
||||
1 1 0Bps / 22Bps
|
||||
2 1 0Bps / 21Bps
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
source: src/tests/cases/ui.rs
|
||||
expression: "&terminal_draw_events_mirror[0]"
|
||||
---
|
||||
Total Up / Down: 0Bps / 0Bps
|
||||
┌Utilization by process name────────────────────────────────────────┐
|
||||
│Process Connections Up / Down │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
└───────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables.
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[1]"
|
||||
|
||||
|
||||
|
||||
resume (DNS queries hi den).
|
||||
resume. Use <TAB> to rea range tables. (DNS queries hi den).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
55
src/tests/cases/snapshots/ui__rearranged_by_tab-2.snap
Normal file
55
src/tests/cases/snapshots/ui__rearranged_by_tab-2.snap
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
source: src/tests/cases/ui.rs
|
||||
expression: "&terminal_draw_events_mirror[1]"
|
||||
---
|
||||
22Bps
|
||||
|
||||
|
||||
|
||||
1 1 0Bps / 22Bps 1.1.1.1 1 0Bps / 22Bps
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<interface_name>:443 => 1.1.1.1:12345 (tcp) 1 0Bps / 22Bps
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
55
src/tests/cases/snapshots/ui__rearranged_by_tab-3.snap
Normal file
55
src/tests/cases/snapshots/ui__rearranged_by_tab-3.snap
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
source: src/tests/cases/ui.rs
|
||||
expression: "&terminal_draw_events_mirror[2]"
|
||||
---
|
||||
|
||||
remote addr ss connection────
|
||||
Remote Address Connections Up / Down Connection Proc ss
|
||||
|
||||
.1.1.1 1 0Bps / 22Bps <interface_na[..]1:12345 (tcp)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
proc ss name
|
||||
Proc ss Connections Up / Down
|
||||
|
||||
1 1 0Bps / 22Bps
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
55
src/tests/cases/snapshots/ui__rearranged_by_tab-4.snap
Normal file
55
src/tests/cases/snapshots/ui__rearranged_by_tab-4.snap
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
source: src/tests/cases/ui.rs
|
||||
expression: "&terminal_draw_events_mirror[3]"
|
||||
---
|
||||
14
|
||||
|
||||
|
||||
|
||||
14 14
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
14
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
55
src/tests/cases/snapshots/ui__rearranged_by_tab-5.snap
Normal file
55
src/tests/cases/snapshots/ui__rearranged_by_tab-5.snap
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
source: src/tests/cases/ui.rs
|
||||
expression: "&terminal_draw_events_mirror[4]"
|
||||
---
|
||||
1
|
||||
|
||||
|
||||
|
||||
1 1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
55
src/tests/cases/snapshots/ui__rearranged_by_tab.snap
Normal file
55
src/tests/cases/snapshots/ui__rearranged_by_tab.snap
Normal file
@@ -0,0 +1,55 @@
|
||||
---
|
||||
source: src/tests/cases/ui.rs
|
||||
expression: "&terminal_draw_events_mirror[0]"
|
||||
---
|
||||
Total Up / Down: 0Bps / 0Bps
|
||||
┌Utilization by process name──────────────────────────────────────────────────────────────────┐┌Utilization by remote address────────────────────────────────────────────────────────────────┐
|
||||
│Process Connections Up / Down ││Remote Address Connections Up / Down │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────────────────┘└─────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
┌Utilization by connection───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
│Connection Process Up / Down │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ │
|
||||
│ │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables.
|
||||
|
||||
|
||||
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
|
||||
│ ││ │
|
||||
│ ││ │
|
||||
└─────────────────────────────────────────────────────────────────────────────────────────────┘└─────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
Press <SPACE> to pause (DNS queries hidden).
|
||||
Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
|
||||
|
||||
|
||||
@@ -91,6 +91,58 @@ fn pause_by_space() {
|
||||
assert_snapshot!(&terminal_draw_events_mirror[2]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rearranged_by_tab() {
|
||||
let network_frames = vec![NetworkFrames::new(vec![
|
||||
Some(build_tcp_packet(
|
||||
"1.1.1.1",
|
||||
"10.0.0.2",
|
||||
12345,
|
||||
443,
|
||||
b"I have come from 1.1.1.1",
|
||||
)),
|
||||
None, // sleep
|
||||
None, // sleep
|
||||
None, // sleep
|
||||
Some(build_tcp_packet(
|
||||
"1.1.1.1",
|
||||
"10.0.0.2",
|
||||
12345,
|
||||
443,
|
||||
b"Same here, but one second later",
|
||||
)),
|
||||
]) as Box<dyn DataLinkReceiver>];
|
||||
|
||||
// sleep for 1s, then press tab, sleep for 2s, then quit
|
||||
let mut events: Vec<Option<Event>> = iter::repeat(None).take(1).collect();
|
||||
events.push(None);
|
||||
events.push(Some(Event::Key(Key::Char('\t'))));
|
||||
events.push(None);
|
||||
events.push(None);
|
||||
events.push(Some(Event::Key(Key::Ctrl('c'))));
|
||||
|
||||
let events = Box::new(KeyboardEvents::new(events));
|
||||
let os_input = os_input_output_factory(network_frames, None, None, events);
|
||||
let (terminal_events, terminal_draw_events, backend) = test_backend_factory(190, 50);
|
||||
let opts = opts_ui();
|
||||
start(backend, os_input, opts);
|
||||
let terminal_draw_events_mirror = terminal_draw_events.lock().unwrap();
|
||||
let expected_terminal_events = vec![
|
||||
Clear, HideCursor, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Draw, Flush, Clear,
|
||||
ShowCursor,
|
||||
];
|
||||
assert_eq!(
|
||||
&terminal_events.lock().unwrap()[..],
|
||||
&expected_terminal_events[..]
|
||||
);
|
||||
assert_eq!(terminal_draw_events_mirror.len(), 5);
|
||||
assert_snapshot!(&terminal_draw_events_mirror[0]);
|
||||
assert_snapshot!(&terminal_draw_events_mirror[1]);
|
||||
assert_snapshot!(&terminal_draw_events_mirror[2]);
|
||||
assert_snapshot!(&terminal_draw_events_mirror[3]);
|
||||
assert_snapshot!(&terminal_draw_events_mirror[4]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn basic_only_processes() {
|
||||
let network_frames = vec![NetworkFrames::new(vec![
|
||||
@@ -1458,3 +1510,105 @@ fn layout_under_120_width_under_30_height() {
|
||||
assert_snapshot!(&terminal_draw_events_mirror[0]);
|
||||
assert_snapshot!(&terminal_draw_events_mirror[1]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn layout_under_50_width_under_50_height() {
|
||||
let network_frames = vec![NetworkFrames::new(vec![
|
||||
Some(build_tcp_packet(
|
||||
"1.1.1.1",
|
||||
"10.0.0.2",
|
||||
12345,
|
||||
443,
|
||||
b"I have come from 1.1.1.1",
|
||||
)),
|
||||
Some(build_tcp_packet(
|
||||
"3.3.3.3",
|
||||
"10.0.0.2",
|
||||
1337,
|
||||
4435,
|
||||
b"Greetings traveller, I'm from 3.3.3.3",
|
||||
)),
|
||||
Some(build_tcp_packet(
|
||||
"2.2.2.2",
|
||||
"10.0.0.2",
|
||||
54321,
|
||||
4434,
|
||||
b"You know, 2.2.2.2 is really nice!",
|
||||
)),
|
||||
Some(build_tcp_packet(
|
||||
"4.4.4.4",
|
||||
"10.0.0.2",
|
||||
1337,
|
||||
4432,
|
||||
b"I'm partial to 4.4.4.4",
|
||||
)),
|
||||
]) as Box<dyn DataLinkReceiver>];
|
||||
let (terminal_events, terminal_draw_events, backend) = test_backend_factory(49, 49);
|
||||
let os_input = os_input_output(network_frames, 2);
|
||||
let opts = opts_ui();
|
||||
start(backend, os_input, opts);
|
||||
let terminal_draw_events_mirror = terminal_draw_events.lock().unwrap();
|
||||
|
||||
let expected_terminal_events = vec![
|
||||
Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor,
|
||||
];
|
||||
assert_eq!(
|
||||
&terminal_events.lock().unwrap()[..],
|
||||
&expected_terminal_events[..]
|
||||
);
|
||||
|
||||
assert_eq!(terminal_draw_events_mirror.len(), 2);
|
||||
assert_snapshot!(&terminal_draw_events_mirror[0]);
|
||||
assert_snapshot!(&terminal_draw_events_mirror[1]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn layout_under_70_width_under_30_height() {
|
||||
let network_frames = vec![NetworkFrames::new(vec![
|
||||
Some(build_tcp_packet(
|
||||
"1.1.1.1",
|
||||
"10.0.0.2",
|
||||
12345,
|
||||
443,
|
||||
b"I have come from 1.1.1.1",
|
||||
)),
|
||||
Some(build_tcp_packet(
|
||||
"3.3.3.3",
|
||||
"10.0.0.2",
|
||||
1337,
|
||||
4435,
|
||||
b"Greetings traveller, I'm from 3.3.3.3",
|
||||
)),
|
||||
Some(build_tcp_packet(
|
||||
"2.2.2.2",
|
||||
"10.0.0.2",
|
||||
54321,
|
||||
4434,
|
||||
b"You know, 2.2.2.2 is really nice!",
|
||||
)),
|
||||
Some(build_tcp_packet(
|
||||
"4.4.4.4",
|
||||
"10.0.0.2",
|
||||
1337,
|
||||
4432,
|
||||
b"I'm partial to 4.4.4.4",
|
||||
)),
|
||||
]) as Box<dyn DataLinkReceiver>];
|
||||
let (terminal_events, terminal_draw_events, backend) = test_backend_factory(69, 29);
|
||||
let os_input = os_input_output(network_frames, 2);
|
||||
let opts = opts_ui();
|
||||
start(backend, os_input, opts);
|
||||
let terminal_draw_events_mirror = terminal_draw_events.lock().unwrap();
|
||||
|
||||
let expected_terminal_events = vec![
|
||||
Clear, HideCursor, Draw, Flush, Draw, Flush, Clear, ShowCursor,
|
||||
];
|
||||
assert_eq!(
|
||||
&terminal_events.lock().unwrap()[..],
|
||||
&expected_terminal_events[..]
|
||||
);
|
||||
|
||||
assert_eq!(terminal_draw_events_mirror.len(), 2);
|
||||
assert_snapshot!(&terminal_draw_events_mirror[0]);
|
||||
assert_snapshot!(&terminal_draw_events_mirror[1]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user