/
tests.rs
137 lines (112 loc) · 4.34 KB
/
tests.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
use std::{sync::atomic::Ordering, time::Duration};
use pliantdb_core::{
networking::ServerConnection,
schema::Schema,
test_util::{Basic, ConnectionTest, TestDirectory},
};
use pliantdb_server::{
test_util::{basic_server_connection_tests, initialize_basic_server, BASIC_SERVER_NAME},
Server,
};
use url::Url;
use super::*;
use crate::client::RemoteDatabase;
#[tokio::test(flavor = "multi_thread")]
async fn server_connection_tests() -> anyhow::Result<()> {
let directory = TestDirectory::new("client-test");
let server = initialize_basic_server(directory.as_ref()).await?;
let task_server = server.clone();
let server_task = tokio::spawn(async move { task_server.listen_on(5000).await });
tokio::time::sleep(Duration::from_millis(100)).await;
let url = Url::parse(&format!(
"pliantdb://[::1]:5000?server={}",
BASIC_SERVER_NAME
))?;
let client_task_is_running = {
let client = Client::new(&url, Some(server.certificate().await?)).await?;
let client_task_is_running = client.background_task_running.clone();
assert!(client_task_is_running.load(Ordering::Acquire));
basic_server_connection_tests(client).await?;
server.shutdown(None).await?;
server_task.await??;
client_task_is_running
};
tokio::time::sleep(Duration::from_millis(1000)).await;
assert!(!client_task_is_running.load(Ordering::Acquire));
Ok(())
}
#[cfg(feature = "websockets")]
mod websockets {
use super::*;
struct WebsocketTestHarness {
_server: Server,
_directory: TestDirectory,
db: RemoteDatabase<Basic>,
}
impl WebsocketTestHarness {
pub async fn new(test: ConnectionTest) -> anyhow::Result<Self> {
let directory = TestDirectory::new(format!("websocket-server-{}", test));
let server = initialize_basic_server(directory.as_ref()).await?;
let task_server = server.clone();
tokio::spawn(async move {
task_server
.listen_for_websockets_on(&format!("localhost:{}", test.port(6000)))
.await
.unwrap();
println!("Test websocket server shut down.");
});
tokio::time::sleep(Duration::from_millis(100)).await;
let url = Url::parse(&format!("ws://localhost:{}", test.port(6000)))?;
let client = Client::new(&url, None).await?;
client
.create_database(&test.to_string(), Basic::schema_id())
.await?;
let db = client.database::<Basic>(&test.to_string()).await;
Ok(Self {
db,
_server: server,
_directory: directory,
})
}
pub async fn connect<'a, 'b>(&'a self) -> anyhow::Result<RemoteDatabase<Basic>> {
Ok(self.db.clone())
}
}
pliantdb_core::define_connection_test_suite!(WebsocketTestHarness);
}
mod pliant {
use super::*;
struct PliantTestHarness {
_server: Server,
_directory: TestDirectory,
db: RemoteDatabase<Basic>,
}
impl PliantTestHarness {
pub async fn new(test: ConnectionTest) -> anyhow::Result<Self> {
let directory = TestDirectory::new(format!("pliant-server-{}", test));
let server = initialize_basic_server(directory.as_ref()).await?;
let task_server = server.clone();
tokio::spawn(async move { task_server.listen_on(test.port(5001)).await });
tokio::time::sleep(Duration::from_millis(100)).await;
let url = Url::parse(&format!(
"pliantdb://localhost:{}?server={}",
test.port(5001),
BASIC_SERVER_NAME
))?;
let client = Client::new(&url, Some(server.certificate().await?)).await?;
client
.create_database(&test.to_string(), Basic::schema_id())
.await?;
let db = client.database::<Basic>(&test.to_string()).await;
Ok(Self {
db,
_server: server,
_directory: directory,
})
}
pub async fn connect<'a, 'b>(&'a self) -> anyhow::Result<RemoteDatabase<Basic>> {
Ok(self.db.clone())
}
}
pliantdb_core::define_connection_test_suite!(PliantTestHarness);
}