local_revision_test.rs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. use crate::revision_test::script::{RevisionScript::*, RevisionTest};
  2. #[tokio::test]
  3. async fn revision_sync_test() {
  4. let test = RevisionTest::new().await;
  5. let (base_rev_id, rev_id) = test.next_rev_id_pair();
  6. test.run_script(AddLocalRevision {
  7. content: "123".to_string(),
  8. base_rev_id,
  9. rev_id,
  10. })
  11. .await;
  12. test.run_script(AssertNextSyncRevisionId { rev_id: Some(rev_id) }).await;
  13. test.run_script(AckRevision { rev_id }).await;
  14. test.run_script(AssertNextSyncRevisionId { rev_id: None }).await;
  15. }
  16. #[tokio::test]
  17. async fn revision_compress_2_revisions_with_2_threshold_test() {
  18. let test = RevisionTest::new_with_configuration(2).await;
  19. test.run_script(AddLocalRevision2 {
  20. content: "123".to_string(),
  21. pair_rev_id: test.next_rev_id_pair(),
  22. })
  23. .await;
  24. test.run_script(AddLocalRevision2 {
  25. content: "456".to_string(),
  26. pair_rev_id: test.next_rev_id_pair(),
  27. })
  28. .await;
  29. test.run_scripts(vec![
  30. AssertNextSyncRevisionId { rev_id: Some(1) },
  31. AckRevision { rev_id: 1 },
  32. AssertNextSyncRevisionId { rev_id: None },
  33. ])
  34. .await;
  35. }
  36. #[tokio::test]
  37. async fn revision_compress_4_revisions_with_threshold_2_test() {
  38. let test = RevisionTest::new_with_configuration(2).await;
  39. let (base_rev_id, rev_id_1) = test.next_rev_id_pair();
  40. test.run_script(AddLocalRevision {
  41. content: "1".to_string(),
  42. base_rev_id,
  43. rev_id: rev_id_1,
  44. })
  45. .await;
  46. let (base_rev_id, rev_id_2) = test.next_rev_id_pair();
  47. test.run_script(AddLocalRevision {
  48. content: "2".to_string(),
  49. base_rev_id,
  50. rev_id: rev_id_2,
  51. })
  52. .await;
  53. let (base_rev_id, rev_id_3) = test.next_rev_id_pair();
  54. test.run_script(AddLocalRevision {
  55. content: "3".to_string(),
  56. base_rev_id,
  57. rev_id: rev_id_3,
  58. })
  59. .await;
  60. let (base_rev_id, rev_id_4) = test.next_rev_id_pair();
  61. test.run_script(AddLocalRevision {
  62. content: "4".to_string(),
  63. base_rev_id,
  64. rev_id: rev_id_4,
  65. })
  66. .await;
  67. // rev_id_2,rev_id_3,rev_id4 will be merged into rev_id_1
  68. test.run_scripts(vec![
  69. AssertNumberOfSyncRevisions { num: 2 },
  70. AssertNextSyncRevisionId { rev_id: Some(rev_id_1) },
  71. AssertNextSyncRevisionContent {
  72. expected: "12".to_string(),
  73. },
  74. AckRevision { rev_id: rev_id_1 },
  75. AssertNextSyncRevisionId { rev_id: Some(rev_id_2) },
  76. AssertNextSyncRevisionContent {
  77. expected: "34".to_string(),
  78. },
  79. ])
  80. .await;
  81. }
  82. #[tokio::test]
  83. async fn revision_compress_8_revisions_with_threshold_4_test() {
  84. let test = RevisionTest::new_with_configuration(4).await;
  85. let (base_rev_id, rev_id_1) = test.next_rev_id_pair();
  86. test.run_script(AddLocalRevision {
  87. content: "1".to_string(),
  88. base_rev_id,
  89. rev_id: rev_id_1,
  90. })
  91. .await;
  92. let (base_rev_id, rev_id_2) = test.next_rev_id_pair();
  93. test.run_script(AddLocalRevision {
  94. content: "2".to_string(),
  95. base_rev_id,
  96. rev_id: rev_id_2,
  97. })
  98. .await;
  99. let (base_rev_id, rev_id_3) = test.next_rev_id_pair();
  100. test.run_script(AddLocalRevision {
  101. content: "3".to_string(),
  102. base_rev_id,
  103. rev_id: rev_id_3,
  104. })
  105. .await;
  106. let (base_rev_id, rev_id_4) = test.next_rev_id_pair();
  107. test.run_script(AddLocalRevision {
  108. content: "4".to_string(),
  109. base_rev_id,
  110. rev_id: rev_id_4,
  111. })
  112. .await;
  113. let (base_rev_id, rev_id_a) = test.next_rev_id_pair();
  114. test.run_script(AddLocalRevision {
  115. content: "a".to_string(),
  116. base_rev_id,
  117. rev_id: rev_id_a,
  118. })
  119. .await;
  120. let (base_rev_id, rev_id_b) = test.next_rev_id_pair();
  121. test.run_script(AddLocalRevision {
  122. content: "b".to_string(),
  123. base_rev_id,
  124. rev_id: rev_id_b,
  125. })
  126. .await;
  127. let (base_rev_id, rev_id_c) = test.next_rev_id_pair();
  128. test.run_script(AddLocalRevision {
  129. content: "c".to_string(),
  130. base_rev_id,
  131. rev_id: rev_id_c,
  132. })
  133. .await;
  134. let (base_rev_id, rev_id_d) = test.next_rev_id_pair();
  135. test.run_script(AddLocalRevision {
  136. content: "d".to_string(),
  137. base_rev_id,
  138. rev_id: rev_id_d,
  139. })
  140. .await;
  141. test.run_scripts(vec![
  142. AssertNumberOfSyncRevisions { num: 2 },
  143. AssertNextSyncRevisionId { rev_id: Some(rev_id_1) },
  144. AssertNextSyncRevisionContent {
  145. expected: "1234".to_string(),
  146. },
  147. AckRevision { rev_id: rev_id_1 },
  148. AssertNextSyncRevisionId { rev_id: Some(rev_id_a) },
  149. AssertNextSyncRevisionContent {
  150. expected: "abcd".to_string(),
  151. },
  152. AckRevision { rev_id: rev_id_a },
  153. AssertNextSyncRevisionId { rev_id: None },
  154. ])
  155. .await;
  156. }
  157. #[tokio::test]
  158. async fn revision_merge_per_5_revision_test() {
  159. let test = RevisionTest::new_with_configuration(5).await;
  160. for i in 0..20 {
  161. let content = format!("{}", i);
  162. let (base_rev_id, rev_id) = test.next_rev_id_pair();
  163. test.run_script(AddLocalRevision {
  164. content,
  165. base_rev_id,
  166. rev_id,
  167. })
  168. .await;
  169. }
  170. test.run_scripts(vec![
  171. AssertNumberOfSyncRevisions { num: 4 },
  172. AssertNextSyncRevisionContent {
  173. expected: "01234".to_string(),
  174. },
  175. AckRevision { rev_id: 1 },
  176. AssertNextSyncRevisionContent {
  177. expected: "56789".to_string(),
  178. },
  179. AckRevision { rev_id: 2 },
  180. AssertNextSyncRevisionContent {
  181. expected: "1011121314".to_string(),
  182. },
  183. AckRevision { rev_id: 3 },
  184. AssertNextSyncRevisionContent {
  185. expected: "1516171819".to_string(),
  186. },
  187. AckRevision { rev_id: 4 },
  188. AssertNextSyncRevisionId { rev_id: None },
  189. ])
  190. .await;
  191. }
  192. #[tokio::test]
  193. async fn revision_merge_per_100_revision_test() {
  194. let test = RevisionTest::new_with_configuration(100).await;
  195. for i in 0..1000 {
  196. let content = format!("{}", i);
  197. let (base_rev_id, rev_id) = test.next_rev_id_pair();
  198. test.run_script(AddLocalRevision {
  199. content,
  200. base_rev_id,
  201. rev_id,
  202. })
  203. .await;
  204. }
  205. test.run_scripts(vec![AssertNumberOfSyncRevisions { num: 10 }]).await;
  206. }
  207. #[tokio::test]
  208. async fn revision_merge_per_100_revision_test2() {
  209. let test = RevisionTest::new_with_configuration(100).await;
  210. for i in 0..50 {
  211. let (base_rev_id, rev_id) = test.next_rev_id_pair();
  212. test.run_script(AddLocalRevision {
  213. content: format!("{}", i),
  214. base_rev_id,
  215. rev_id,
  216. })
  217. .await;
  218. }
  219. test.run_scripts(vec![AssertNumberOfSyncRevisions { num: 50 }]).await;
  220. }
  221. #[tokio::test]
  222. async fn revision_merge_per_1000_revision_test() {
  223. let test = RevisionTest::new_with_configuration(1000).await;
  224. for i in 0..100000 {
  225. let (base_rev_id, rev_id) = test.next_rev_id_pair();
  226. test.run_script(AddLocalRevision {
  227. content: format!("{}", i),
  228. base_rev_id,
  229. rev_id,
  230. })
  231. .await;
  232. }
  233. test.run_scripts(vec![AssertNumberOfSyncRevisions { num: 100 }]).await;
  234. }
  235. #[tokio::test]
  236. async fn revision_compress_revision_test() {
  237. let test = RevisionTest::new_with_configuration(2).await;
  238. test.run_scripts(vec![
  239. AddLocalRevision2 {
  240. content: "1".to_string(),
  241. pair_rev_id: test.next_rev_id_pair(),
  242. },
  243. AddLocalRevision2 {
  244. content: "2".to_string(),
  245. pair_rev_id: test.next_rev_id_pair(),
  246. },
  247. AddLocalRevision2 {
  248. content: "3".to_string(),
  249. pair_rev_id: test.next_rev_id_pair(),
  250. },
  251. AddLocalRevision2 {
  252. content: "4".to_string(),
  253. pair_rev_id: test.next_rev_id_pair(),
  254. },
  255. AssertNumberOfSyncRevisions { num: 2 },
  256. ])
  257. .await;
  258. }
  259. #[tokio::test]
  260. async fn revision_compress_revision_while_recv_ack_test() {
  261. let test = RevisionTest::new_with_configuration(2).await;
  262. test.run_scripts(vec![
  263. AddLocalRevision2 {
  264. content: "1".to_string(),
  265. pair_rev_id: test.next_rev_id_pair(),
  266. },
  267. AckRevision { rev_id: 1 },
  268. AddLocalRevision2 {
  269. content: "2".to_string(),
  270. pair_rev_id: test.next_rev_id_pair(),
  271. },
  272. AckRevision { rev_id: 2 },
  273. AddLocalRevision2 {
  274. content: "3".to_string(),
  275. pair_rev_id: test.next_rev_id_pair(),
  276. },
  277. AckRevision { rev_id: 3 },
  278. AddLocalRevision2 {
  279. content: "4".to_string(),
  280. pair_rev_id: test.next_rev_id_pair(),
  281. },
  282. AssertNumberOfSyncRevisions { num: 4 },
  283. ])
  284. .await;
  285. }