helper.rs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. use crate::helper::TestServer;
  2. use flowy_ws::{WsController, WsSender, WsState};
  3. use parking_lot::RwLock;
  4. use std::sync::Arc;
  5. pub struct WsTest {
  6. server: TestServer,
  7. ws_controller: Arc<RwLock<WsController>>,
  8. }
  9. #[derive(Clone)]
  10. pub enum WsScript {
  11. SendText(&'static str),
  12. SendBinary(Vec<u8>),
  13. Disconnect(&'static str),
  14. }
  15. impl WsTest {
  16. pub async fn new(scripts: Vec<WsScript>) -> Self {
  17. let server = TestServer::new().await;
  18. let ws_controller = Arc::new(RwLock::new(WsController::new()));
  19. ws_controller
  20. .write()
  21. .state_callback(move |state| match state {
  22. WsState::Connected(sender) => {
  23. WsScriptRunner {
  24. scripts: scripts.clone(),
  25. sender: sender.clone(),
  26. source: "editor".to_owned(),
  27. }
  28. .run();
  29. },
  30. _ => {},
  31. })
  32. .await;
  33. Self {
  34. server,
  35. ws_controller,
  36. }
  37. }
  38. pub async fn run_scripts(&mut self) {
  39. let addr = self.server.ws_addr();
  40. self.ws_controller.write().connect(addr).unwrap().await;
  41. }
  42. }
  43. struct WsScriptRunner {
  44. scripts: Vec<WsScript>,
  45. sender: Arc<WsSender>,
  46. source: String,
  47. }
  48. impl WsScriptRunner {
  49. fn run(self) {
  50. for script in self.scripts {
  51. match script {
  52. WsScript::SendText(text) => {
  53. self.sender.send_text(&self.source, text).unwrap();
  54. },
  55. WsScript::SendBinary(bytes) => {
  56. self.sender.send_binary(&self.source, bytes).unwrap();
  57. },
  58. WsScript::Disconnect(reason) => {
  59. self.sender.send_disconnect(reason).unwrap();
  60. },
  61. }
  62. }
  63. }
  64. }