Skip to content

Commit c455c1f

Browse files
committed
Test against mock rpc server
1 parent fec725b commit c455c1f

File tree

7 files changed

+82
-289
lines changed

7 files changed

+82
-289
lines changed

burrow-gtk/src/components/app.rs

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use super::*;
22
use anyhow::Context;
33
use std::time::Duration;
44

5-
const RECONNECT_POLL_TIME: Duration = Duration::from_secs(5);
5+
const RECONNECT_POLL_TIME: Duration = Duration::from_secs(3);
66

77
pub struct App {
88
daemon_client: Arc<Mutex<Option<Channel>>>,
@@ -58,7 +58,16 @@ impl AsyncComponent for App {
5858
root: Self::Root,
5959
sender: AsyncComponentSender<Self>,
6060
) -> AsyncComponentParts<Self> {
61-
let daemon_client = Arc::new(Mutex::new(daemon::daemon_connect().await.ok()));
61+
// TODO: RPC REFACTOR (Handle Error)
62+
let mut daemon_client_connected = false;
63+
let daemon_client = Arc::new(Mutex::new(
64+
daemon::daemon_connect()
65+
.await
66+
.inspect(|_| {
67+
daemon_client_connected = true;
68+
})
69+
.ok(),
70+
));
6271

6372
let main_screen = main_screen::MainScreen::builder()
6473
.launch(main_screen::MainScreenInit {
@@ -72,6 +81,17 @@ impl AsyncComponent for App {
7281
})
7382
.forward(sender.input_sender(), |_| AppMsg::None);
7483

84+
if !daemon_client_connected {
85+
main_screen
86+
.sender()
87+
.send(main_screen::MainScreenMsg::DaemonDisconnect)
88+
.unwrap();
89+
settings_screen
90+
.sender()
91+
.send(settings_screen::SettingsScreenMsg::DaemonStateChange)
92+
.unwrap();
93+
}
94+
7595
let widgets = view_output!();
7696

7797
let view_stack = adw::ViewStack::new();
@@ -126,15 +146,20 @@ impl AsyncComponent for App {
126146
let mut daemon_client = self.daemon_client.lock().await;
127147
let mut disconnected_daemon_client = false;
128148

129-
if let Some(daemon_client) = daemon_client.as_mut() {
130-
let mut client = tunnel_client::TunnelClient::new(daemon_client);
131-
if let Err(_e) = client.tunnel_status(burrow_rpc::Empty {}).await {
132-
disconnected_daemon_client = true;
133-
self.main_screen
134-
.emit(main_screen::MainScreenMsg::DaemonDisconnect);
135-
self.settings_screen
136-
.emit(settings_screen::SettingsScreenMsg::DaemonStateChange)
149+
if let Some(client) = daemon_client.as_mut() {
150+
let mut client = tunnel_client::TunnelClient::new(client);
151+
152+
if let Ok(mut res) = client.tunnel_status(burrow_rpc::Empty {}).await {
153+
let stream = res.get_mut();
154+
while let Ok(Some(_)) = stream.message().await {}
137155
}
156+
157+
*daemon_client = None;
158+
disconnected_daemon_client = true;
159+
self.main_screen
160+
.emit(main_screen::MainScreenMsg::DaemonDisconnect);
161+
self.settings_screen
162+
.emit(settings_screen::SettingsScreenMsg::DaemonStateChange)
138163
}
139164

140165
if disconnected_daemon_client || daemon_client.is_none() {

burrow-gtk/src/components/main/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ mod switch;
66

77
pub use network_card::{NetworkCard, NetworkCardInit};
88
pub use networks::{Networks, NetworksInit};
9-
pub use switch::{Switch, SwitchInit, SwitchMsg};
9+
pub use switch::{Switch, SwitchInit};

burrow-gtk/src/components/main/network_card.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,44 +86,41 @@ impl AsyncComponent for NetworkCard {
8686
async fn update(
8787
&mut self,
8888
msg: Self::Input,
89-
sender: AsyncComponentSender<Self>,
89+
_: AsyncComponentSender<Self>,
9090
_root: &Self::Root,
9191
) {
9292
match msg {
9393
NetworkCardMsg::NetworkDelete => {
9494
if let Some(daemon_client) = self.daemon_client.lock().await.as_mut() {
9595
let mut client = networks_client::NetworksClient::new(daemon_client);
96-
client
96+
let _ = client
9797
.network_delete(burrow_rpc::NetworkDeleteRequest { id: self.id })
98-
.await
99-
.unwrap();
98+
.await;
10099
}
101100
}
102101
NetworkCardMsg::MoveUp => {
103102
if self.index.checked_sub(1).is_some() {
104103
if let Some(daemon_client) = self.daemon_client.lock().await.as_mut() {
105104
let mut client = networks_client::NetworksClient::new(daemon_client);
106-
client
105+
let _ = client
107106
.network_reorder(burrow_rpc::NetworkReorderRequest {
108107
id: self.id,
109108
index: self.index as i32 - 1,
110109
})
111-
.await
112-
.unwrap();
110+
.await;
113111
}
114112
}
115113
}
116114
NetworkCardMsg::MoveDown => {
117115
if self.index + 1 < self.index_max {
118116
if let Some(daemon_client) = self.daemon_client.lock().await.as_mut() {
119117
let mut client = networks_client::NetworksClient::new(daemon_client);
120-
client
118+
let _ = client
121119
.network_reorder(burrow_rpc::NetworkReorderRequest {
122120
id: self.id,
123121
index: self.index as i32 + 1,
124122
})
125-
.await
126-
.unwrap();
123+
.await;
127124
}
128125
}
129126
}

burrow-gtk/src/components/main/networks.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ pub struct Networks {
77
daemon_client: Arc<Mutex<Option<Channel>>>,
88
network_cards: Vec<AsyncController<NetworkCard>>,
99
networks_list_box: gtk::ListBox,
10+
11+
_network_state_worker: WorkerController<AsyncNetworkStateHandler>,
1012
}
1113

1214
pub struct NetworksInit {
@@ -94,6 +96,10 @@ impl AsyncComponent for Networks {
9496
daemon_client: init.daemon_client,
9597
network_cards,
9698
networks_list_box: widgets.networks.clone(),
99+
100+
_network_state_worker: AsyncNetworkStateHandler::builder()
101+
.detach_worker(())
102+
.forward(sender.input_sender(), |msg| msg),
97103
};
98104

99105
AsyncComponentParts { model, widgets }
@@ -132,7 +138,7 @@ impl AsyncComponent for Networks {
132138
NetworksMsg::NetworkAdd => {
133139
if let Some(daemon_client) = self.daemon_client.lock().await.as_mut() {
134140
let mut client = networks_client::NetworksClient::new(daemon_client);
135-
client.network_add(burrow_rpc::Empty {}).await.unwrap();
141+
let _ = client.network_add(burrow_rpc::Empty {}).await;
136142
}
137143
}
138144
_ => {}
@@ -147,7 +153,8 @@ impl Worker for AsyncNetworkStateHandler {
147153
type Input = ();
148154
type Output = NetworksMsg;
149155

150-
fn init(_: Self::Init, _sender: ComponentSender<Self>) -> Self {
156+
fn init(_: Self::Init, sender: ComponentSender<Self>) -> Self {
157+
sender.input(());
151158
Self
152159
}
153160

burrow-gtk/src/components/main/switch.rs

Lines changed: 6 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ const RECONNECT_POLL_TIME: Duration = Duration::from_secs(3);
66
pub struct Switch {
77
daemon_client: Arc<Mutex<Option<Channel>>>,
88
switch: gtk::Switch,
9-
switch_screen: gtk::Box,
10-
disconnected_banner: adw::Banner,
119

1210
_tunnel_state_worker: WorkerController<AsyncTunnelStateHandler>,
1311
}
@@ -19,8 +17,6 @@ pub struct SwitchInit {
1917
#[derive(Debug, PartialEq, Eq)]
2018
pub enum SwitchMsg {
2119
None,
22-
DaemonReconnect,
23-
DaemonDisconnect,
2420
Start,
2521
Stop,
2622
SwitchSetStart,
@@ -51,7 +47,6 @@ impl AsyncComponent for Switch {
5147
},
5248
},
5349

54-
#[name(switch_screen)]
5550
gtk::Box {
5651
set_orientation: gtk::Orientation::Vertical,
5752
set_spacing: 10,
@@ -80,37 +75,12 @@ impl AsyncComponent for Switch {
8075
root: Self::Root,
8176
sender: AsyncComponentSender<Self>,
8277
) -> AsyncComponentParts<Self> {
83-
let mut initial_daemon_server_down = false;
84-
85-
if let Some(daemon_client) = init.daemon_client.lock().await.as_mut() {
86-
let mut client = tunnel_client::TunnelClient::new(daemon_client);
87-
if client
88-
.tunnel_status(burrow_rpc::Empty {})
89-
.await
90-
.as_mut()
91-
.is_err()
92-
{
93-
initial_daemon_server_down = true;
94-
}
95-
} else {
96-
initial_daemon_server_down = true;
97-
}
98-
9978
let switch_sender = sender.clone();
10079
let widgets = view_output!();
10180

102-
if initial_daemon_server_down {
103-
*init.daemon_client.lock().await = None;
104-
widgets.switch.set_active(false);
105-
widgets.switch_screen.set_sensitive(false);
106-
widgets.setup_banner.set_revealed(true);
107-
}
108-
10981
let model = Switch {
11082
daemon_client: init.daemon_client,
11183
switch: widgets.switch.clone(),
112-
switch_screen: widgets.switch_screen.clone(),
113-
disconnected_banner: widgets.setup_banner.clone(),
11484
_tunnel_state_worker: AsyncTunnelStateHandler::builder()
11585
.detach_worker(())
11686
.forward(sender.input_sender(), |_| SwitchMsg::None),
@@ -127,20 +97,16 @@ impl AsyncComponent for Switch {
12797
_: AsyncComponentSender<Self>,
12898
_root: &Self::Root,
12999
) {
130-
let mut disconnected_daemon_client = false;
131-
132100
if let Some(daemon_client) = self.daemon_client.lock().await.as_mut() {
133101
let mut client = tunnel_client::TunnelClient::new(daemon_client);
134102
match msg {
135103
Self::Input::Start => {
136-
if let Err(_e) = client.tunnel_start(burrow_rpc::Empty {}).await {
137-
disconnected_daemon_client = true;
138-
}
104+
// TODO: Figure out best way for error handling.
105+
let _ = client.tunnel_start(burrow_rpc::Empty {}).await;
139106
}
140107
Self::Input::Stop => {
141-
if let Err(_e) = client.tunnel_stop(burrow_rpc::Empty {}).await {
142-
disconnected_daemon_client = true;
143-
}
108+
// TODO: Figure out best way for error handling.
109+
let _ = client.tunnel_stop(burrow_rpc::Empty {}).await;
144110
}
145111
Self::Input::SwitchSetStart => {
146112
self.switch.set_active(true);
@@ -150,19 +116,6 @@ impl AsyncComponent for Switch {
150116
}
151117
_ => {}
152118
}
153-
} else {
154-
disconnected_daemon_client = true;
155-
}
156-
157-
if msg == Self::Input::DaemonReconnect {
158-
self.disconnected_banner.set_revealed(false);
159-
self.switch_screen.set_sensitive(true);
160-
}
161-
162-
if disconnected_daemon_client || msg == Self::Input::DaemonDisconnect {
163-
*self.daemon_client.lock().await = None;
164-
self.switch_screen.set_sensitive(false);
165-
self.disconnected_banner.set_revealed(true);
166119
}
167120
}
168121
}
@@ -174,7 +127,8 @@ impl Worker for AsyncTunnelStateHandler {
174127
type Input = ();
175128
type Output = SwitchMsg;
176129

177-
fn init(_: Self::Init, _sender: ComponentSender<Self>) -> Self {
130+
fn init(_: Self::Init, sender: ComponentSender<Self>) -> Self {
131+
sender.input(());
178132
Self
179133
}
180134

burrow-gtk/src/components/main_screen.rs

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
use super::*;
22

33
pub struct MainScreen {
4-
switch: AsyncController<main::Switch>,
5-
networks: AsyncController<main::Networks>,
4+
_switch: AsyncController<main::Switch>,
5+
_networks: AsyncController<main::Networks>,
6+
content_box: gtk::Box,
7+
daemon_status_banner: adw::Banner,
68
}
79

810
pub struct MainScreenInit {
@@ -29,17 +31,17 @@ impl AsyncComponent for MainScreen {
2931
set_valign: Align::Fill,
3032
set_valign: Align::Center,
3133

32-
// gtk::Box {
33-
// set_orientation: gtk::Orientation::Vertical,
34-
// set_spacing: 5,
35-
// set_margin_all: 5,
36-
// set_valign: Align::Start,
34+
gtk::Box {
35+
set_orientation: gtk::Orientation::Vertical,
36+
set_spacing: 5,
37+
set_margin_all: 5,
38+
set_valign: Align::Start,
3739

38-
// #[name(setup_banner)]
39-
// adw::Banner {
40-
// set_title: "Burrow is not running!",
41-
// },
42-
// },
40+
#[name(daemon_status_banner)]
41+
adw::Banner {
42+
set_title: "Burrow is not running!",
43+
},
44+
},
4345

4446
gtk::Box {
4547
set_orientation: gtk::Orientation::Vertical,
@@ -86,7 +88,12 @@ impl AsyncComponent for MainScreen {
8688
widgets.content.append(networks.widget());
8789
widgets.content.append(switch.widget());
8890

89-
let model = MainScreen { switch, networks };
91+
let model = MainScreen {
92+
_switch: switch,
93+
_networks: networks,
94+
content_box: widgets.content.clone(),
95+
daemon_status_banner: widgets.daemon_status_banner.clone(),
96+
};
9097

9198
AsyncComponentParts { model, widgets }
9299
}
@@ -99,10 +106,12 @@ impl AsyncComponent for MainScreen {
99106
) {
100107
match msg {
101108
MainScreenMsg::DaemonDisconnect => {
102-
self.switch.emit(main::SwitchMsg::DaemonDisconnect);
109+
self.daemon_status_banner.set_revealed(true);
110+
self.content_box.set_sensitive(false);
103111
}
104112
MainScreenMsg::DaemonReconnect => {
105-
self.switch.emit(main::SwitchMsg::DaemonReconnect);
113+
self.daemon_status_banner.set_revealed(false);
114+
self.content_box.set_sensitive(true);
106115
}
107116
_ => {}
108117
}

0 commit comments

Comments
 (0)