offline_spec_test.json 22 KB

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