offline_spec_test.json 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116
  1. {
  2. "Empty queries are resolved if client goes offline": {
  3. "describeName": "Offline:",
  4. "itName": "Empty queries are resolved if client goes offline",
  5. "tags": [],
  6. "config": {
  7. "useGarbageCollection": true
  8. },
  9. "steps": [
  10. {
  11. "userListen": [
  12. 2,
  13. {
  14. "path": "collection",
  15. "filters": [],
  16. "orderBys": []
  17. }
  18. ],
  19. "stateExpect": {
  20. "activeTargets": {
  21. "2": {
  22. "query": {
  23. "path": "collection",
  24. "filters": [],
  25. "orderBys": []
  26. },
  27. "resumeToken": ""
  28. }
  29. }
  30. }
  31. },
  32. {
  33. "watchStreamClose": {
  34. "error": {
  35. "code": 14,
  36. "message": "Simulated Backend Error"
  37. },
  38. "runBackoffTimer": true
  39. }
  40. },
  41. {
  42. "watchStreamClose": {
  43. "error": {
  44. "code": 14,
  45. "message": "Simulated Backend Error"
  46. },
  47. "runBackoffTimer": true
  48. },
  49. "expect": [
  50. {
  51. "query": {
  52. "path": "collection",
  53. "filters": [],
  54. "orderBys": []
  55. },
  56. "errorCode": 0,
  57. "fromCache": true,
  58. "hasPendingWrites": false
  59. }
  60. ]
  61. },
  62. {
  63. "watchStreamClose": {
  64. "error": {
  65. "code": 14,
  66. "message": "Simulated Backend Error"
  67. },
  68. "runBackoffTimer": true
  69. }
  70. },
  71. {
  72. "watchStreamClose": {
  73. "error": {
  74. "code": 14,
  75. "message": "Simulated Backend Error"
  76. },
  77. "runBackoffTimer": true
  78. }
  79. }
  80. ]
  81. },
  82. "A successful message delays offline status": {
  83. "describeName": "Offline:",
  84. "itName": "A successful message delays offline status",
  85. "tags": [],
  86. "config": {
  87. "useGarbageCollection": true
  88. },
  89. "steps": [
  90. {
  91. "userListen": [
  92. 2,
  93. {
  94. "path": "collection",
  95. "filters": [],
  96. "orderBys": []
  97. }
  98. ],
  99. "stateExpect": {
  100. "activeTargets": {
  101. "2": {
  102. "query": {
  103. "path": "collection",
  104. "filters": [],
  105. "orderBys": []
  106. },
  107. "resumeToken": ""
  108. }
  109. }
  110. }
  111. },
  112. {
  113. "watchAck": [
  114. 2
  115. ]
  116. },
  117. {
  118. "watchStreamClose": {
  119. "error": {
  120. "code": 14,
  121. "message": "Simulated Backend Error"
  122. },
  123. "runBackoffTimer": true
  124. }
  125. },
  126. {
  127. "watchStreamClose": {
  128. "error": {
  129. "code": 14,
  130. "message": "Simulated Backend Error"
  131. },
  132. "runBackoffTimer": true
  133. }
  134. },
  135. {
  136. "watchStreamClose": {
  137. "error": {
  138. "code": 14,
  139. "message": "Simulated Backend Error"
  140. },
  141. "runBackoffTimer": true
  142. },
  143. "expect": [
  144. {
  145. "query": {
  146. "path": "collection",
  147. "filters": [],
  148. "orderBys": []
  149. },
  150. "errorCode": 0,
  151. "fromCache": true,
  152. "hasPendingWrites": false
  153. }
  154. ]
  155. },
  156. {
  157. "watchStreamClose": {
  158. "error": {
  159. "code": 14,
  160. "message": "Simulated Backend Error"
  161. },
  162. "runBackoffTimer": true
  163. }
  164. },
  165. {
  166. "watchStreamClose": {
  167. "error": {
  168. "code": 14,
  169. "message": "Simulated Backend Error"
  170. },
  171. "runBackoffTimer": true
  172. }
  173. }
  174. ]
  175. },
  176. "Removing all listeners delays \"Offline\" status on next listen": {
  177. "describeName": "Offline:",
  178. "itName": "Removing all listeners delays \"Offline\" status on next listen",
  179. "tags": [
  180. "no-lru"
  181. ],
  182. "comment": "Marked as no-lru because when a listen is re-added, it gets a new target id rather than reusing one",
  183. "config": {
  184. "useGarbageCollection": true
  185. },
  186. "steps": [
  187. {
  188. "userListen": [
  189. 2,
  190. {
  191. "path": "collection",
  192. "filters": [],
  193. "orderBys": []
  194. }
  195. ],
  196. "stateExpect": {
  197. "activeTargets": {
  198. "2": {
  199. "query": {
  200. "path": "collection",
  201. "filters": [],
  202. "orderBys": []
  203. },
  204. "resumeToken": ""
  205. }
  206. }
  207. }
  208. },
  209. {
  210. "watchStreamClose": {
  211. "error": {
  212. "code": 14,
  213. "message": "Simulated Backend Error"
  214. },
  215. "runBackoffTimer": true
  216. }
  217. },
  218. {
  219. "watchStreamClose": {
  220. "error": {
  221. "code": 14,
  222. "message": "Simulated Backend Error"
  223. },
  224. "runBackoffTimer": true
  225. },
  226. "expect": [
  227. {
  228. "query": {
  229. "path": "collection",
  230. "filters": [],
  231. "orderBys": []
  232. },
  233. "errorCode": 0,
  234. "fromCache": true,
  235. "hasPendingWrites": false
  236. }
  237. ]
  238. },
  239. {
  240. "userUnlisten": [
  241. 2,
  242. {
  243. "path": "collection",
  244. "filters": [],
  245. "orderBys": []
  246. }
  247. ],
  248. "stateExpect": {
  249. "activeTargets": {}
  250. }
  251. },
  252. {
  253. "watchStreamClose": {
  254. "error": {
  255. "code": 14,
  256. "message": "Simulated Backend Error"
  257. },
  258. "runBackoffTimer": true
  259. }
  260. },
  261. {
  262. "userListen": [
  263. 4,
  264. {
  265. "path": "collection",
  266. "filters": [],
  267. "orderBys": []
  268. }
  269. ],
  270. "stateExpect": {
  271. "activeTargets": {
  272. "4": {
  273. "query": {
  274. "path": "collection",
  275. "filters": [],
  276. "orderBys": []
  277. },
  278. "resumeToken": ""
  279. }
  280. }
  281. }
  282. },
  283. {
  284. "watchStreamClose": {
  285. "error": {
  286. "code": 14,
  287. "message": "Simulated Backend Error"
  288. },
  289. "runBackoffTimer": true
  290. }
  291. },
  292. {
  293. "watchStreamClose": {
  294. "error": {
  295. "code": 14,
  296. "message": "Simulated Backend Error"
  297. },
  298. "runBackoffTimer": true
  299. },
  300. "expect": [
  301. {
  302. "query": {
  303. "path": "collection",
  304. "filters": [],
  305. "orderBys": []
  306. },
  307. "errorCode": 0,
  308. "fromCache": true,
  309. "hasPendingWrites": false
  310. }
  311. ]
  312. }
  313. ]
  314. },
  315. "Queries revert to fromCache=true when offline.": {
  316. "describeName": "Offline:",
  317. "itName": "Queries revert to fromCache=true when offline.",
  318. "tags": [],
  319. "config": {
  320. "useGarbageCollection": true
  321. },
  322. "steps": [
  323. {
  324. "userListen": [
  325. 2,
  326. {
  327. "path": "collection",
  328. "filters": [],
  329. "orderBys": []
  330. }
  331. ],
  332. "stateExpect": {
  333. "activeTargets": {
  334. "2": {
  335. "query": {
  336. "path": "collection",
  337. "filters": [],
  338. "orderBys": []
  339. },
  340. "resumeToken": ""
  341. }
  342. }
  343. }
  344. },
  345. {
  346. "watchAck": [
  347. 2
  348. ]
  349. },
  350. {
  351. "watchEntity": {
  352. "docs": [
  353. [
  354. "collection/a",
  355. 1000,
  356. {
  357. "key": "a"
  358. }
  359. ]
  360. ],
  361. "targets": [
  362. 2
  363. ]
  364. }
  365. },
  366. {
  367. "watchCurrent": [
  368. [
  369. 2
  370. ],
  371. "resume-token-1000"
  372. ]
  373. },
  374. {
  375. "watchSnapshot": {
  376. "version": 1000
  377. },
  378. "expect": [
  379. {
  380. "query": {
  381. "path": "collection",
  382. "filters": [],
  383. "orderBys": []
  384. },
  385. "added": [
  386. [
  387. "collection/a",
  388. 1000,
  389. {
  390. "key": "a"
  391. }
  392. ]
  393. ],
  394. "errorCode": 0,
  395. "fromCache": false,
  396. "hasPendingWrites": false
  397. }
  398. ]
  399. },
  400. {
  401. "watchStreamClose": {
  402. "error": {
  403. "code": 14,
  404. "message": "Simulated Backend Error"
  405. },
  406. "runBackoffTimer": true
  407. },
  408. "stateExpect": {
  409. "activeTargets": {
  410. "2": {
  411. "query": {
  412. "path": "collection",
  413. "filters": [],
  414. "orderBys": []
  415. },
  416. "resumeToken": "resume-token-1000"
  417. }
  418. }
  419. }
  420. },
  421. {
  422. "watchStreamClose": {
  423. "error": {
  424. "code": 14,
  425. "message": "Simulated Backend Error"
  426. },
  427. "runBackoffTimer": true
  428. }
  429. },
  430. {
  431. "watchStreamClose": {
  432. "error": {
  433. "code": 14,
  434. "message": "Simulated Backend Error"
  435. },
  436. "runBackoffTimer": true
  437. },
  438. "expect": [
  439. {
  440. "query": {
  441. "path": "collection",
  442. "filters": [],
  443. "orderBys": []
  444. },
  445. "errorCode": 0,
  446. "fromCache": true,
  447. "hasPendingWrites": false
  448. }
  449. ]
  450. },
  451. {
  452. "watchAck": [
  453. 2
  454. ]
  455. },
  456. {
  457. "watchEntity": {
  458. "docs": [],
  459. "targets": [
  460. 2
  461. ]
  462. }
  463. },
  464. {
  465. "watchCurrent": [
  466. [
  467. 2
  468. ],
  469. "resume-token-1000"
  470. ]
  471. },
  472. {
  473. "watchSnapshot": {
  474. "version": 1000
  475. },
  476. "expect": [
  477. {
  478. "query": {
  479. "path": "collection",
  480. "filters": [],
  481. "orderBys": []
  482. },
  483. "errorCode": 0,
  484. "fromCache": false,
  485. "hasPendingWrites": false
  486. }
  487. ]
  488. }
  489. ]
  490. },
  491. "Queries with limbo documents handle going offline.": {
  492. "describeName": "Offline:",
  493. "itName": "Queries with limbo documents handle going offline.",
  494. "tags": [],
  495. "config": {
  496. "useGarbageCollection": true
  497. },
  498. "steps": [
  499. {
  500. "userListen": [
  501. 2,
  502. {
  503. "path": "collection",
  504. "filters": [],
  505. "orderBys": []
  506. }
  507. ],
  508. "stateExpect": {
  509. "activeTargets": {
  510. "2": {
  511. "query": {
  512. "path": "collection",
  513. "filters": [],
  514. "orderBys": []
  515. },
  516. "resumeToken": ""
  517. }
  518. }
  519. }
  520. },
  521. {
  522. "watchAck": [
  523. 2
  524. ]
  525. },
  526. {
  527. "watchEntity": {
  528. "docs": [
  529. [
  530. "collection/a",
  531. 1000,
  532. {
  533. "key": "a"
  534. }
  535. ]
  536. ],
  537. "targets": [
  538. 2
  539. ]
  540. }
  541. },
  542. {
  543. "watchCurrent": [
  544. [
  545. 2
  546. ],
  547. "resume-token-1000"
  548. ]
  549. },
  550. {
  551. "watchSnapshot": {
  552. "version": 1000
  553. },
  554. "expect": [
  555. {
  556. "query": {
  557. "path": "collection",
  558. "filters": [],
  559. "orderBys": []
  560. },
  561. "added": [
  562. [
  563. "collection/a",
  564. 1000,
  565. {
  566. "key": "a"
  567. }
  568. ]
  569. ],
  570. "errorCode": 0,
  571. "fromCache": false,
  572. "hasPendingWrites": false
  573. }
  574. ]
  575. },
  576. {
  577. "watchReset": [
  578. 2
  579. ]
  580. },
  581. {
  582. "watchCurrent": [
  583. [
  584. 2
  585. ],
  586. "resume-token-1001"
  587. ]
  588. },
  589. {
  590. "watchSnapshot": {
  591. "version": 1001
  592. },
  593. "stateExpect": {
  594. "limboDocs": [
  595. "collection/a"
  596. ],
  597. "activeTargets": {
  598. "1": {
  599. "query": {
  600. "path": "collection/a",
  601. "filters": [],
  602. "orderBys": []
  603. },
  604. "resumeToken": ""
  605. },
  606. "2": {
  607. "query": {
  608. "path": "collection",
  609. "filters": [],
  610. "orderBys": []
  611. },
  612. "resumeToken": ""
  613. }
  614. }
  615. },
  616. "expect": [
  617. {
  618. "query": {
  619. "path": "collection",
  620. "filters": [],
  621. "orderBys": []
  622. },
  623. "errorCode": 0,
  624. "fromCache": true,
  625. "hasPendingWrites": false
  626. }
  627. ]
  628. },
  629. {
  630. "watchStreamClose": {
  631. "error": {
  632. "code": 14,
  633. "message": "Simulated Backend Error"
  634. },
  635. "runBackoffTimer": true
  636. },
  637. "stateExpect": {
  638. "activeTargets": {
  639. "1": {
  640. "query": {
  641. "path": "collection/a",
  642. "filters": [],
  643. "orderBys": []
  644. },
  645. "resumeToken": ""
  646. },
  647. "2": {
  648. "query": {
  649. "path": "collection",
  650. "filters": [],
  651. "orderBys": []
  652. },
  653. "resumeToken": "resume-token-1001"
  654. }
  655. }
  656. }
  657. },
  658. {
  659. "watchStreamClose": {
  660. "error": {
  661. "code": 14,
  662. "message": "Simulated Backend Error"
  663. },
  664. "runBackoffTimer": true
  665. }
  666. },
  667. {
  668. "watchStreamClose": {
  669. "error": {
  670. "code": 14,
  671. "message": "Simulated Backend Error"
  672. },
  673. "runBackoffTimer": true
  674. }
  675. },
  676. {
  677. "watchAck": [
  678. 2
  679. ]
  680. },
  681. {
  682. "watchEntity": {
  683. "docs": [],
  684. "targets": [
  685. 2
  686. ]
  687. }
  688. },
  689. {
  690. "watchCurrent": [
  691. [
  692. 2
  693. ],
  694. "resume-token-1001"
  695. ]
  696. },
  697. {
  698. "watchSnapshot": {
  699. "version": 1001
  700. }
  701. },
  702. {
  703. "watchAck": [
  704. 1
  705. ]
  706. },
  707. {
  708. "watchEntity": {
  709. "docs": [],
  710. "targets": [
  711. 1
  712. ]
  713. }
  714. },
  715. {
  716. "watchCurrent": [
  717. [
  718. 1
  719. ],
  720. "resume-token-1001"
  721. ]
  722. },
  723. {
  724. "watchSnapshot": {
  725. "version": 1001
  726. },
  727. "expect": [
  728. {
  729. "query": {
  730. "path": "collection",
  731. "filters": [],
  732. "orderBys": []
  733. },
  734. "removed": [
  735. [
  736. "collection/a",
  737. 1000,
  738. {
  739. "key": "a"
  740. }
  741. ]
  742. ],
  743. "errorCode": 0,
  744. "fromCache": false,
  745. "hasPendingWrites": false
  746. }
  747. ],
  748. "stateExpect": {
  749. "limboDocs": [],
  750. "activeTargets": {
  751. "2": {
  752. "query": {
  753. "path": "collection",
  754. "filters": [],
  755. "orderBys": []
  756. },
  757. "resumeToken": "resume-token-1001"
  758. }
  759. }
  760. }
  761. }
  762. ]
  763. },
  764. "OnlineState timeout triggers offline behavior": {
  765. "describeName": "Offline:",
  766. "itName": "OnlineState timeout triggers offline behavior",
  767. "tags": [],
  768. "config": {
  769. "useGarbageCollection": true
  770. },
  771. "steps": [
  772. {
  773. "userListen": [
  774. 2,
  775. {
  776. "path": "collection",
  777. "filters": [],
  778. "orderBys": []
  779. }
  780. ],
  781. "stateExpect": {
  782. "activeTargets": {
  783. "2": {
  784. "query": {
  785. "path": "collection",
  786. "filters": [],
  787. "orderBys": []
  788. },
  789. "resumeToken": ""
  790. }
  791. }
  792. }
  793. },
  794. {
  795. "runTimer": "online_state_timeout",
  796. "expect": [
  797. {
  798. "query": {
  799. "path": "collection",
  800. "filters": [],
  801. "orderBys": []
  802. },
  803. "errorCode": 0,
  804. "fromCache": true,
  805. "hasPendingWrites": false
  806. }
  807. ]
  808. },
  809. {
  810. "watchStreamClose": {
  811. "error": {
  812. "code": 14,
  813. "message": "Simulated Backend Error"
  814. },
  815. "runBackoffTimer": true
  816. }
  817. },
  818. {
  819. "watchStreamClose": {
  820. "error": {
  821. "code": 14,
  822. "message": "Simulated Backend Error"
  823. },
  824. "runBackoffTimer": true
  825. }
  826. },
  827. {
  828. "watchAck": [
  829. 2
  830. ]
  831. },
  832. {
  833. "watchEntity": {
  834. "docs": [
  835. [
  836. "collection/a",
  837. 1000,
  838. {
  839. "key": "a"
  840. }
  841. ]
  842. ],
  843. "targets": [
  844. 2
  845. ]
  846. }
  847. },
  848. {
  849. "watchCurrent": [
  850. [
  851. 2
  852. ],
  853. "resume-token-1000"
  854. ]
  855. },
  856. {
  857. "watchSnapshot": {
  858. "version": 1000
  859. },
  860. "expect": [
  861. {
  862. "query": {
  863. "path": "collection",
  864. "filters": [],
  865. "orderBys": []
  866. },
  867. "added": [
  868. [
  869. "collection/a",
  870. 1000,
  871. {
  872. "key": "a"
  873. }
  874. ]
  875. ],
  876. "errorCode": 0,
  877. "fromCache": false,
  878. "hasPendingWrites": false
  879. }
  880. ]
  881. },
  882. {
  883. "runTimer": "all"
  884. },
  885. {
  886. "watchStreamClose": {
  887. "error": {
  888. "code": 14,
  889. "message": "Simulated Backend Error"
  890. },
  891. "runBackoffTimer": true
  892. },
  893. "stateExpect": {
  894. "activeTargets": {
  895. "2": {
  896. "query": {
  897. "path": "collection",
  898. "filters": [],
  899. "orderBys": []
  900. },
  901. "resumeToken": "resume-token-1000"
  902. }
  903. }
  904. }
  905. },
  906. {
  907. "runTimer": "online_state_timeout",
  908. "expect": [
  909. {
  910. "query": {
  911. "path": "collection",
  912. "filters": [],
  913. "orderBys": []
  914. },
  915. "errorCode": 0,
  916. "fromCache": true,
  917. "hasPendingWrites": false
  918. }
  919. ]
  920. }
  921. ]
  922. },
  923. "New queries return immediately with fromCache=true when offline due to stream failures.": {
  924. "describeName": "Offline:",
  925. "itName": "New queries return immediately with fromCache=true when offline due to stream failures.",
  926. "tags": [],
  927. "config": {
  928. "useGarbageCollection": true
  929. },
  930. "steps": [
  931. {
  932. "userListen": [
  933. 2,
  934. {
  935. "path": "collection",
  936. "filters": [],
  937. "orderBys": []
  938. }
  939. ],
  940. "stateExpect": {
  941. "activeTargets": {
  942. "2": {
  943. "query": {
  944. "path": "collection",
  945. "filters": [],
  946. "orderBys": []
  947. },
  948. "resumeToken": ""
  949. }
  950. }
  951. }
  952. },
  953. {
  954. "watchStreamClose": {
  955. "error": {
  956. "code": 14,
  957. "message": "Simulated Backend Error"
  958. },
  959. "runBackoffTimer": true
  960. }
  961. },
  962. {
  963. "watchStreamClose": {
  964. "error": {
  965. "code": 14,
  966. "message": "Simulated Backend Error"
  967. },
  968. "runBackoffTimer": true
  969. },
  970. "expect": [
  971. {
  972. "query": {
  973. "path": "collection",
  974. "filters": [],
  975. "orderBys": []
  976. },
  977. "errorCode": 0,
  978. "fromCache": true,
  979. "hasPendingWrites": false
  980. }
  981. ]
  982. },
  983. {
  984. "userListen": [
  985. 4,
  986. {
  987. "path": "collection2",
  988. "filters": [],
  989. "orderBys": []
  990. }
  991. ],
  992. "stateExpect": {
  993. "activeTargets": {
  994. "2": {
  995. "query": {
  996. "path": "collection",
  997. "filters": [],
  998. "orderBys": []
  999. },
  1000. "resumeToken": ""
  1001. },
  1002. "4": {
  1003. "query": {
  1004. "path": "collection2",
  1005. "filters": [],
  1006. "orderBys": []
  1007. },
  1008. "resumeToken": ""
  1009. }
  1010. }
  1011. },
  1012. "expect": [
  1013. {
  1014. "query": {
  1015. "path": "collection2",
  1016. "filters": [],
  1017. "orderBys": []
  1018. },
  1019. "errorCode": 0,
  1020. "fromCache": true,
  1021. "hasPendingWrites": false
  1022. }
  1023. ]
  1024. }
  1025. ]
  1026. },
  1027. "New queries return immediately with fromCache=true when offline due to OnlineState timeout.": {
  1028. "describeName": "Offline:",
  1029. "itName": "New queries return immediately with fromCache=true when offline due to OnlineState timeout.",
  1030. "tags": [],
  1031. "config": {
  1032. "useGarbageCollection": true
  1033. },
  1034. "steps": [
  1035. {
  1036. "userListen": [
  1037. 2,
  1038. {
  1039. "path": "collection",
  1040. "filters": [],
  1041. "orderBys": []
  1042. }
  1043. ],
  1044. "stateExpect": {
  1045. "activeTargets": {
  1046. "2": {
  1047. "query": {
  1048. "path": "collection",
  1049. "filters": [],
  1050. "orderBys": []
  1051. },
  1052. "resumeToken": ""
  1053. }
  1054. }
  1055. }
  1056. },
  1057. {
  1058. "runTimer": "online_state_timeout",
  1059. "expect": [
  1060. {
  1061. "query": {
  1062. "path": "collection",
  1063. "filters": [],
  1064. "orderBys": []
  1065. },
  1066. "errorCode": 0,
  1067. "fromCache": true,
  1068. "hasPendingWrites": false
  1069. }
  1070. ]
  1071. },
  1072. {
  1073. "userListen": [
  1074. 4,
  1075. {
  1076. "path": "collection2",
  1077. "filters": [],
  1078. "orderBys": []
  1079. }
  1080. ],
  1081. "stateExpect": {
  1082. "activeTargets": {
  1083. "2": {
  1084. "query": {
  1085. "path": "collection",
  1086. "filters": [],
  1087. "orderBys": []
  1088. },
  1089. "resumeToken": ""
  1090. },
  1091. "4": {
  1092. "query": {
  1093. "path": "collection2",
  1094. "filters": [],
  1095. "orderBys": []
  1096. },
  1097. "resumeToken": ""
  1098. }
  1099. }
  1100. },
  1101. "expect": [
  1102. {
  1103. "query": {
  1104. "path": "collection2",
  1105. "filters": [],
  1106. "orderBys": []
  1107. },
  1108. "errorCode": 0,
  1109. "fromCache": true,
  1110. "hasPendingWrites": false
  1111. }
  1112. ]
  1113. }
  1114. ]
  1115. }
  1116. }