forked from lavina/lavina
93 lines
3.2 KiB
Rust
93 lines
3.2 KiB
Rust
|
use std::time::Duration;
|
||
|
|
||
|
use anyhow::Result;
|
||
|
use lavina_core::repo::{Storage, StorageConfig};
|
||
|
use lavina_core::{player::PlayerRegistry, room::RoomRegistry};
|
||
|
use projection_irc::{launch, read_irc_message, ServerConfig};
|
||
|
use prometheus::Registry as MetricsRegistry;
|
||
|
use tokio::io::{AsyncBufReadExt, AsyncReadExt, AsyncWriteExt, BufReader};
|
||
|
use tokio::net::tcp::{ReadHalf, WriteHalf};
|
||
|
use tokio::net::TcpStream;
|
||
|
|
||
|
struct TestScope<'a> {
|
||
|
reader: BufReader<ReadHalf<'a>>,
|
||
|
writer: WriteHalf<'a>,
|
||
|
buffer: Vec<u8>,
|
||
|
pub timeout: Duration,
|
||
|
}
|
||
|
|
||
|
impl<'a> TestScope<'a> {
|
||
|
fn new(stream: &mut TcpStream) -> TestScope<'_> {
|
||
|
let (reader, writer) = stream.split();
|
||
|
let reader = BufReader::new(reader);
|
||
|
TestScope {
|
||
|
reader,
|
||
|
writer,
|
||
|
buffer: vec![],
|
||
|
timeout: Duration::from_millis(100),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async fn send(&mut self, str: &(impl AsRef<str> + ?Sized)) -> Result<()> {
|
||
|
self.writer.write_all(str.as_ref().as_bytes()).await?;
|
||
|
self.writer.write_all(b"\r\n").await?;
|
||
|
self.writer.flush().await?;
|
||
|
Ok(())
|
||
|
}
|
||
|
|
||
|
async fn expect(&mut self, str: &str) -> Result<()> {
|
||
|
let len = tokio::time::timeout(self.timeout, read_irc_message(&mut self.reader, &mut self.buffer)).await??;
|
||
|
assert_eq!(std::str::from_utf8(&self.buffer[..len - 2])?, str);
|
||
|
self.buffer.clear();
|
||
|
Ok(())
|
||
|
}
|
||
|
|
||
|
async fn assert(&mut self, f: impl FnOnce(&str) -> Result<()>) -> Result<()> {
|
||
|
let len = tokio::time::timeout(self.timeout, read_irc_message(&mut self.reader, &mut self.buffer)).await??;
|
||
|
let res = f(std::str::from_utf8(&self.buffer[..len - 2])?);
|
||
|
self.buffer.clear();
|
||
|
res
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[tokio::test]
|
||
|
async fn scenario_basic() -> Result<()> {
|
||
|
let config = ServerConfig {
|
||
|
listen_on: "127.0.0.1:0".parse().unwrap(),
|
||
|
server_name: "testserver".into(),
|
||
|
};
|
||
|
let mut metrics = MetricsRegistry::new();
|
||
|
let mut storage = Storage::open(StorageConfig {
|
||
|
db_path: ":memory:".into(),
|
||
|
})
|
||
|
.await?;
|
||
|
let rooms = RoomRegistry::new(&mut metrics, storage.clone()).unwrap();
|
||
|
let players = PlayerRegistry::empty(rooms.clone(), &mut metrics).unwrap();
|
||
|
let server = launch(config, players, rooms, metrics, storage.clone()).await.unwrap();
|
||
|
|
||
|
// test scenario
|
||
|
|
||
|
storage.create_user("tester").await?;
|
||
|
storage.set_password("tester", "password").await?;
|
||
|
|
||
|
let mut stream = TcpStream::connect(server.addr).await?;
|
||
|
let mut s = TestScope::new(&mut stream);
|
||
|
|
||
|
s.expect(":testserver NOTICE * :Welcome to my server!").await?;
|
||
|
s.send("PASS password").await?;
|
||
|
s.send("NICK tester").await?;
|
||
|
s.send("USER UserName 0 * :Real Name").await?;
|
||
|
s.expect(":testserver 001 tester :Welcome to Kek Server").await?;
|
||
|
s.expect(":testserver 002 tester :Welcome to Kek Server").await?;
|
||
|
s.expect(":testserver 003 tester :Welcome to Kek Server").await?;
|
||
|
s.expect(":testserver 004 tester testserver kek-0.1.alpha.3 r CFILPQbcefgijklmnopqrstvz").await?;
|
||
|
s.expect(":testserver 005 tester CHANTYPES=# :are supported by this server").await?;
|
||
|
|
||
|
stream.shutdown().await?;
|
||
|
|
||
|
// wrap up
|
||
|
|
||
|
server.terminate().await.unwrap();
|
||
|
Ok(())
|
||
|
}
|