Skip to content

Commit cd6337e

Browse files
Ian Douglas Scottids1024
authored andcommitted
tests: Add test for error when server ring buffer is full
Should only one error be returned here (on both backends)? For now, check for both connection reset and broken pipe errors. When we add a way to set the buffer size, we can have more tests here, to verify first that an error occurs without increasing the buffer size, then that it works without error after increasing the size as needed.
1 parent 4b06289 commit cd6337e

2 files changed

Lines changed: 113 additions & 0 deletions

File tree

wayland-tests/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,6 @@ name = "server_resources"
7474

7575
[[test]]
7676
name = "xdg_shell_ping"
77+
78+
[[test]]
79+
name = "buffer_size"

wayland-tests/tests/buffer_size.rs

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
use std::io::ErrorKind;
2+
3+
#[macro_use]
4+
mod helpers;
5+
6+
use helpers::*;
7+
8+
#[test]
9+
fn buffer_size() {
10+
let mut server = TestServer::new();
11+
server
12+
.display
13+
.handle()
14+
.create_global::<ServerHandler, ways::protocol::wl_seat::WlSeat, _>(1, ());
15+
16+
let (_, mut client) = server.add_client();
17+
let mut client_ddata = ClientHandler { globals: globals::GlobalList::new() };
18+
19+
let registry = client.display.get_registry(&client.event_queue.handle(), ());
20+
21+
let mut server_handler = ServerHandler::default();
22+
23+
roundtrip(&mut client, &mut server, &mut client_ddata, &mut server_handler).unwrap();
24+
25+
let seat = client_ddata
26+
.globals
27+
.bind::<wayc::protocol::wl_seat::WlSeat, _, _>(
28+
&client.event_queue.handle(),
29+
&registry,
30+
1..2,
31+
(),
32+
)
33+
.unwrap();
34+
35+
let _pointer = seat.get_pointer(&client.event_queue.handle(), ());
36+
37+
roundtrip(&mut client, &mut server, &mut client_ddata, &mut server_handler).unwrap();
38+
39+
// Send too many Wayland events to buffer
40+
let server_pointer = server_handler.pointer.as_ref().unwrap().clone();
41+
for _ in 0..10_000 {
42+
server_pointer.motion(0, 0., 0.);
43+
}
44+
45+
// Verify we get `ConnectionReset` or `BrokenPipe` error
46+
// TODO: Why do we get one with one backend, and the other with the other backend?
47+
let res = roundtrip(&mut client, &mut server, &mut client_ddata, &mut server_handler);
48+
assert!(res.is_err());
49+
let err = res.unwrap_err();
50+
assert!(matches!(err, wayc::backend::WaylandError::Io(_)));
51+
if let wayc::backend::WaylandError::Io(err) = err {
52+
assert!(matches!(err.kind(), ErrorKind::ConnectionReset | ErrorKind::BrokenPipe));
53+
}
54+
}
55+
56+
/*
57+
* Client handler
58+
*/
59+
60+
struct ClientHandler {
61+
globals: globals::GlobalList,
62+
}
63+
64+
impl AsMut<globals::GlobalList> for ClientHandler {
65+
fn as_mut(&mut self) -> &mut globals::GlobalList {
66+
&mut self.globals
67+
}
68+
}
69+
70+
wayc::delegate_dispatch!(ClientHandler:
71+
[wayc::protocol::wl_registry::WlRegistry: ()] => globals::GlobalList
72+
);
73+
74+
client_ignore_impl!(ClientHandler => [
75+
wayc::protocol::wl_seat::WlSeat,
76+
wayc::protocol::wl_pointer::WlPointer,
77+
wayc::protocol::wl_keyboard::WlKeyboard
78+
]);
79+
80+
/*
81+
* Server handler
82+
*/
83+
84+
#[derive(Default)]
85+
struct ServerHandler {
86+
pointer: Option<ways::protocol::wl_pointer::WlPointer>,
87+
}
88+
89+
server_ignore_impl!(ServerHandler => [ways::protocol::wl_pointer::WlPointer]);
90+
91+
server_ignore_global_impl!(ServerHandler => [ways::protocol::wl_seat::WlSeat]);
92+
93+
impl ways::Dispatch<ways::protocol::wl_seat::WlSeat, ()> for ServerHandler {
94+
fn request(
95+
server_handler: &mut ServerHandler,
96+
_: &ways::Client,
97+
_: &ways::protocol::wl_seat::WlSeat,
98+
request: ways::protocol::wl_seat::Request,
99+
_: &(),
100+
_: &ways::DisplayHandle,
101+
data_init: &mut ways::DataInit<'_, ServerHandler>,
102+
) {
103+
match request {
104+
ways::protocol::wl_seat::Request::GetPointer { id } => {
105+
server_handler.pointer = Some(data_init.init(id, ()));
106+
}
107+
_ => unreachable!(),
108+
}
109+
}
110+
}

0 commit comments

Comments
 (0)