local_revision_test.rs 8.8 KB

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