PageRenderTime 33ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/twisted.rs

https://gitlab.com/unlambda/amp-rs
Rust | 262 lines | 220 code | 42 blank | 0 comment | 3 complexity | 0183a430b10e4cfc1d4fb0e27435846e MD5 | raw file
  1. #![feature(custom_derive, plugin)]
  2. #![plugin(serde_macros)]
  3. extern crate serde;
  4. #[macro_use]
  5. extern crate amp;
  6. use std::cell::Cell;
  7. use std::io::BufReader;
  8. use std::io::prelude::*;
  9. use std::net::{TcpStream, TcpListener};
  10. use std::process::{Command, Stdio};
  11. use amp::protocol::SyncEndpoint;
  12. struct TestProcess(std::process::Child);
  13. impl TestProcess {
  14. fn new(test_name: &str) -> Self {
  15. TestProcess(Command::new("python")
  16. .arg("tests/twisty.py")
  17. .arg(test_name)
  18. .stdin(Stdio::piped())
  19. .stdout(Stdio::piped())
  20. .stderr(Stdio::inherit())
  21. .spawn()
  22. .unwrap())
  23. }
  24. fn writer(&mut self) -> &mut std::process::ChildStdin {
  25. self.0.stdin.as_mut().unwrap()
  26. }
  27. fn reader(&mut self) -> &mut std::process::ChildStdout {
  28. self.0.stdout.as_mut().unwrap()
  29. }
  30. }
  31. impl Drop for TestProcess {
  32. fn drop(&mut self) {
  33. self.0.stdin = None;
  34. let status = self.0.wait().unwrap();
  35. assert!(status.success());
  36. }
  37. }
  38. #[test]
  39. fn serialize_struct() {
  40. #[derive(Serialize, Deserialize)]
  41. struct Point {
  42. x: i32,
  43. y: i32,
  44. }
  45. let mut process = TestProcess::new("serialize_struct");
  46. amp::serde::to_writer(process.writer(), &Point { x: 5, y: 10 }).unwrap();
  47. }
  48. #[test]
  49. fn serialize_list() {
  50. let mut process = TestProcess::new("serialize_list");
  51. amp::serde::to_writer(process.writer(), &[1.1, 2.2, 3.3, 4.4, 5.5])
  52. .unwrap();
  53. }
  54. #[test]
  55. fn serialize_nested() {
  56. #[derive(Serialize)]
  57. struct Inner {
  58. foo: i32,
  59. bar: i64,
  60. }
  61. #[derive(Serialize)]
  62. struct Outer {
  63. inner: Vec<Inner>,
  64. }
  65. #[derive(Serialize)]
  66. struct Nest {
  67. lists: Vec<Vec<&'static str>>,
  68. structs: Vec<Inner>,
  69. outer: Vec<Outer>,
  70. }
  71. let nest = Nest {
  72. lists: vec![vec!["foo", "bar", "baz"],
  73. vec!["lorem", "ipsum", "dolor"],
  74. vec!["prisencolinensinainciusol", "alright!"]],
  75. structs: vec![Inner { foo: 2, bar: 123 }],
  76. outer: vec![Outer { inner: vec![] },
  77. Outer {
  78. inner: vec![Inner {
  79. foo: 867,
  80. bar: 5309,
  81. },
  82. Inner {
  83. foo: 555,
  84. bar: 1212,
  85. }],
  86. }],
  87. };
  88. let nest2 = Nest {
  89. lists: vec![],
  90. structs: vec![],
  91. outer: vec![],
  92. };
  93. let mut process = TestProcess::new("serialize_nested");
  94. amp::serde::to_writer(process.writer(), &nest).unwrap();
  95. amp::serde::to_writer(process.writer(), &nest2).unwrap();
  96. }
  97. #[test]
  98. fn deserialize_struct() {
  99. #[derive(Deserialize, PartialEq, Eq, Debug)]
  100. struct Test {
  101. s: String,
  102. b: serde::bytes::ByteBuf,
  103. }
  104. let mut process = TestProcess::new("deserialize_struct");
  105. let s: Test = amp::serde::from_reader(process.reader()).unwrap();
  106. assert_eq!(s,
  107. Test {
  108. s: "λλλ".into(),
  109. b: b"123\x00\xFF".to_vec().into(),
  110. })
  111. }
  112. #[test]
  113. fn deserialize_nested() {
  114. #[derive(Deserialize, PartialEq, Eq, Debug)]
  115. struct Four {
  116. v: Vec<std::collections::HashMap<String, String>>,
  117. }
  118. #[derive(Deserialize, PartialEq, Eq, Debug)]
  119. struct Three {
  120. s: Four,
  121. }
  122. #[derive(Deserialize, PartialEq, Eq, Debug)]
  123. struct Two {
  124. s: Three,
  125. }
  126. #[derive(Deserialize, PartialEq, Eq, Debug)]
  127. struct Nestier {
  128. s: Two,
  129. }
  130. let mut process = TestProcess::new("deserialize_nested");
  131. let s: Nestier = amp::serde::from_reader(process.reader()).unwrap();
  132. let mut hm = std::collections::HashMap::new();
  133. hm.insert("foo".into(), "Bar".into());
  134. hm.insert("baz".into(), "Quux".into());
  135. let hm2 = hm.clone();
  136. assert_eq!(s,
  137. Nestier {
  138. s: Two { s: Three { s: Four { v: vec![hm, hm2] } } },
  139. });
  140. }
  141. command! {
  142. struct Echo {
  143. arguments: EchoArgs { message: String },
  144. response: EchoResponse { message: String },
  145. errors: EchoErrors { ..UNKNOWN }
  146. }
  147. }
  148. command! {
  149. struct Ohce {
  150. arguments: OhceArgs { message: String },
  151. response: OhceResponse { egassem: String },
  152. errors: OhceErrors { ..UNKNOWN }
  153. }
  154. }
  155. command! {
  156. struct Quit {
  157. arguments: QuitArgs {},
  158. response: QuitResponse {},
  159. errors: QuitErrors { ..UNKNOWN }
  160. }
  161. }
  162. #[test]
  163. fn amp_client() {
  164. let mut process = TestProcess::new("amp_server");
  165. process.0.stdin = None;
  166. let mut stdout = process.0.stdout.take().unwrap();
  167. let mut reader = BufReader::new(&mut stdout);
  168. let mut buf = String::new();
  169. let _ = reader.read_line(&mut buf).unwrap();
  170. assert_eq!(buf, "running\n");
  171. let stream = TcpStream::connect("localhost:4242").unwrap();
  172. let mut endpoint = SyncEndpoint::new(stream);
  173. assert_eq!("sesquipedalian", endpoint.call(
  174. Echo,
  175. EchoArgs { message: "sesquipedalian".into() }
  176. ).unwrap().message);
  177. assert_eq!(
  178. "brobdingnagian".chars().rev().collect::<String>(),
  179. endpoint.call(
  180. Ohce,
  181. OhceArgs { message: "brobdingnagian".into() }
  182. ).unwrap().egassem
  183. );
  184. endpoint.call(Quit, QuitArgs {}).unwrap();
  185. }
  186. #[test]
  187. fn amp_server() {
  188. let listener = TcpListener::bind("127.0.0.1:2424").unwrap();
  189. let mut process = TestProcess::new("amp_client");
  190. process.0.stdin = None;
  191. process.0.stdout = None;
  192. let (socket, _addr) = listener.accept().unwrap();
  193. let quit_received = Cell::new(false);
  194. let mut endpoint = SyncEndpoint::new(socket);
  195. endpoint.register(
  196. Echo,
  197. |args: EchoArgs| Ok(EchoResponse { message: args.message })
  198. );
  199. endpoint.register(
  200. Ohce,
  201. |args: OhceArgs| Ok(OhceResponse {
  202. egassem: args.message.chars().rev().collect::<String>()
  203. })
  204. );
  205. endpoint.register(
  206. Quit,
  207. |_: QuitArgs| { quit_received.set(true); Ok(QuitResponse {}) }
  208. );
  209. let mut count = 0;
  210. while !quit_received.get() {
  211. count += 1;
  212. if count > 3 {
  213. panic!("Too many requests without receiving quit!");
  214. }
  215. match endpoint.respond_once() {
  216. Err(e) => panic!("Responding to command failed: {:?}", e),
  217. _ => ()
  218. }
  219. }
  220. }