@fluidframework/container-runtime 2.0.0-rc.2.0.2 → 2.0.0-rc.3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/api-report/container-runtime.api.md +471 -52
  3. package/dist/batchTracker.d.ts +1 -1
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +4 -4
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +33 -30
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +82 -107
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/channelCollection.d.ts +27 -22
  12. package/dist/channelCollection.d.ts.map +1 -1
  13. package/dist/channelCollection.js +155 -165
  14. package/dist/channelCollection.js.map +1 -1
  15. package/dist/connectionTelemetry.d.ts +3 -3
  16. package/dist/connectionTelemetry.d.ts.map +1 -1
  17. package/dist/connectionTelemetry.js +17 -17
  18. package/dist/connectionTelemetry.js.map +1 -1
  19. package/dist/containerHandleContext.d.ts.map +1 -1
  20. package/dist/containerHandleContext.js +2 -2
  21. package/dist/containerHandleContext.js.map +1 -1
  22. package/dist/containerRuntime.d.ts +42 -39
  23. package/dist/containerRuntime.d.ts.map +1 -1
  24. package/dist/containerRuntime.js +425 -292
  25. package/dist/containerRuntime.js.map +1 -1
  26. package/dist/dataStore.d.ts +1 -1
  27. package/dist/dataStore.d.ts.map +1 -1
  28. package/dist/dataStore.js +8 -8
  29. package/dist/dataStore.js.map +1 -1
  30. package/dist/dataStoreContext.d.ts +58 -19
  31. package/dist/dataStoreContext.d.ts.map +1 -1
  32. package/dist/dataStoreContext.js +169 -114
  33. package/dist/dataStoreContext.js.map +1 -1
  34. package/dist/dataStoreContexts.d.ts +1 -0
  35. package/dist/dataStoreContexts.d.ts.map +1 -1
  36. package/dist/dataStoreContexts.js +12 -11
  37. package/dist/dataStoreContexts.js.map +1 -1
  38. package/dist/dataStoreRegistry.d.ts +5 -1
  39. package/dist/dataStoreRegistry.d.ts.map +1 -1
  40. package/dist/dataStoreRegistry.js +4 -4
  41. package/dist/dataStoreRegistry.js.map +1 -1
  42. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  43. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  44. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  45. package/dist/deltaScheduler.d.ts +1 -1
  46. package/dist/deltaScheduler.d.ts.map +1 -1
  47. package/dist/deltaScheduler.js +6 -6
  48. package/dist/deltaScheduler.js.map +1 -1
  49. package/dist/error.d.ts +1 -1
  50. package/dist/error.d.ts.map +1 -1
  51. package/dist/error.js +4 -4
  52. package/dist/error.js.map +1 -1
  53. package/dist/gc/garbageCollection.d.ts +3 -2
  54. package/dist/gc/garbageCollection.d.ts.map +1 -1
  55. package/dist/gc/garbageCollection.js +23 -23
  56. package/dist/gc/garbageCollection.js.map +1 -1
  57. package/dist/gc/gcConfigs.d.ts +2 -2
  58. package/dist/gc/gcConfigs.d.ts.map +1 -1
  59. package/dist/gc/gcConfigs.js +4 -5
  60. package/dist/gc/gcConfigs.js.map +1 -1
  61. package/dist/gc/gcDefinitions.d.ts +4 -5
  62. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  63. package/dist/gc/gcDefinitions.js.map +1 -1
  64. package/dist/gc/gcHelpers.d.ts +5 -1
  65. package/dist/gc/gcHelpers.d.ts.map +1 -1
  66. package/dist/gc/gcHelpers.js +21 -12
  67. package/dist/gc/gcHelpers.js.map +1 -1
  68. package/dist/gc/gcSummaryStateTracker.d.ts +2 -2
  69. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  70. package/dist/gc/gcSummaryStateTracker.js +11 -11
  71. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  72. package/dist/gc/gcTelemetry.d.ts +2 -1
  73. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  74. package/dist/gc/gcTelemetry.js +11 -9
  75. package/dist/gc/gcTelemetry.js.map +1 -1
  76. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  77. package/dist/gc/gcUnreferencedStateTracker.js +6 -6
  78. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  79. package/dist/gc/index.d.ts +1 -1
  80. package/dist/gc/index.d.ts.map +1 -1
  81. package/dist/gc/index.js +2 -1
  82. package/dist/gc/index.js.map +1 -1
  83. package/dist/index.d.ts +5 -2
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +12 -2
  86. package/dist/index.js.map +1 -1
  87. package/dist/legacy.d.ts +91 -0
  88. package/dist/messageTypes.d.ts +11 -5
  89. package/dist/messageTypes.d.ts.map +1 -1
  90. package/dist/messageTypes.js +4 -0
  91. package/dist/messageTypes.js.map +1 -1
  92. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  93. package/dist/opLifecycle/batchManager.js.map +1 -1
  94. package/dist/opLifecycle/definitions.d.ts +2 -20
  95. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  96. package/dist/opLifecycle/definitions.js.map +1 -1
  97. package/dist/opLifecycle/index.d.ts +3 -3
  98. package/dist/opLifecycle/index.d.ts.map +1 -1
  99. package/dist/opLifecycle/index.js +3 -1
  100. package/dist/opLifecycle/index.js.map +1 -1
  101. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  102. package/dist/opLifecycle/opCompressor.js +5 -6
  103. package/dist/opLifecycle/opCompressor.js.map +1 -1
  104. package/dist/opLifecycle/opDecompressor.d.ts +15 -4
  105. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  106. package/dist/opLifecycle/opDecompressor.js +62 -63
  107. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  108. package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
  109. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  110. package/dist/opLifecycle/opGroupingManager.js +14 -16
  111. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  112. package/dist/opLifecycle/opSplitter.d.ts +12 -4
  113. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  114. package/dist/opLifecycle/opSplitter.js +63 -53
  115. package/dist/opLifecycle/opSplitter.js.map +1 -1
  116. package/dist/opLifecycle/outbox.d.ts +2 -1
  117. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  118. package/dist/opLifecycle/outbox.js +30 -29
  119. package/dist/opLifecycle/outbox.js.map +1 -1
  120. package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  121. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  122. package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
  123. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  124. package/dist/packageVersion.d.ts +1 -1
  125. package/dist/packageVersion.js +1 -1
  126. package/dist/packageVersion.js.map +1 -1
  127. package/dist/pendingStateManager.d.ts +1 -1
  128. package/dist/pendingStateManager.d.ts.map +1 -1
  129. package/dist/pendingStateManager.js +18 -18
  130. package/dist/pendingStateManager.js.map +1 -1
  131. package/dist/public.d.ts +12 -0
  132. package/dist/scheduleManager.d.ts +1 -1
  133. package/dist/scheduleManager.d.ts.map +1 -1
  134. package/dist/scheduleManager.js +28 -24
  135. package/dist/scheduleManager.js.map +1 -1
  136. package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
  137. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
  138. package/dist/storageServiceWithAttachBlobs.js +2 -2
  139. package/dist/storageServiceWithAttachBlobs.js.map +1 -1
  140. package/dist/summary/documentSchema.d.ts +209 -0
  141. package/dist/summary/documentSchema.d.ts.map +1 -0
  142. package/dist/summary/documentSchema.js +390 -0
  143. package/dist/summary/documentSchema.js.map +1 -0
  144. package/dist/summary/index.d.ts +2 -1
  145. package/dist/summary/index.d.ts.map +1 -1
  146. package/dist/summary/index.js +4 -1
  147. package/dist/summary/index.js.map +1 -1
  148. package/dist/summary/orderedClientElection.d.ts +2 -2
  149. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  150. package/dist/summary/orderedClientElection.js +12 -7
  151. package/dist/summary/orderedClientElection.js.map +1 -1
  152. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
  153. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  154. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  155. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  156. package/dist/summary/runningSummarizer.d.ts +3 -3
  157. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  158. package/dist/summary/runningSummarizer.js +16 -16
  159. package/dist/summary/runningSummarizer.js.map +1 -1
  160. package/dist/summary/summarizer.d.ts +3 -2
  161. package/dist/summary/summarizer.d.ts.map +1 -1
  162. package/dist/summary/summarizer.js +13 -13
  163. package/dist/summary/summarizer.js.map +1 -1
  164. package/dist/summary/summarizerClientElection.d.ts +2 -2
  165. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  166. package/dist/summary/summarizerClientElection.js.map +1 -1
  167. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  168. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  169. package/dist/summary/summarizerHeuristics.js +2 -2
  170. package/dist/summary/summarizerHeuristics.js.map +1 -1
  171. package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -2
  172. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  173. package/dist/summary/summarizerNode/summarizerNode.js +28 -28
  174. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  175. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  176. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  177. package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  178. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  179. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  180. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  181. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
  182. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  183. package/dist/summary/summarizerTypes.d.ts +5 -3
  184. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  185. package/dist/summary/summarizerTypes.js.map +1 -1
  186. package/dist/summary/summaryCollection.d.ts +2 -2
  187. package/dist/summary/summaryCollection.d.ts.map +1 -1
  188. package/dist/summary/summaryCollection.js +7 -7
  189. package/dist/summary/summaryCollection.js.map +1 -1
  190. package/dist/summary/summaryFormat.d.ts +6 -17
  191. package/dist/summary/summaryFormat.d.ts.map +1 -1
  192. package/dist/summary/summaryFormat.js +8 -8
  193. package/dist/summary/summaryFormat.js.map +1 -1
  194. package/dist/summary/summaryGenerator.d.ts +4 -3
  195. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  196. package/dist/summary/summaryGenerator.js +17 -17
  197. package/dist/summary/summaryGenerator.js.map +1 -1
  198. package/dist/summary/summaryManager.d.ts +1 -1
  199. package/dist/summary/summaryManager.d.ts.map +1 -1
  200. package/dist/summary/summaryManager.js +15 -14
  201. package/dist/summary/summaryManager.js.map +1 -1
  202. package/internal.d.ts +11 -0
  203. package/legacy.d.ts +11 -0
  204. package/lib/batchTracker.d.ts +1 -1
  205. package/lib/batchTracker.d.ts.map +1 -1
  206. package/lib/batchTracker.js +2 -2
  207. package/lib/batchTracker.js.map +1 -1
  208. package/lib/blobManager.d.ts +33 -30
  209. package/lib/blobManager.d.ts.map +1 -1
  210. package/lib/blobManager.js +48 -73
  211. package/lib/blobManager.js.map +1 -1
  212. package/lib/channelCollection.d.ts +27 -22
  213. package/lib/channelCollection.d.ts.map +1 -1
  214. package/lib/channelCollection.js +96 -106
  215. package/lib/channelCollection.js.map +1 -1
  216. package/lib/connectionTelemetry.d.ts +3 -3
  217. package/lib/connectionTelemetry.d.ts.map +1 -1
  218. package/lib/connectionTelemetry.js +3 -3
  219. package/lib/connectionTelemetry.js.map +1 -1
  220. package/lib/containerHandleContext.d.ts.map +1 -1
  221. package/lib/containerHandleContext.js +1 -1
  222. package/lib/containerHandleContext.js.map +1 -1
  223. package/lib/containerRuntime.d.ts +42 -39
  224. package/lib/containerRuntime.d.ts.map +1 -1
  225. package/lib/containerRuntime.js +276 -141
  226. package/lib/containerRuntime.js.map +1 -1
  227. package/lib/dataStore.d.ts +1 -1
  228. package/lib/dataStore.d.ts.map +1 -1
  229. package/lib/dataStore.js +3 -3
  230. package/lib/dataStore.js.map +1 -1
  231. package/lib/dataStoreContext.d.ts +58 -19
  232. package/lib/dataStoreContext.d.ts.map +1 -1
  233. package/lib/dataStoreContext.js +107 -52
  234. package/lib/dataStoreContext.js.map +1 -1
  235. package/lib/dataStoreContexts.d.ts +1 -0
  236. package/lib/dataStoreContexts.d.ts.map +1 -1
  237. package/lib/dataStoreContexts.js +3 -2
  238. package/lib/dataStoreContexts.js.map +1 -1
  239. package/lib/dataStoreRegistry.d.ts +5 -1
  240. package/lib/dataStoreRegistry.d.ts.map +1 -1
  241. package/lib/dataStoreRegistry.js +1 -1
  242. package/lib/dataStoreRegistry.js.map +1 -1
  243. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  244. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  245. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  246. package/lib/deltaScheduler.d.ts +1 -1
  247. package/lib/deltaScheduler.d.ts.map +1 -1
  248. package/lib/deltaScheduler.js +1 -1
  249. package/lib/deltaScheduler.js.map +1 -1
  250. package/lib/error.d.ts +1 -1
  251. package/lib/error.d.ts.map +1 -1
  252. package/lib/error.js +2 -2
  253. package/lib/error.js.map +1 -1
  254. package/lib/gc/garbageCollection.d.ts +3 -2
  255. package/lib/gc/garbageCollection.d.ts.map +1 -1
  256. package/lib/gc/garbageCollection.js +8 -8
  257. package/lib/gc/garbageCollection.js.map +1 -1
  258. package/lib/gc/gcConfigs.d.ts +2 -2
  259. package/lib/gc/gcConfigs.d.ts.map +1 -1
  260. package/lib/gc/gcConfigs.js +4 -5
  261. package/lib/gc/gcConfigs.js.map +1 -1
  262. package/lib/gc/gcDefinitions.d.ts +4 -5
  263. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  264. package/lib/gc/gcDefinitions.js.map +1 -1
  265. package/lib/gc/gcHelpers.d.ts +5 -1
  266. package/lib/gc/gcHelpers.d.ts.map +1 -1
  267. package/lib/gc/gcHelpers.js +10 -2
  268. package/lib/gc/gcHelpers.js.map +1 -1
  269. package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
  270. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  271. package/lib/gc/gcSummaryStateTracker.js +2 -2
  272. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  273. package/lib/gc/gcTelemetry.d.ts +2 -1
  274. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  275. package/lib/gc/gcTelemetry.js +4 -2
  276. package/lib/gc/gcTelemetry.js.map +1 -1
  277. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  278. package/lib/gc/gcUnreferencedStateTracker.js +2 -2
  279. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  280. package/lib/gc/index.d.ts +1 -1
  281. package/lib/gc/index.d.ts.map +1 -1
  282. package/lib/gc/index.js +1 -1
  283. package/lib/gc/index.js.map +1 -1
  284. package/lib/index.d.ts +5 -2
  285. package/lib/index.d.ts.map +1 -1
  286. package/lib/index.js +5 -2
  287. package/lib/index.js.map +1 -1
  288. package/lib/legacy.d.ts +91 -0
  289. package/lib/messageTypes.d.ts +11 -5
  290. package/lib/messageTypes.d.ts.map +1 -1
  291. package/lib/messageTypes.js +4 -0
  292. package/lib/messageTypes.js.map +1 -1
  293. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  294. package/lib/opLifecycle/batchManager.js.map +1 -1
  295. package/lib/opLifecycle/definitions.d.ts +2 -20
  296. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  297. package/lib/opLifecycle/definitions.js.map +1 -1
  298. package/lib/opLifecycle/index.d.ts +3 -3
  299. package/lib/opLifecycle/index.d.ts.map +1 -1
  300. package/lib/opLifecycle/index.js +2 -2
  301. package/lib/opLifecycle/index.js.map +1 -1
  302. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  303. package/lib/opLifecycle/opCompressor.js +2 -3
  304. package/lib/opLifecycle/opCompressor.js.map +1 -1
  305. package/lib/opLifecycle/opDecompressor.d.ts +15 -4
  306. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  307. package/lib/opLifecycle/opDecompressor.js +61 -62
  308. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  309. package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
  310. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  311. package/lib/opLifecycle/opGroupingManager.js +9 -12
  312. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  313. package/lib/opLifecycle/opSplitter.d.ts +12 -4
  314. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  315. package/lib/opLifecycle/opSplitter.js +47 -38
  316. package/lib/opLifecycle/opSplitter.js.map +1 -1
  317. package/lib/opLifecycle/outbox.d.ts +2 -1
  318. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  319. package/lib/opLifecycle/outbox.js +19 -18
  320. package/lib/opLifecycle/outbox.js.map +1 -1
  321. package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  322. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  323. package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
  324. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  325. package/lib/packageVersion.d.ts +1 -1
  326. package/lib/packageVersion.js +1 -1
  327. package/lib/packageVersion.js.map +1 -1
  328. package/lib/pendingStateManager.d.ts +1 -1
  329. package/lib/pendingStateManager.d.ts.map +1 -1
  330. package/lib/pendingStateManager.js +2 -2
  331. package/lib/pendingStateManager.js.map +1 -1
  332. package/lib/public.d.ts +12 -0
  333. package/lib/scheduleManager.d.ts +1 -1
  334. package/lib/scheduleManager.d.ts.map +1 -1
  335. package/lib/scheduleManager.js +7 -3
  336. package/lib/scheduleManager.js.map +1 -1
  337. package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
  338. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
  339. package/lib/storageServiceWithAttachBlobs.js +1 -1
  340. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  341. package/lib/summary/documentSchema.d.ts +209 -0
  342. package/lib/summary/documentSchema.d.ts.map +1 -0
  343. package/lib/summary/documentSchema.js +386 -0
  344. package/lib/summary/documentSchema.js.map +1 -0
  345. package/lib/summary/index.d.ts +2 -1
  346. package/lib/summary/index.d.ts.map +1 -1
  347. package/lib/summary/index.js +1 -0
  348. package/lib/summary/index.js.map +1 -1
  349. package/lib/summary/orderedClientElection.d.ts +2 -2
  350. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  351. package/lib/summary/orderedClientElection.js +7 -2
  352. package/lib/summary/orderedClientElection.js.map +1 -1
  353. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
  354. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  355. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  356. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  357. package/lib/summary/runningSummarizer.d.ts +3 -3
  358. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  359. package/lib/summary/runningSummarizer.js +3 -3
  360. package/lib/summary/runningSummarizer.js.map +1 -1
  361. package/lib/summary/summarizer.d.ts +3 -2
  362. package/lib/summary/summarizer.d.ts.map +1 -1
  363. package/lib/summary/summarizer.js +3 -3
  364. package/lib/summary/summarizer.js.map +1 -1
  365. package/lib/summary/summarizerClientElection.d.ts +2 -2
  366. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  367. package/lib/summary/summarizerClientElection.js.map +1 -1
  368. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  369. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  370. package/lib/summary/summarizerHeuristics.js +1 -1
  371. package/lib/summary/summarizerHeuristics.js.map +1 -1
  372. package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
  373. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  374. package/lib/summary/summarizerNode/summarizerNode.js +5 -5
  375. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  376. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  377. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  378. package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
  379. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  380. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  381. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  382. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
  383. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  384. package/lib/summary/summarizerTypes.d.ts +5 -3
  385. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  386. package/lib/summary/summarizerTypes.js.map +1 -1
  387. package/lib/summary/summaryCollection.d.ts +2 -2
  388. package/lib/summary/summaryCollection.d.ts.map +1 -1
  389. package/lib/summary/summaryCollection.js +1 -1
  390. package/lib/summary/summaryCollection.js.map +1 -1
  391. package/lib/summary/summaryFormat.d.ts +6 -17
  392. package/lib/summary/summaryFormat.d.ts.map +1 -1
  393. package/lib/summary/summaryFormat.js +3 -3
  394. package/lib/summary/summaryFormat.js.map +1 -1
  395. package/lib/summary/summaryGenerator.d.ts +4 -3
  396. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  397. package/lib/summary/summaryGenerator.js +4 -4
  398. package/lib/summary/summaryGenerator.js.map +1 -1
  399. package/lib/summary/summaryManager.d.ts +1 -1
  400. package/lib/summary/summaryManager.d.ts.map +1 -1
  401. package/lib/summary/summaryManager.js +9 -8
  402. package/lib/summary/summaryManager.js.map +1 -1
  403. package/package.json +57 -65
  404. package/src/batchTracker.ts +4 -3
  405. package/src/blobManager.ts +100 -77
  406. package/src/channelCollection.ts +180 -165
  407. package/src/connectionTelemetry.ts +12 -12
  408. package/src/containerHandleContext.ts +3 -2
  409. package/src/containerRuntime.ts +481 -277
  410. package/src/dataStore.ts +9 -4
  411. package/src/dataStoreContext.ts +195 -93
  412. package/src/dataStoreContexts.ts +5 -2
  413. package/src/dataStoreRegistry.ts +3 -2
  414. package/src/deltaManagerSummarizerProxy.ts +1 -1
  415. package/src/deltaScheduler.ts +2 -1
  416. package/src/error.ts +2 -2
  417. package/src/gc/garbageCollection.ts +21 -20
  418. package/src/gc/gcConfigs.ts +15 -18
  419. package/src/gc/gcDefinitions.ts +6 -8
  420. package/src/gc/gcHelpers.ts +22 -5
  421. package/src/gc/gcSummaryStateTracker.ts +7 -5
  422. package/src/gc/gcTelemetry.ts +13 -7
  423. package/src/gc/gcUnreferencedStateTracker.ts +3 -2
  424. package/src/gc/index.ts +1 -0
  425. package/src/index.ts +22 -1
  426. package/src/messageTypes.ts +20 -6
  427. package/src/opLifecycle/README.md +89 -0
  428. package/src/opLifecycle/batchManager.ts +1 -0
  429. package/src/opLifecycle/definitions.ts +3 -21
  430. package/src/opLifecycle/index.ts +3 -9
  431. package/src/opLifecycle/opCompressor.ts +6 -5
  432. package/src/opLifecycle/opDecompressor.ts +90 -100
  433. package/src/opLifecycle/opGroupingManager.ts +12 -14
  434. package/src/opLifecycle/opSplitter.ts +76 -48
  435. package/src/opLifecycle/outbox.ts +30 -38
  436. package/src/opLifecycle/remoteMessageProcessor.ts +43 -55
  437. package/src/packageVersion.ts +1 -1
  438. package/src/pendingStateManager.ts +6 -6
  439. package/src/scheduleManager.ts +10 -8
  440. package/src/storageServiceWithAttachBlobs.ts +2 -2
  441. package/src/summary/documentSchema.ts +631 -0
  442. package/src/summary/index.ts +10 -1
  443. package/src/summary/orderedClientElection.ts +7 -7
  444. package/src/summary/runWhileConnectedCoordinator.ts +3 -2
  445. package/src/summary/runningSummarizer.ts +22 -20
  446. package/src/summary/summarizer.ts +17 -15
  447. package/src/summary/summarizerClientElection.ts +3 -2
  448. package/src/summary/summarizerHeuristics.ts +4 -2
  449. package/src/summary/summarizerNode/summarizerNode.ts +20 -18
  450. package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
  451. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +16 -8
  452. package/src/summary/summarizerTypes.ts +7 -3
  453. package/src/summary/summaryCollection.ts +3 -3
  454. package/src/summary/summaryFormat.ts +14 -26
  455. package/src/summary/summaryGenerator.ts +12 -15
  456. package/src/summary/summaryManager.ts +16 -13
  457. package/api-extractor-cjs.json +0 -8
  458. package/dist/container-runtime-alpha.d.ts +0 -1753
  459. package/dist/container-runtime-beta.d.ts +0 -268
  460. package/dist/container-runtime-public.d.ts +0 -268
  461. package/dist/container-runtime-untrimmed.d.ts +0 -1893
  462. package/lib/container-runtime-alpha.d.ts +0 -1753
  463. package/lib/container-runtime-beta.d.ts +0 -268
  464. package/lib/container-runtime-public.d.ts +0 -268
  465. package/lib/container-runtime-untrimmed.d.ts +0 -1893
  466. package/lib/test/batchTracker.spec.js +0 -88
  467. package/lib/test/batchTracker.spec.js.map +0 -1
  468. package/lib/test/blobManager.spec.js +0 -835
  469. package/lib/test/blobManager.spec.js.map +0 -1
  470. package/lib/test/channelCollection.spec.js +0 -141
  471. package/lib/test/channelCollection.spec.js.map +0 -1
  472. package/lib/test/containerRuntime.spec.js +0 -1748
  473. package/lib/test/containerRuntime.spec.js.map +0 -1
  474. package/lib/test/dataStoreContext.spec.js +0 -801
  475. package/lib/test/dataStoreContext.spec.js.map +0 -1
  476. package/lib/test/dataStoreCreation.spec.js +0 -312
  477. package/lib/test/dataStoreCreation.spec.js.map +0 -1
  478. package/lib/test/dataStoreRegistry.spec.js +0 -26
  479. package/lib/test/dataStoreRegistry.spec.js.map +0 -1
  480. package/lib/test/fuzz/fuzzUtils.js +0 -66
  481. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  482. package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
  483. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
  484. package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
  485. package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
  486. package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
  487. package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
  488. package/lib/test/gc/garbageCollection.spec.js +0 -1465
  489. package/lib/test/gc/garbageCollection.spec.js.map +0 -1
  490. package/lib/test/gc/gcConfigs.spec.js +0 -690
  491. package/lib/test/gc/gcConfigs.spec.js.map +0 -1
  492. package/lib/test/gc/gcHelpers.spec.js +0 -110
  493. package/lib/test/gc/gcHelpers.spec.js.map +0 -1
  494. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
  495. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
  496. package/lib/test/gc/gcStats.spec.js +0 -391
  497. package/lib/test/gc/gcStats.spec.js.map +0 -1
  498. package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
  499. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
  500. package/lib/test/gc/gcTelemetry.spec.js +0 -530
  501. package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
  502. package/lib/test/gc/gcUnitTestHelpers.js +0 -29
  503. package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
  504. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
  505. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
  506. package/lib/test/getPendingBlobs.spec.js +0 -193
  507. package/lib/test/getPendingBlobs.spec.js.map +0 -1
  508. package/lib/test/hardwareStats.spec.js +0 -93
  509. package/lib/test/hardwareStats.spec.js.map +0 -1
  510. package/lib/test/index.js +0 -6
  511. package/lib/test/index.js.map +0 -1
  512. package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
  513. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
  514. package/lib/test/opLifecycle/batchManager.spec.js +0 -189
  515. package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
  516. package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
  517. package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
  518. package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
  519. package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
  520. package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
  521. package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
  522. package/lib/test/opLifecycle/outbox.spec.js +0 -675
  523. package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
  524. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
  525. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
  526. package/lib/test/pendingStateManager.spec.js +0 -329
  527. package/lib/test/pendingStateManager.spec.js.map +0 -1
  528. package/lib/test/scheduleManager.spec.js +0 -270
  529. package/lib/test/scheduleManager.spec.js.map +0 -1
  530. package/lib/test/summarizerNode.spec.js +0 -326
  531. package/lib/test/summarizerNode.spec.js.map +0 -1
  532. package/lib/test/summarizerNodeWithGc.spec.js +0 -318
  533. package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
  534. package/lib/test/summary/orderedClientElection.spec.js +0 -535
  535. package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
  536. package/lib/test/summary/runningSummarizer.spec.js +0 -1349
  537. package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
  538. package/lib/test/summary/summarizer.spec.js +0 -29
  539. package/lib/test/summary/summarizer.spec.js.map +0 -1
  540. package/lib/test/summary/summarizerClientElection.spec.js +0 -436
  541. package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
  542. package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
  543. package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
  544. package/lib/test/summary/summaryCollection.spec.js +0 -200
  545. package/lib/test/summary/summaryCollection.spec.js.map +0 -1
  546. package/lib/test/summary/summaryManager.spec.js +0 -430
  547. package/lib/test/summary/summaryManager.spec.js.map +0 -1
  548. package/lib/test/summary/testQuorumClients.js +0 -34
  549. package/lib/test/summary/testQuorumClients.js.map +0 -1
  550. package/lib/test/throttler.spec.js +0 -175
  551. package/lib/test/throttler.spec.js.map +0 -1
  552. package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
  553. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
  554. /package/{dist → lib}/tsdoc-metadata.json +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"gcConfigs.spec.js","sourceRoot":"","sources":["../../../src/test/gc/gcConfigs.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { SinonFakeTimers, useFakeTimers } from \"sinon\";\nimport { ICriticalContainerError } from \"@fluidframework/container-definitions\";\nimport { IErrorBase } from \"@fluidframework/core-interfaces\";\nimport {\n\tIGarbageCollectionData,\n\tIGarbageCollectionDetailsBase,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n\tMockLogger,\n\tMonitoringContext,\n\tmixinMonitoringContext,\n\tcreateChildLogger,\n} from \"@fluidframework/telemetry-utils\";\nimport { Timer } from \"@fluidframework/core-utils\";\nimport {\n\tGarbageCollector,\n\tGCNodeType,\n\tGCSummaryStateTracker,\n\tIGarbageCollectionRuntime,\n\tIGarbageCollectionState,\n\tIGarbageCollector,\n\tIGarbageCollectorConfigs,\n\tIGarbageCollectorCreateParams,\n\tIGCMetadata,\n\tIGCMetadata_Deprecated,\n\tIGCRuntimeOptions,\n\tdefaultSessionExpiryDurationMs,\n\toneDayMs,\n\trunGCKey,\n\trunSweepKey,\n\tdefaultInactiveTimeoutMs,\n\tdefaultSweepGracePeriodMs,\n\tgcTestModeKey,\n\tnextGCVersion,\n\tstableGCVersion,\n\tgcVersionUpgradeToV4Key,\n\tgcGenerationOptionName,\n\tthrowOnTombstoneLoadOverrideKey,\n\tgcDisableDataStoreSweepOptionName,\n\tgcDisableThrowOnTombstoneLoadOptionName,\n\tGCVersion,\n\trunSessionExpiryKey,\n\tdisableDatastoreSweepKey,\n} from \"../../gc/index.js\";\nimport { ContainerRuntimeGCMessage } from \"../../messageTypes.js\";\nimport { IContainerRuntimeMetadata } from \"../../summary/index.js\";\nimport { pkgVersion } from \"../../packageVersion.js\";\nimport { createTestConfigProvider } from \"./gcUnitTestHelpers.js\";\n\ntype GcWithPrivates = IGarbageCollector & {\n\treadonly configs: IGarbageCollectorConfigs;\n\treadonly summaryStateTracker: Omit<GCSummaryStateTracker, \"latestSummaryGCVersion\"> & {\n\t\tlatestSummaryGCVersion: GCVersion;\n\t};\n\treadonly sessionExpiryTimer: Omit<Timer, \"defaultTimeout\"> & { defaultTimeout: number };\n};\n\ndescribe(\"Garbage Collection configurations\", () => {\n\tconst testPkgPath = [\"testPkg\"];\n\tconst configProvider = createTestConfigProvider();\n\n\tlet mockLogger: MockLogger;\n\tlet mc: MonitoringContext<MockLogger>;\n\tlet clock: SinonFakeTimers;\n\t// The default GC data returned by `getGCData` on which GC is run. Update this to update the referenced graph.\n\tlet defaultGCData: IGarbageCollectionData = { gcNodes: {} };\n\n\tconst customSessionExpiryDurationMs = defaultSessionExpiryDurationMs + 1;\n\tconst testOverrideInactiveTimeoutKey = \"Fluid.GarbageCollection.TestOverride.InactiveTimeoutMs\";\n\tconst testOverrideTombstoneTimeoutKey =\n\t\t\"Fluid.GarbageCollection.TestOverride.TombstoneTimeoutMs\";\n\tconst testOverrideSessionExpiryMsKey = \"Fluid.GarbageCollection.TestOverride.SessionExpiryMs\";\n\n\tlet gc: GcWithPrivates | undefined;\n\n\tconst createGcWithPrivateMembers = (\n\t\tgcMetadata?: IGCMetadata,\n\t\tgcOptions?: IGCRuntimeOptions,\n\t\tisSummarizerClient?: boolean,\n\t): GcWithPrivates => {\n\t\tconst metadata: IContainerRuntimeMetadata | undefined = gcMetadata && {\n\t\t\tsummaryFormatVersion: 1,\n\t\t\tmessage: undefined,\n\t\t\t...gcMetadata,\n\t\t};\n\t\treturn createGarbageCollector(\n\t\t\t{ metadata, gcOptions },\n\t\t\tundefined /* gcBlobsMap */,\n\t\t\tundefined /* closeFn */,\n\t\t\tisSummarizerClient,\n\t\t) as GcWithPrivates;\n\t};\n\n\tfunction createGarbageCollector(\n\t\tcreateParams: Partial<IGarbageCollectorCreateParams> = {},\n\t\tgcBlobsMap: Map<\n\t\t\tstring,\n\t\t\tIGarbageCollectionState | IGarbageCollectionDetailsBase | string[]\n\t\t> = new Map(),\n\t\tcloseFn: (error?: ICriticalContainerError) => void = () => {},\n\t\tisSummarizerClient: boolean = true,\n\t) {\n\t\tconst getNodeType = (nodePath: string) => {\n\t\t\tif (nodePath.split(\"/\").length !== 2) {\n\t\t\t\treturn GCNodeType.Other;\n\t\t\t}\n\t\t\treturn GCNodeType.DataStore;\n\t\t};\n\n\t\t// The runtime to be passed to the garbage collector.\n\t\tconst gcRuntime: IGarbageCollectionRuntime = {\n\t\t\tupdateStateBeforeGC: async () => {},\n\t\t\tgetGCData: async (fullGC?: boolean) => defaultGCData,\n\t\t\tupdateUsedRoutes: (usedRoutes: string[]) => {\n\t\t\t\treturn { totalNodeCount: 0, unusedNodeCount: 0 };\n\t\t\t},\n\t\t\tupdateUnusedRoutes: (unusedRoutes: string[]) => {},\n\t\t\tdeleteSweepReadyNodes: (sweepReadyRoutes: string[]): string[] => {\n\t\t\t\treturn [];\n\t\t\t},\n\t\t\tupdateTombstonedRoutes: (tombstoneRoutes: string[]) => {},\n\t\t\tgetNodeType,\n\t\t\tgetCurrentReferenceTimestampMs: () => Date.now(),\n\t\t\tcloseFn,\n\t\t};\n\n\t\treturn GarbageCollector.create({\n\t\t\t...createParams,\n\t\t\truntime: gcRuntime,\n\t\t\tgcOptions: createParams.gcOptions ?? {},\n\t\t\tbaseSnapshot: createParams.baseSnapshot,\n\t\t\tbaseLogger: createChildLogger({ logger: mc.logger }),\n\t\t\texisting: createParams.metadata !== undefined /* existing */,\n\t\t\tmetadata: createParams.metadata,\n\t\t\tcreateContainerMetadata: {\n\t\t\t\tcreateContainerRuntimeVersion: pkgVersion,\n\t\t\t\tcreateContainerTimestamp: Date.now(),\n\t\t\t},\n\t\t\tisSummarizerClient,\n\t\t\treadAndParseBlob: async <T>(id: string) => gcBlobsMap.get(id) as T,\n\t\t\tgetNodePackagePath: async (nodeId: string) => testPkgPath,\n\t\t\tgetLastSummaryTimestampMs: () => Date.now(),\n\t\t\tsubmitMessage: (message: ContainerRuntimeGCMessage) => {},\n\t\t});\n\t}\n\n\tbefore(() => {\n\t\tclock = useFakeTimers();\n\t});\n\n\tbeforeEach(() => {\n\t\tgc = undefined;\n\t\tmockLogger = new MockLogger();\n\t\t// To ensure inactive timeout is less than tombstone timeout.\n\t\tconfigProvider.set(testOverrideInactiveTimeoutKey, 1);\n\t\tmc = mixinMonitoringContext(mockLogger, configProvider);\n\t});\n\n\tafterEach(() => {\n\t\tclock.reset();\n\t\tconfigProvider.clear();\n\t\tdefaultGCData = { gcNodes: {} };\n\t\tgc?.dispose();\n\t});\n\n\tafter(() => {\n\t\tclock.restore();\n\t});\n\n\tdescribe(\"Existing container\", () => {\n\t\tit(\"No metadata\", () => {\n\t\t\tgc = createGcWithPrivateMembers({});\n\t\t\tassert(!gc.configs.gcEnabled, \"gcEnabled incorrect\");\n\t\t\tassert(!gc.configs.shouldRunGC, \"shouldRunGC incorrect\");\n\t\t\tassert(gc.configs.sweepEnabled, \"sweepEnabled incorrect\");\n\t\t\tassert.equal(gc.configs.shouldRunSweep, \"NO\", \"shouldRunSweep incorrect\");\n\t\t\tassert(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs === undefined,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert(gc.configs.tombstoneTimeoutMs === undefined, \"tombstoneTimeoutMs incorrect\");\n\t\t\tassert.equal(\n\t\t\t\tgc.summaryStateTracker.latestSummaryGCVersion,\n\t\t\t\t0,\n\t\t\t\t\"latestSummaryGCVersion incorrect\",\n\t\t\t);\n\t\t});\n\t\tit(\"gcFeature 0\", () => {\n\t\t\tgc = createGcWithPrivateMembers({ gcFeature: 0 });\n\t\t\tassert(!gc.configs.gcEnabled, \"gcEnabled incorrect\");\n\t\t\tassert.equal(\n\t\t\t\tgc.summaryStateTracker.latestSummaryGCVersion,\n\t\t\t\t0,\n\t\t\t\t\"latestSummaryGCVersion incorrect\",\n\t\t\t);\n\t\t});\n\t\tit(\"gcFeature 0, Sweep enabled via gcGeneration\", () => {\n\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\t{ gcFeature: 0, gcFeatureMatrix: { gcGeneration: 0 } },\n\t\t\t\t{ [gcGenerationOptionName]: 0 },\n\t\t\t);\n\t\t\tassert(!gc.configs.gcEnabled, \"gcEnabled incorrect\");\n\t\t\tassert(gc.configs.sweepEnabled, \"sweepEnabled incorrect\");\n\t\t\tassert.equal(\n\t\t\t\tgc.summaryStateTracker.latestSummaryGCVersion,\n\t\t\t\t0,\n\t\t\t\t\"latestSummaryGCVersion incorrect\",\n\t\t\t);\n\t\t});\n\t\tit(\"gcFeature 1\", () => {\n\t\t\tgc = createGcWithPrivateMembers({ gcFeature: 1 });\n\t\t\tassert(gc.configs.gcEnabled, \"gcEnabled incorrect\");\n\t\t\tassert.equal(\n\t\t\t\tgc.summaryStateTracker.latestSummaryGCVersion,\n\t\t\t\t1,\n\t\t\t\t\"latestSummaryGCVersion incorrect\",\n\t\t\t);\n\t\t});\n\t\tit(\"sweepEnabled value ignored\", () => {\n\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\t{ sweepEnabled: true },\n\t\t\t\t{ [gcGenerationOptionName]: 1 }, // No persisted value, so sweep should not be allowed\n\t\t\t);\n\t\t\tassert(!gc.configs.sweepEnabled, \"sweepEnabled incorrect\");\n\t\t});\n\t\tit(\"sessionExpiryTimeoutMs set (tombstoneTimeoutMs unset)\", () => {\n\t\t\tgc = createGcWithPrivateMembers({\n\t\t\t\tsessionExpiryTimeoutMs: customSessionExpiryDurationMs,\n\t\t\t});\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs,\n\t\t\t\tcustomSessionExpiryDurationMs,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.tombstoneTimeoutMs,\n\t\t\t\tcustomSessionExpiryDurationMs + 6 * oneDayMs,\n\t\t\t\t\"tombstoneTimeoutMs incorrect\",\n\t\t\t);\n\t\t});\n\t\tit(\"tombstoneTimeoutMs set\", () => {\n\t\t\tgc = createGcWithPrivateMembers({ tombstoneTimeoutMs: 123 });\n\t\t\tassert.equal(gc.configs.tombstoneTimeoutMs, 123, \"tombstoneTimeoutMs incorrect\");\n\t\t});\n\t\tit(\"Metadata Roundtrip\", () => {\n\t\t\tconst inputMetadata: IGCMetadata = {\n\t\t\t\tsweepEnabled: true, // ignored\n\t\t\t\tgcFeature: 1,\n\t\t\t\tsessionExpiryTimeoutMs: customSessionExpiryDurationMs,\n\t\t\t\ttombstoneTimeoutMs: 123,\n\t\t\t\tgcFeatureMatrix: { gcGeneration: 1 },\n\t\t\t};\n\t\t\tgc = createGcWithPrivateMembers(inputMetadata, {\n\t\t\t\t[gcGenerationOptionName]: 2, // 2 should not replace already-persisted value of 1\n\t\t\t});\n\t\t\tconst outputMetadata = gc.getMetadata();\n\t\t\tconst expectedOutputMetadata: IGCMetadata = {\n\t\t\t\t...inputMetadata,\n\t\t\t\tsweepEnabled: false, // Hardcoded, not used\n\t\t\t\tgcFeature: stableGCVersion,\n\t\t\t};\n\t\t\tassert.deepEqual(\n\t\t\t\toutputMetadata,\n\t\t\t\texpectedOutputMetadata,\n\t\t\t\t\"getMetadata returned different metadata than loaded from\",\n\t\t\t);\n\t\t});\n\t\tit(\"Metadata Roundtrip - old file with tombstoneGeneration\", () => {\n\t\t\tconst inputMetadata: IGCMetadata = {\n\t\t\t\tsweepEnabled: true, // ignored\n\t\t\t\tgcFeature: 1,\n\t\t\t\tsessionExpiryTimeoutMs: customSessionExpiryDurationMs,\n\t\t\t\ttombstoneTimeoutMs: 123,\n\t\t\t\tgcFeatureMatrix: { tombstoneGeneration: 1 }, // legacy file before gcGeneration\n\t\t\t};\n\t\t\tgc = createGcWithPrivateMembers(inputMetadata, {\n\t\t\t\t[gcGenerationOptionName]: 2, // Will not be persisted - legacy file will only ever be stamped with tombstoneGeneration\n\t\t\t});\n\t\t\tconst outputMetadata = gc.getMetadata();\n\t\t\tconst expectedOutputMetadata: IGCMetadata = {\n\t\t\t\t...inputMetadata,\n\t\t\t\tsweepEnabled: false, // Hardcoded, not used\n\t\t\t\tgcFeature: stableGCVersion,\n\t\t\t};\n\t\t\tassert.deepEqual(\n\t\t\t\toutputMetadata,\n\t\t\t\texpectedOutputMetadata,\n\t\t\t\t\"getMetadata returned different metadata than loaded from\",\n\t\t\t);\n\t\t});\n\t\tit(\"Metadata Roundtrip transition to gcGeneration from tombstoneGeneration\", () => {\n\t\t\tconst inputMetadata: IGCMetadata = {\n\t\t\t\tsweepEnabled: true, // ignored\n\t\t\t\tgcFeature: 1,\n\t\t\t\tsessionExpiryTimeoutMs: customSessionExpiryDurationMs,\n\t\t\t\ttombstoneTimeoutMs: 123,\n\t\t\t\tgcFeatureMatrix: { gcGeneration: 1 },\n\t\t\t};\n\t\t\t// An app may write both Generation options to ease the transition. Only gcGeneration will be persisted\n\t\t\t// (and previous to the change introducing gcGeneration, only tombstoneGeneration would have been persisted).\n\t\t\tgc = createGcWithPrivateMembers(inputMetadata, {\n\t\t\t\t[gcGenerationOptionName]: 1,\n\t\t\t\tgcTombstoneGeneration: 1, // Legacy - will not be persisted but is ok to pass in\n\t\t\t});\n\t\t\tconst outputMetadata = gc.getMetadata();\n\t\t\tconst expectedOutputMetadata: IGCMetadata = {\n\t\t\t\t...inputMetadata,\n\t\t\t\tsweepEnabled: false, // Hardcoded, not used\n\t\t\t\tgcFeature: stableGCVersion,\n\t\t\t};\n\t\t\tassert.deepEqual(\n\t\t\t\toutputMetadata,\n\t\t\t\texpectedOutputMetadata,\n\t\t\t\t\"getMetadata returned different metadata than loaded from\",\n\t\t\t);\n\t\t});\n\t\tit(\"Metadata Roundtrip with GC version upgrade to v4 enabled\", () => {\n\t\t\tconfigProvider.set(gcVersionUpgradeToV4Key, true);\n\t\t\tconst inputMetadata: IGCMetadata = {\n\t\t\t\tsweepEnabled: true, // ignored\n\t\t\t\tgcFeature: 1,\n\t\t\t\tsessionExpiryTimeoutMs: customSessionExpiryDurationMs,\n\t\t\t\ttombstoneTimeoutMs: 123,\n\t\t\t\tgcFeatureMatrix: { gcGeneration: 1 },\n\t\t\t};\n\t\t\tgc = createGcWithPrivateMembers(inputMetadata);\n\t\t\tconst outputMetadata = gc.getMetadata();\n\t\t\tconst expectedOutputMetadata: IGCMetadata = {\n\t\t\t\t...inputMetadata,\n\t\t\t\tsweepEnabled: false, // Hardcoded, not used\n\t\t\t\tgcFeature: nextGCVersion,\n\t\t\t};\n\t\t\tassert.deepEqual(\n\t\t\t\toutputMetadata,\n\t\t\t\texpectedOutputMetadata,\n\t\t\t\t\"getMetadata returned different metadata than loaded from\",\n\t\t\t);\n\t\t});\n\t\tit(\"Metadata Roundtrip with GC version upgrade to v4 disabled\", () => {\n\t\t\tconfigProvider.set(gcVersionUpgradeToV4Key, false);\n\t\t\tconst inputMetadata: IGCMetadata = {\n\t\t\t\tsweepEnabled: true, // ignored\n\t\t\t\tgcFeature: 1,\n\t\t\t\tsessionExpiryTimeoutMs: customSessionExpiryDurationMs,\n\t\t\t\ttombstoneTimeoutMs: 123,\n\t\t\t\tgcFeatureMatrix: { gcGeneration: 1 },\n\t\t\t};\n\t\t\tgc = createGcWithPrivateMembers(inputMetadata);\n\t\t\tconst outputMetadata = gc.getMetadata();\n\t\t\tconst expectedOutputMetadata: IGCMetadata = {\n\t\t\t\t...inputMetadata,\n\t\t\t\tsweepEnabled: false, // Hardcoded, not used\n\t\t\t\tgcFeature: stableGCVersion,\n\t\t\t};\n\t\t\tassert.deepEqual(\n\t\t\t\toutputMetadata,\n\t\t\t\texpectedOutputMetadata,\n\t\t\t\t\"getMetadata returned different metadata than loaded from\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"New Container\", () => {\n\t\tit(\"No options\", () => {\n\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, {});\n\t\t\tassert(gc.configs.gcEnabled, \"gcEnabled incorrect\");\n\t\t\tassert(gc.configs.shouldRunGC, \"shouldRunGC incorrect\");\n\t\t\tassert(gc.configs.sweepEnabled, \"sweepEnabled incorrect\"); // Sweep is always allowed for a new container\n\t\t\tassert.equal(gc.configs.shouldRunSweep, \"NO\", \"shouldRunSweep incorrect\");\n\t\t\tassert(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs !== undefined,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert(gc.configs.tombstoneTimeoutMs !== undefined, \"tombstoneTimeoutMs incorrect\");\n\t\t\tassert.equal(\n\t\t\t\tgc.summaryStateTracker.latestSummaryGCVersion,\n\t\t\t\tstableGCVersion,\n\t\t\t\t\"latestSummaryGCVersion incorrect\",\n\t\t\t);\n\t\t});\n\t\tit(\"gcAllowed true\", () => {\n\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, { gcAllowed: true });\n\t\t\tassert(gc.configs.gcEnabled, \"gcEnabled incorrect\");\n\t\t});\n\t\tit(\"gcAllowed false\", () => {\n\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, { gcAllowed: false });\n\t\t\tassert(!gc.configs.gcEnabled, \"gcEnabled incorrect\");\n\t\t});\n\t\tit(\"Sweep enabled via gcGeneration, gcAllowed true\", () => {\n\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, {\n\t\t\t\tgcAllowed: true,\n\t\t\t\t[gcGenerationOptionName]: 1,\n\t\t\t});\n\t\t\tassert(gc.configs.gcEnabled, \"gcEnabled incorrect\");\n\t\t\tassert(gc.configs.sweepEnabled, \"sweepEnabled incorrect\");\n\t\t\tassert(gc.configs.tombstoneTimeoutMs !== undefined, \"tombstoneTimeoutMs incorrect\");\n\t\t\tassert(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs !== undefined,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t});\n\t\tit(\"Sweep enabled via gcGeneration, gcAllowed true, sessionExpiry off\", () => {\n\t\t\tconfigProvider.set(runSessionExpiryKey, false);\n\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, {\n\t\t\t\tgcAllowed: true,\n\t\t\t\t[gcGenerationOptionName]: 1,\n\t\t\t});\n\t\t\tassert(gc.configs.gcEnabled, \"gcEnabled incorrect\");\n\t\t\tassert(gc.configs.sweepEnabled, \"sweepEnabled incorrect\");\n\t\t\tassert(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs === undefined,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert(gc.configs.tombstoneTimeoutMs === undefined, \"tombstoneTimeoutMs incorrect\");\n\t\t});\n\t\tit(\"TestOverride.TombstoneTimeoutMs set, sessionExpiry on\", () => {\n\t\t\tconfigProvider.set(testOverrideTombstoneTimeoutKey, 123);\n\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, {});\n\t\t\tassert(gc.configs.sweepEnabled, \"sweepEnabled incorrect\");\n\t\t\tassert(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs === defaultSessionExpiryDurationMs,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert(gc.configs.tombstoneTimeoutMs === 123, \"tombstoneTimeoutMs incorrect\");\n\t\t});\n\t\tit(\"TestOverride.TombstoneTimeoutMs set, sessionExpiry off\", () => {\n\t\t\tconfigProvider.set(testOverrideTombstoneTimeoutKey, 123);\n\t\t\tconfigProvider.set(runSessionExpiryKey, false);\n\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, {});\n\t\t\tassert(gc.configs.sweepEnabled, \"sweepEnabled incorrect\");\n\t\t\tassert(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs === undefined,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert(gc.configs.tombstoneTimeoutMs === 123, \"tombstoneTimeoutMs incorrect\");\n\t\t});\n\t\tit(\"Metadata Roundtrip\", () => {\n\t\t\tconst expectedMetadata: IGCMetadata = {\n\t\t\t\tsweepEnabled: false, // hardcoded, not used\n\t\t\t\tgcFeature: stableGCVersion,\n\t\t\t\tsessionExpiryTimeoutMs: defaultSessionExpiryDurationMs,\n\t\t\t\ttombstoneTimeoutMs: defaultSessionExpiryDurationMs + 6 * oneDayMs,\n\t\t\t\tgcFeatureMatrix: { gcGeneration: 2 },\n\t\t\t};\n\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, {\n\t\t\t\t[gcGenerationOptionName]: 2,\n\t\t\t});\n\t\t\tconst outputMetadata = gc.getMetadata();\n\t\t\tassert.deepEqual(\n\t\t\t\toutputMetadata,\n\t\t\t\texpectedMetadata,\n\t\t\t\t\"getMetadata returned different metadata than expected\",\n\t\t\t);\n\t\t});\n\t\tit(\"Metadata Roundtrip with GC version upgrade to v4 enabled\", () => {\n\t\t\tconfigProvider.set(gcVersionUpgradeToV4Key, true);\n\t\t\tconst expectedMetadata: IGCMetadata = {\n\t\t\t\tsweepEnabled: false, // hardcoded, not used\n\t\t\t\tgcFeature: nextGCVersion,\n\t\t\t\tsessionExpiryTimeoutMs: defaultSessionExpiryDurationMs,\n\t\t\t\ttombstoneTimeoutMs: defaultSessionExpiryDurationMs + 6 * oneDayMs,\n\t\t\t\tgcFeatureMatrix: undefined,\n\t\t\t};\n\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, {});\n\t\t\tconst outputMetadata = gc.getMetadata();\n\t\t\tassert.deepEqual(\n\t\t\t\toutputMetadata,\n\t\t\t\texpectedMetadata,\n\t\t\t\t\"getMetadata returned different metadata than expected\",\n\t\t\t);\n\t\t});\n\t\tit(\"Metadata Roundtrip transition to gcGeneration from tombstoneGeneration\", () => {\n\t\t\tconst expectedMetadata: IGCMetadata = {\n\t\t\t\tsweepEnabled: false, // hardcoded, not used\n\t\t\t\tgcFeature: stableGCVersion,\n\t\t\t\tsessionExpiryTimeoutMs: defaultSessionExpiryDurationMs,\n\t\t\t\ttombstoneTimeoutMs: defaultSessionExpiryDurationMs + 6 * oneDayMs,\n\t\t\t\tgcFeatureMatrix: {\n\t\t\t\t\tgcGeneration: 2,\n\t\t\t\t\t// tombstoneGeneration will not be persisted\n\t\t\t\t},\n\t\t\t};\n\t\t\t// An app may write both Generation options to ease the transition. Only gcGeneration will be persisted\n\t\t\t// (and previous to the change introducing gcGeneration, only tombstoneGeneration would have been persisted).\n\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, {\n\t\t\t\t[gcGenerationOptionName]: 2,\n\t\t\t\tgcTombstoneGeneration: 2, // Legacy - will not be persisted but is ok to pass in\n\t\t\t});\n\t\t\tconst outputMetadata = gc.getMetadata();\n\t\t\tassert.deepEqual(\n\t\t\t\toutputMetadata,\n\t\t\t\texpectedMetadata,\n\t\t\t\t\"getMetadata returned different metadata than expected\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Session Expiry and Tombstone Timeout\", () => {\n\t\tbeforeEach(() => {\n\t\t\tconfigProvider.set(\"Fluid.GarbageCollection.TestOverride.InactiveTimeoutMs\", 1); // To ensure it's less than tombstone timeout\n\t\t});\n\n\t\t// Config sources for Session Expiry:\n\t\t// 1. defaultSessionExpiryDurationMs in code\n\t\t// 2. IGCRuntimeOptions.sessionExpiryTimeoutMs\n\t\t// 3. IGCMetadata.sessionExpiryTimeoutMs\n\t\t// 4. \"Fluid.GarbageCollection.TestOverride.SessionExpiryMs\" setting\n\t\t// Config sources for Tombstone Timeout:\n\t\t// 1. IGCMetadata.tombstoneTimeoutMs\n\t\t// 2. IGCMetadata_Deprecated.sweepTimeoutMs (backfill from before two-stage sweep)\n\t\t// 3. Computed from Session Expiry, fixed upper bound for Snapshot Expiry and a fixed buffer (on create, or to backfill existing)\n\t\t// 4. \"Fluid.GarbageCollection.TestOverride.TombstoneTimeoutMs\" setting (only applicable on create)\n\n\t\tit(\"defaultSessionExpiryDurationMs\", () => {\n\t\t\tgc = createGcWithPrivateMembers();\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs,\n\t\t\t\tdefaultSessionExpiryDurationMs,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tgc.sessionExpiryTimer.defaultTimeout,\n\t\t\t\tdefaultSessionExpiryDurationMs,\n\t\t\t\t\"sessionExpiryTimer incorrect\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.tombstoneTimeoutMs,\n\t\t\t\tdefaultSessionExpiryDurationMs + 6 * oneDayMs,\n\t\t\t\t\"tombstoneTimeoutMs incorrect\",\n\t\t\t);\n\t\t});\n\t\tit(\"defaultSessionExpiryDurationMs, TestOverride.TombstoneTimeoutMs set\", () => {\n\t\t\tconfigProvider.set(testOverrideTombstoneTimeoutKey, 7890);\n\t\t\tgc = createGcWithPrivateMembers();\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs,\n\t\t\t\tdefaultSessionExpiryDurationMs,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tgc.sessionExpiryTimer.defaultTimeout,\n\t\t\t\tdefaultSessionExpiryDurationMs,\n\t\t\t\t\"sessionExpiryTimer incorrect\",\n\t\t\t);\n\t\t\tassert.equal(gc.configs.tombstoneTimeoutMs, 7890, \"tombstoneTimeoutMs incorrect\");\n\t\t});\n\t\tit(\"gcAllowed off, session expiry off\", () => {\n\t\t\tgc = gc = createGcWithPrivateMembers(undefined /* metadata */, {\n\t\t\t\tgcAllowed: false,\n\t\t\t});\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs,\n\t\t\t\tundefined,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert.equal(gc.sessionExpiryTimer, undefined, \"sessionExpiryTimer incorrect\");\n\t\t\tassert.equal(gc.configs.tombstoneTimeoutMs, undefined, \"tombstoneTimeoutMs incorrect\");\n\t\t});\n\t\tit(\"IGCRuntimeOptions.sessionExpiryTimeoutMs\", () => {\n\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, {\n\t\t\t\tsessionExpiryTimeoutMs: 123,\n\t\t\t});\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs,\n\t\t\t\t123,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert.equal(gc.sessionExpiryTimer.defaultTimeout, 123, \"sessionExpiryTimer incorrect\");\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.tombstoneTimeoutMs,\n\t\t\t\t123 + 6 * oneDayMs,\n\t\t\t\t\"tombstoneTimeoutMs incorrect\",\n\t\t\t);\n\t\t});\n\t\tit(\"IGCMetadata.sessionExpiryTimeoutMs, backfill tombstoneTimeoutMs\", () => {\n\t\t\tconfigProvider.set(testOverrideTombstoneTimeoutKey, 1337); // Should be ignored\n\t\t\tgc = createGcWithPrivateMembers({ sessionExpiryTimeoutMs: 456 } /* metadata */);\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs,\n\t\t\t\t456,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert.equal(gc.sessionExpiryTimer.defaultTimeout, 456, \"sessionExpiryTimer incorrect\");\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.tombstoneTimeoutMs,\n\t\t\t\t456 + 6 * oneDayMs,\n\t\t\t\t\"tombstoneTimeoutMs incorrect\",\n\t\t\t);\n\t\t});\n\t\tit(\"IGCMetadata.sessionExpiryTimeoutMs and IGCMetadata.tombstoneTimeoutMs\", () => {\n\t\t\tconfigProvider.set(testOverrideTombstoneTimeoutKey, 1337); // Should be ignored\n\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\t{ sessionExpiryTimeoutMs: 456, tombstoneTimeoutMs: 789 } /* metadata */,\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs,\n\t\t\t\t456,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert.equal(gc.sessionExpiryTimer.defaultTimeout, 456, \"sessionExpiryTimer incorrect\");\n\t\t\tassert.equal(gc.configs.tombstoneTimeoutMs, 789, \"tombstoneTimeoutMs incorrect\");\n\t\t});\n\t\tit(\"IGCMetadata.tombstoneTimeoutMs only\", () => {\n\t\t\tconfigProvider.set(testOverrideTombstoneTimeoutKey, 1337); // Should be ignored\n\t\t\t// This could happen if you used TestOverride.TombstoneTimeoutMs but had SessionExpiry disabled, then loaded that container.\n\t\t\tgc = createGcWithPrivateMembers({ tombstoneTimeoutMs: 789 } /* metadata */);\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs,\n\t\t\t\tundefined,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert.equal(gc.sessionExpiryTimer, undefined, \"sessionExpiryTimer incorrect\");\n\t\t\tassert.equal(gc.configs.tombstoneTimeoutMs, 789, \"tombstoneTimeoutMs incorrect\");\n\t\t});\n\t\tit(\"IGCMetadata.tombstoneTimeoutMs - backfill from sweepTimeoutMs\", () => {\n\t\t\tconfigProvider.set(testOverrideTombstoneTimeoutKey, 1337); // Should be ignored\n\t\t\tconst metadata: IGCMetadata & IGCMetadata_Deprecated = {\n\t\t\t\tsweepTimeoutMs: 789, // Snapshot was generated by code built before the rename\n\t\t\t};\n\t\t\tgc = createGcWithPrivateMembers(metadata);\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs,\n\t\t\t\tundefined,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert.equal(gc.sessionExpiryTimer, undefined, \"sessionExpiryTimer incorrect\");\n\t\t\tassert.equal(gc.configs.tombstoneTimeoutMs, 789, \"tombstoneTimeoutMs incorrect\");\n\t\t});\n\t\tit(\"RunSessionExpiry setting turned off\", () => {\n\t\t\tconfigProvider.set(runSessionExpiryKey, false);\n\t\t\tconfigProvider.set(testOverrideSessionExpiryMsKey, 123); // This override should be ignored\n\t\t\tgc = createGcWithPrivateMembers();\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs,\n\t\t\t\tundefined,\n\t\t\t\t\"sessionExpiryTimeoutMs should be undefined if runSessionExpiryKey setting is false\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tgc.sessionExpiryTimer,\n\t\t\t\tundefined,\n\t\t\t\t\"sessionExpiryTimer should be undefined if it's disabled\",\n\t\t\t);\n\t\t\tassert.equal(gc.configs.tombstoneTimeoutMs, undefined, \"tombstoneTimeoutMs incorrect\");\n\t\t});\n\t\tit(\"RunSessionExpiry setting turned off, TestOverride.TombstoneTimeoutMs set\", () => {\n\t\t\tconfigProvider.set(runSessionExpiryKey, false);\n\t\t\tconfigProvider.set(testOverrideTombstoneTimeoutKey, 7890);\n\t\t\tconfigProvider.set(testOverrideSessionExpiryMsKey, 123); // This override should be ignored\n\t\t\tgc = createGcWithPrivateMembers();\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs,\n\t\t\t\tundefined,\n\t\t\t\t\"sessionExpiryTimeoutMs should be undefined if runSessionExpiryKey setting is false\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tgc.sessionExpiryTimer,\n\t\t\t\tundefined,\n\t\t\t\t\"sessionExpiryTimer should be undefined if it's disabled\",\n\t\t\t);\n\t\t\tassert.equal(gc.configs.tombstoneTimeoutMs, 7890, \"tombstoneTimeoutMs incorrect\");\n\t\t});\n\n\t\tfunction testSessionExpiryMsOverride() {\n\t\t\tconst expectedTombstoneTimeoutMs = defaultSessionExpiryDurationMs + 6 * oneDayMs;\n\t\t\tassert(!!gc, \"PRECONDITION: gc must be set before calling this helper\");\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.sessionExpiryTimeoutMs,\n\t\t\t\tdefaultSessionExpiryDurationMs,\n\t\t\t\t\"sessionExpiryTimeoutMs incorrect\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tgc.sessionExpiryTimer.defaultTimeout,\n\t\t\t\t789,\n\t\t\t\t\"sessionExpiry used for timer should be the override value\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tgc.configs.tombstoneTimeoutMs,\n\t\t\t\texpectedTombstoneTimeoutMs,\n\t\t\t\t\"tombstoneTimeoutMs incorrect\",\n\t\t\t);\n\n\t\t\tconst expectedMetadata: IGCMetadata = {\n\t\t\t\tsweepEnabled: false,\n\t\t\t\tgcFeature: stableGCVersion,\n\t\t\t\tsessionExpiryTimeoutMs: defaultSessionExpiryDurationMs,\n\t\t\t\ttombstoneTimeoutMs: expectedTombstoneTimeoutMs,\n\t\t\t\tgcFeatureMatrix: undefined,\n\t\t\t};\n\t\t\tconst outputMetadata = gc.getMetadata();\n\t\t\tassert.deepEqual(\n\t\t\t\toutputMetadata,\n\t\t\t\texpectedMetadata,\n\t\t\t\t\"getMetadata returned different metadata than expected\",\n\t\t\t);\n\t\t}\n\t\tit(\"TestOverride.SessionExpiryMs setting applied to timeout but not written to file - New Container\", () => {\n\t\t\tconfigProvider.set(testOverrideSessionExpiryMsKey, 789);\n\t\t\tgc = createGcWithPrivateMembers();\n\t\t\ttestSessionExpiryMsOverride();\n\t\t});\n\t\tit(\"TestOverride.SessionExpiryMs setting applied to timeout but not written to file - Existing Container\", () => {\n\t\t\tconfigProvider.set(testOverrideSessionExpiryMsKey, 789);\n\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\t{\n\t\t\t\t\tsessionExpiryTimeoutMs: defaultSessionExpiryDurationMs,\n\t\t\t\t\tgcFeature: 1,\n\t\t\t\t} /* metadata */,\n\t\t\t);\n\t\t\ttestSessionExpiryMsOverride();\n\t\t});\n\t});\n\n\tdescribe(\"Session Behavior (e.g. 'shouldRun' fields)\", () => {\n\t\tbeforeEach(() => {\n\t\t\tconfigProvider.set(\"Fluid.GarbageCollection.TestOverride.InactiveTimeoutMs\", 1); // To ensure it's less than tombstone timeout\n\t\t});\n\n\t\tdescribe(\"shouldRunGC\", () => {\n\t\t\tconst testCases: {\n\t\t\t\tgcEnabled: boolean;\n\t\t\t\tdisableGC?: boolean;\n\t\t\t\trunGC?: boolean;\n\t\t\t\texpectedResult: boolean;\n\t\t\t}[] = [\n\t\t\t\t{ gcEnabled: false, disableGC: true, runGC: true, expectedResult: true },\n\t\t\t\t{ gcEnabled: true, disableGC: false, runGC: false, expectedResult: false },\n\t\t\t\t{ gcEnabled: true, disableGC: true, expectedResult: false },\n\t\t\t\t{ gcEnabled: true, disableGC: false, expectedResult: true },\n\t\t\t\t{ gcEnabled: true, expectedResult: true },\n\t\t\t\t{ gcEnabled: false, expectedResult: false },\n\t\t\t];\n\t\t\ttestCases.forEach((testCase) => {\n\t\t\t\tit(`Test Case ${JSON.stringify(testCase)}`, () => {\n\t\t\t\t\tconfigProvider.set(runGCKey, testCase.runGC);\n\t\t\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, {\n\t\t\t\t\t\tgcAllowed: testCase.gcEnabled,\n\t\t\t\t\t\tdisableGC: testCase.disableGC,\n\t\t\t\t\t});\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tgc.configs.gcEnabled,\n\t\t\t\t\t\ttestCase.gcEnabled,\n\t\t\t\t\t\t\"PRECONDITION: gcEnabled set incorrectly\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tgc.configs.shouldRunGC,\n\t\t\t\t\t\ttestCase.expectedResult,\n\t\t\t\t\t\t\"shouldRunGC not set as expected\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit(\"shouldRunGC should be true when gcVersionInEffect is newer than gcVersionInBaseSnapshot\", () => {\n\t\t\t\tconst gcVersionInBaseSnapshot = stableGCVersion - 1;\n\t\t\t\tgc = createGcWithPrivateMembers({ gcFeature: gcVersionInBaseSnapshot });\n\t\t\t\tassert.equal(gc.configs.gcEnabled, true, \"PRECONDITION: gcEnabled set incorrectly\");\n\t\t\t\tassert.equal(gc.configs.shouldRunGC, true, \"shouldRunGC should be true\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tgc.configs.gcVersionInBaseSnapshot,\n\t\t\t\t\tgcVersionInBaseSnapshot,\n\t\t\t\t\t\"gcVersionInBaseSnapshot set incorrectly\",\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit(\"shouldRunGC should be false when gcVersionInEffect is older than gcVersionInBaseSnapshot\", () => {\n\t\t\t\tconst gcVersionInBaseSnapshot = nextGCVersion + 1;\n\t\t\t\tgc = createGcWithPrivateMembers({ gcFeature: gcVersionInBaseSnapshot });\n\t\t\t\tassert.equal(gc.configs.gcEnabled, true, \"PRECONDITION: gcEnabled set incorrectly\");\n\t\t\t\tassert.equal(gc.configs.shouldRunGC, false, \"shouldRunGC should be false\");\n\t\t\t\tassert.equal(\n\t\t\t\t\tgc.configs.gcVersionInBaseSnapshot,\n\t\t\t\t\tgcVersionInBaseSnapshot,\n\t\t\t\t\t\"gcVersionInBaseSnapshot set incorrectly\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t\tdescribe(\"shouldRunSweep\", () => {\n\t\t\tconst testCases: {\n\t\t\t\tshouldRunGC: boolean;\n\t\t\t\tsweepEnabled_doc: boolean;\n\t\t\t\tsweepEnabled_session: boolean;\n\t\t\t\tdisableDataStoreSweep?: \"viaGCOption\" | \"viaConfigProvider\";\n\t\t\t\tshouldRunSweep?: boolean;\n\t\t\t\texpectedShouldRunSweep: IGarbageCollectorConfigs[\"shouldRunSweep\"];\n\t\t\t}[] = [\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: false, // Veto\n\t\t\t\t\tsweepEnabled_doc: true,\n\t\t\t\t\tsweepEnabled_session: true,\n\t\t\t\t\tdisableDataStoreSweep: \"viaGCOption\",\n\t\t\t\t\tshouldRunSweep: true,\n\t\t\t\t\texpectedShouldRunSweep: \"NO\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\tsweepEnabled_doc: false, // Veto\n\t\t\t\t\tsweepEnabled_session: true,\n\t\t\t\t\tdisableDataStoreSweep: \"viaGCOption\",\n\t\t\t\t\texpectedShouldRunSweep: \"NO\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\tsweepEnabled_doc: true,\n\t\t\t\t\tsweepEnabled_session: false, // Veto\n\t\t\t\t\tdisableDataStoreSweep: \"viaGCOption\",\n\t\t\t\t\texpectedShouldRunSweep: \"NO\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\tsweepEnabled_doc: true,\n\t\t\t\t\tsweepEnabled_session: true,\n\t\t\t\t\tshouldRunSweep: false, // Veto\n\t\t\t\t\tdisableDataStoreSweep: \"viaGCOption\",\n\t\t\t\t\texpectedShouldRunSweep: \"NO\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\tsweepEnabled_doc: true,\n\t\t\t\t\tsweepEnabled_session: false, // Overriden by shouldRunSweep\n\t\t\t\t\tshouldRunSweep: true,\n\t\t\t\t\texpectedShouldRunSweep: \"YES\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\tsweepEnabled_doc: true,\n\t\t\t\t\tsweepEnabled_session: true,\n\t\t\t\t\texpectedShouldRunSweep: \"YES\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\tsweepEnabled_doc: true,\n\t\t\t\t\tsweepEnabled_session: true,\n\t\t\t\t\tdisableDataStoreSweep: \"viaGCOption\",\n\t\t\t\t\texpectedShouldRunSweep: \"ONLY_BLOBS\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\tsweepEnabled_doc: true,\n\t\t\t\t\tsweepEnabled_session: true,\n\t\t\t\t\tdisableDataStoreSweep: \"viaConfigProvider\",\n\t\t\t\t\texpectedShouldRunSweep: \"ONLY_BLOBS\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\tsweepEnabled_doc: true,\n\t\t\t\t\tsweepEnabled_session: true,\n\t\t\t\t\tshouldRunSweep: true,\n\t\t\t\t\tdisableDataStoreSweep: \"viaGCOption\", // Applies after shouldRunSweep\n\t\t\t\t\texpectedShouldRunSweep: \"ONLY_BLOBS\",\n\t\t\t\t},\n\t\t\t];\n\t\t\ttestCases.forEach((testCase, index) => {\n\t\t\t\tit(`Test Case ${JSON.stringify(testCase)}`, () => {\n\t\t\t\t\tconfigProvider.set(runGCKey, testCase.shouldRunGC);\n\t\t\t\t\tconfigProvider.set(runSweepKey, testCase.shouldRunSweep);\n\t\t\t\t\tconfigProvider.set(\n\t\t\t\t\t\tdisableDatastoreSweepKey,\n\t\t\t\t\t\ttestCase.disableDataStoreSweep === \"viaConfigProvider\",\n\t\t\t\t\t);\n\t\t\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tgcFeatureMatrix: { gcGeneration: 1 },\n\t\t\t\t\t\t\tsessionExpiryTimeoutMs: defaultSessionExpiryDurationMs,\n\t\t\t\t\t\t} /* metadata */,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[gcDisableDataStoreSweepOptionName]:\n\t\t\t\t\t\t\t\ttestCase.disableDataStoreSweep === \"viaGCOption\",\n\t\t\t\t\t\t\tenableGCSweep: testCase.sweepEnabled_session ? true : undefined,\n\t\t\t\t\t\t\t[gcGenerationOptionName]: testCase.sweepEnabled_doc ? 1 : 2,\n\t\t\t\t\t\t} /* gcOptions */,\n\t\t\t\t\t);\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tgc.configs.shouldRunGC,\n\t\t\t\t\t\ttestCase.shouldRunGC,\n\t\t\t\t\t\t\"PRECONDITION: shouldRunGC set incorrectly\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tgc.configs.sweepEnabled,\n\t\t\t\t\t\ttestCase.sweepEnabled_doc,\n\t\t\t\t\t\t\"PRECONDITION: sweepEnabled set incorrectly\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tgc.configs.shouldRunSweep,\n\t\t\t\t\t\ttestCase.expectedShouldRunSweep,\n\t\t\t\t\t\t`shouldRunSweep not set as expected`,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t\tdescribe(\"inactiveTimeoutMs\", () => {\n\t\t\tbeforeEach(() => {\n\t\t\t\t// Remove setting added in outer describe block\n\t\t\t\tconfigProvider.set(\n\t\t\t\t\t\"Fluid.GarbageCollection.TestOverride.InactiveTimeoutMs\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t});\n\t\t\tconst testCases: {\n\t\t\t\ttestOverride?: number;\n\t\t\t\toption?: number;\n\t\t\t\texpectedResult: number;\n\t\t\t}[] = [\n\t\t\t\t{ testOverride: 123, option: 456, expectedResult: 123 },\n\t\t\t\t{ option: 456, expectedResult: 456 },\n\t\t\t\t{ expectedResult: defaultInactiveTimeoutMs },\n\t\t\t];\n\t\t\ttestCases.forEach((testCase) => {\n\t\t\t\tit(`Test Case ${JSON.stringify(testCase)}`, () => {\n\t\t\t\t\tconfigProvider.set(\n\t\t\t\t\t\t\"Fluid.GarbageCollection.TestOverride.InactiveTimeoutMs\",\n\t\t\t\t\t\ttestCase.testOverride,\n\t\t\t\t\t);\n\t\t\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, {\n\t\t\t\t\t\tinactiveTimeoutMs: testCase.option,\n\t\t\t\t\t});\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tgc.configs.inactiveTimeoutMs,\n\t\t\t\t\t\ttestCase.expectedResult,\n\t\t\t\t\t\t\"inactiveTimeoutMs not set as expected\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t\tit(\"inactiveTimeout must not be greater than tombstoneTimeout\", () => {\n\t\t\t\tconfigProvider.set(\n\t\t\t\t\t\"Fluid.GarbageCollection.TestOverride.InactiveTimeoutMs\",\n\t\t\t\t\tNumber.MAX_VALUE,\n\t\t\t\t);\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => {\n\t\t\t\t\t\tgc = createGcWithPrivateMembers();\n\t\t\t\t\t},\n\t\t\t\t\t(e: IErrorBase) => e.errorType === \"usageError\",\n\t\t\t\t\t\"inactiveTimeout must not be greater than tombstoneTimeout\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t\tdescribe(\"sweepGracePeriodMs\", () => {\n\t\t\tconst testCases: {\n\t\t\t\toption: number | undefined;\n\t\t\t\texpectedResult: number;\n\t\t\t}[] = [\n\t\t\t\t{ option: 123, expectedResult: 123 },\n\t\t\t\t{ option: 0, expectedResult: 0 },\n\t\t\t\t{ option: undefined, expectedResult: defaultSweepGracePeriodMs },\n\t\t\t];\n\t\t\ttestCases.forEach((testCase) => {\n\t\t\t\tit(`Test Case ${JSON.stringify(testCase)}`, () => {\n\t\t\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\t\t\t{} /* metadata */,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsweepGracePeriodMs: testCase.option,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tassert.equal(gc.configs.sweepGracePeriodMs, testCase.expectedResult);\n\t\t\t\t});\n\t\t\t});\n\t\t\tit(\"sweepGracePeriodMs must be non-negative\", () => {\n\t\t\t\tassert.throws(\n\t\t\t\t\t() => {\n\t\t\t\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\t\t\t\t{} /* metadata */,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsweepGracePeriodMs: -1,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\t(e: IErrorBase) => e.errorType === \"usageError\",\n\t\t\t\t\t\"sweepGracePeriodMs must be non-negative\",\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\t\tdescribe(\"testMode\", () => {\n\t\t\tconst testCases: {\n\t\t\t\tsetting?: boolean;\n\t\t\t\toption?: boolean;\n\t\t\t\texpectedResult: boolean;\n\t\t\t}[] = [\n\t\t\t\t{ setting: true, option: false, expectedResult: true },\n\t\t\t\t{ setting: false, option: true, expectedResult: false },\n\t\t\t\t{ option: true, expectedResult: true },\n\t\t\t\t{ expectedResult: false },\n\t\t\t];\n\t\t\ttestCases.forEach((testCase) => {\n\t\t\t\tit(`Test Case ${JSON.stringify(testCase)}`, () => {\n\t\t\t\t\tconfigProvider.set(gcTestModeKey, testCase.setting);\n\t\t\t\t\tgc = createGcWithPrivateMembers(undefined /* metadata */, {\n\t\t\t\t\t\trunGCInTestMode: testCase.option,\n\t\t\t\t\t});\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tgc.configs.testMode,\n\t\t\t\t\t\ttestCase.expectedResult,\n\t\t\t\t\t\t\"testMode not set as expected\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"throwOnTombstoneLoad (using new container)\", () => {\n\t\tbeforeEach(() => {\n\t\t\tconfigProvider.set(testOverrideSessionExpiryMsKey, defaultSessionExpiryDurationMs); // Required for sweep to be enabled\n\t\t});\n\t\tit(\"gcDisableThrowOnTombstoneLoad true\", () => {\n\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\tundefined /* metadata */,\n\t\t\t\t{ enableGCSweep: true, [gcDisableThrowOnTombstoneLoadOptionName]: true },\n\t\t\t\tfalse /* isSummarizerClient */,\n\t\t\t);\n\t\t\tassert.equal(gc.configs.throwOnTombstoneLoad, false, \"throwOnTombstoneLoad incorrect\");\n\t\t});\n\t\tit(\"gcDisableThrowOnTombstoneLoad false\", () => {\n\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\tundefined /* metadata */,\n\t\t\t\t{ enableGCSweep: true, [gcDisableThrowOnTombstoneLoadOptionName]: false },\n\t\t\t\tfalse /* isSummarizerClient */,\n\t\t\t);\n\t\t\tassert.equal(gc.configs.throwOnTombstoneLoad, true, \"throwOnTombstoneLoad incorrect\");\n\t\t});\n\t\tit(\"gcDisableThrowOnTombstoneLoad undefined\", () => {\n\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\tundefined /* metadata */,\n\t\t\t\t{\n\t\t\t\t\tenableGCSweep: true,\n\t\t\t\t\t[gcDisableThrowOnTombstoneLoadOptionName]: undefined,\n\t\t\t\t},\n\t\t\t\tfalse /* isSummarizerClient */,\n\t\t\t);\n\t\t\tassert.equal(gc.configs.throwOnTombstoneLoad, true, \"throwOnTombstoneLoad incorrect\");\n\t\t});\n\t\tit(\"gcDisableThrowOnTombstoneLoad undefined - Sweep Disabled does not interfere\", () => {\n\t\t\tconfigProvider.set(runSweepKey, false); // Disable Sweep\n\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\tundefined /* metadata */,\n\t\t\t\t{ [gcDisableThrowOnTombstoneLoadOptionName]: undefined },\n\t\t\t\tfalse /* isSummarizerClient */,\n\t\t\t);\n\t\t\tassert.equal(gc.configs.throwOnTombstoneLoad, true, \"throwOnTombstoneLoad incorrect\");\n\t\t});\n\t\tit(\"Old 'enable' option false (ignored)\", () => {\n\t\t\tconst gcThrowOnTombstoneLoadOptionName_old = \"gcThrowOnTombstoneLoad\";\n\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\tundefined /* metadata */,\n\t\t\t\t{ enableGCSweep: true, [gcThrowOnTombstoneLoadOptionName_old]: false },\n\t\t\t\tfalse /* isSummarizerClient */,\n\t\t\t);\n\t\t\tassert.equal(gc.configs.throwOnTombstoneLoad, true, \"throwOnTombstoneLoad incorrect\");\n\t\t});\n\t\tit(\"throwOnTombstoneLoad enabled via override\", () => {\n\t\t\tconfigProvider.set(throwOnTombstoneLoadOverrideKey, true);\n\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\tundefined /* metadata */,\n\t\t\t\t{ enableGCSweep: true, [gcDisableThrowOnTombstoneLoadOptionName]: true },\n\t\t\t\tfalse /* isSummarizerClient */,\n\t\t\t);\n\t\t\tassert.equal(gc.configs.throwOnTombstoneLoad, true, \"throwOnTombstoneLoad incorrect\");\n\t\t});\n\t\tit(\"throwOnTombstoneLoad disabled via override\", () => {\n\t\t\tconfigProvider.set(throwOnTombstoneLoadOverrideKey, false);\n\t\t\tgc = createGcWithPrivateMembers(\n\t\t\t\tundefined /* metadata */,\n\t\t\t\t{ enableGCSweep: true, [gcDisableThrowOnTombstoneLoadOptionName]: false },\n\t\t\t\tfalse /* isSummarizerClient */,\n\t\t\t);\n\t\t\tassert.equal(gc.configs.throwOnTombstoneLoad, false, \"throwOnTombstoneLoad incorrect\");\n\t\t});\n\t});\n});\n"]}
@@ -1,110 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "assert";
6
- // eslint-disable-next-line import/no-internal-modules
7
- import { shouldAllowGcSweep } from "../../gc/gcHelpers.js";
8
- describe("Garbage Collection Helpers Tests", () => {
9
- describe("[TEMP] shouldAllowGcTombstoneEnforcement - Show behavior change as it's replaced by shouldAllowGcSweep", () => {
10
- const testCases = [
11
- {
12
- persisted: undefined,
13
- current: undefined,
14
- expectedShouldAllowValue: true,
15
- },
16
- {
17
- persisted: undefined,
18
- current: 1,
19
- expectedShouldAllowValue: false,
20
- },
21
- {
22
- persisted: 1,
23
- current: undefined,
24
- expectedShouldAllowValue: true,
25
- },
26
- {
27
- persisted: 1,
28
- current: 1,
29
- expectedShouldAllowValue: true,
30
- },
31
- {
32
- persisted: 1,
33
- current: 2,
34
- expectedShouldAllowValue: false,
35
- },
36
- {
37
- persisted: 2,
38
- current: 1,
39
- expectedShouldAllowValue: false,
40
- },
41
- ];
42
- testCases.forEach(({ persisted, current, expectedShouldAllowValue }) => {
43
- it(`persisted=${persisted}, current=${current}`, () => {
44
- const shouldAllow = shouldAllowGcSweep({ tombstoneGeneration: persisted }, current);
45
- assert.equal(shouldAllow, expectedShouldAllowValue);
46
- });
47
- });
48
- });
49
- describe("shouldAllowGcSweep", () => {
50
- const testCases = [
51
- {
52
- persisted: {},
53
- current: undefined,
54
- expectedShouldAllowValue: true,
55
- },
56
- {
57
- persisted: { gcGeneration: 1 },
58
- current: undefined,
59
- expectedShouldAllowValue: true,
60
- },
61
- {
62
- persisted: {},
63
- current: 0,
64
- expectedShouldAllowValue: false,
65
- },
66
- {
67
- persisted: { tombstoneGeneration: 0 },
68
- current: 0,
69
- expectedShouldAllowValue: true,
70
- },
71
- {
72
- persisted: { tombstoneGeneration: 1 },
73
- current: 1,
74
- expectedShouldAllowValue: true,
75
- },
76
- {
77
- persisted: { tombstoneGeneration: 1 },
78
- current: 0,
79
- expectedShouldAllowValue: false,
80
- },
81
- {
82
- persisted: { gcGeneration: 0 },
83
- current: 0,
84
- expectedShouldAllowValue: true,
85
- },
86
- {
87
- persisted: { gcGeneration: 1 },
88
- current: 1,
89
- expectedShouldAllowValue: true,
90
- },
91
- {
92
- persisted: { gcGeneration: 1 },
93
- current: 2,
94
- expectedShouldAllowValue: false,
95
- },
96
- {
97
- persisted: { gcGeneration: 2 },
98
- current: 1,
99
- expectedShouldAllowValue: false,
100
- },
101
- ];
102
- testCases.forEach(({ persisted, current, expectedShouldAllowValue }) => {
103
- it(`persisted=${JSON.stringify(persisted)}, current=${current}`, () => {
104
- const shouldAllow = shouldAllowGcSweep(persisted, current);
105
- assert.equal(shouldAllow, expectedShouldAllowValue);
106
- });
107
- });
108
- });
109
- });
110
- //# sourceMappingURL=gcHelpers.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gcHelpers.spec.js","sourceRoot":"","sources":["../../../src/test/gc/gcHelpers.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { GCFeatureMatrix } from \"../../gc/index.js\";\n// eslint-disable-next-line import/no-internal-modules\nimport { shouldAllowGcSweep } from \"../../gc/gcHelpers.js\";\n\ndescribe(\"Garbage Collection Helpers Tests\", () => {\n\tdescribe(\"[TEMP] shouldAllowGcTombstoneEnforcement - Show behavior change as it's replaced by shouldAllowGcSweep\", () => {\n\t\tconst testCases: {\n\t\t\tpersisted: number | undefined;\n\t\t\tcurrent: number | undefined;\n\t\t\texpectedShouldAllowValue: boolean;\n\t\t}[] = [\n\t\t\t{\n\t\t\t\tpersisted: undefined,\n\t\t\t\tcurrent: undefined,\n\t\t\t\texpectedShouldAllowValue: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: undefined,\n\t\t\t\tcurrent: 1,\n\t\t\t\texpectedShouldAllowValue: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: 1,\n\t\t\t\tcurrent: undefined,\n\t\t\t\texpectedShouldAllowValue: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: 1,\n\t\t\t\tcurrent: 1,\n\t\t\t\texpectedShouldAllowValue: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: 1,\n\t\t\t\tcurrent: 2,\n\t\t\t\texpectedShouldAllowValue: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: 2,\n\t\t\t\tcurrent: 1,\n\t\t\t\texpectedShouldAllowValue: false,\n\t\t\t},\n\t\t];\n\t\ttestCases.forEach(({ persisted, current, expectedShouldAllowValue }) => {\n\t\t\tit(`persisted=${persisted}, current=${current}`, () => {\n\t\t\t\tconst shouldAllow = shouldAllowGcSweep({ tombstoneGeneration: persisted }, current);\n\t\t\t\tassert.equal(shouldAllow, expectedShouldAllowValue);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"shouldAllowGcSweep\", () => {\n\t\tconst testCases: {\n\t\t\tpersisted: GCFeatureMatrix;\n\t\t\tcurrent: number | undefined;\n\t\t\texpectedShouldAllowValue: boolean;\n\t\t}[] = [\n\t\t\t{\n\t\t\t\tpersisted: {},\n\t\t\t\tcurrent: undefined,\n\t\t\t\texpectedShouldAllowValue: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: { gcGeneration: 1 },\n\t\t\t\tcurrent: undefined,\n\t\t\t\texpectedShouldAllowValue: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: {},\n\t\t\t\tcurrent: 0,\n\t\t\t\texpectedShouldAllowValue: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: { tombstoneGeneration: 0 },\n\t\t\t\tcurrent: 0,\n\t\t\t\texpectedShouldAllowValue: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: { tombstoneGeneration: 1 },\n\t\t\t\tcurrent: 1,\n\t\t\t\texpectedShouldAllowValue: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: { tombstoneGeneration: 1 },\n\t\t\t\tcurrent: 0,\n\t\t\t\texpectedShouldAllowValue: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: { gcGeneration: 0 },\n\t\t\t\tcurrent: 0,\n\t\t\t\texpectedShouldAllowValue: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: { gcGeneration: 1 },\n\t\t\t\tcurrent: 1,\n\t\t\t\texpectedShouldAllowValue: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: { gcGeneration: 1 },\n\t\t\t\tcurrent: 2,\n\t\t\t\texpectedShouldAllowValue: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpersisted: { gcGeneration: 2 },\n\t\t\t\tcurrent: 1,\n\t\t\t\texpectedShouldAllowValue: false,\n\t\t\t},\n\t\t];\n\t\ttestCases.forEach(({ persisted, current, expectedShouldAllowValue }) => {\n\t\t\tit(`persisted=${JSON.stringify(persisted)}, current=${current}`, () => {\n\t\t\t\tconst shouldAllow = shouldAllowGcSweep(persisted, current);\n\t\t\t\tassert.equal(shouldAllow, expectedShouldAllowValue);\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
@@ -1,68 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "assert";
6
- import { runGarbageCollection } from "../../gc/index.js";
7
- describe("Garbage Collector", () => {
8
- function runGCAndValidateResults(gcNodes, startingIds, deletedNodes) {
9
- const referenceGraph = {};
10
- for (const node of gcNodes) {
11
- referenceGraph[node.id] = node.outboundRoutes;
12
- }
13
- // Referenced nodes are all nodes in the gcNodes that are not in deletedNodes.
14
- const referencedNodes = gcNodes.filter((node) => !deletedNodes.includes(node));
15
- const referencedNodeIds = Array.from(referencedNodes, (node) => node.id);
16
- const deletedNodeIds = Array.from(deletedNodes, (node) => node.id);
17
- const gcResult = runGarbageCollection(referenceGraph, startingIds);
18
- assert.deepStrictEqual(gcResult.referencedNodeIds.sort(), referencedNodeIds.sort(), "Referenced nodes generated by GC are incorrect");
19
- assert.deepStrictEqual(gcResult.deletedNodeIds.sort(), deletedNodeIds.sort(), "Deleted nodes generated by GC are incorrect");
20
- }
21
- it("should not collect nodes when all nodes are referenced", () => {
22
- const gcNode1 = { id: "/", outboundRoutes: ["/ds1"] };
23
- const gcNode2 = { id: "/ds1", outboundRoutes: ["/ds1/dds1"] };
24
- const gcNode3 = { id: "/ds2", outboundRoutes: [] };
25
- const gcNode4 = { id: "/ds1/dds1", outboundRoutes: ["/ds2"] };
26
- const gcNodes = [gcNode1, gcNode2, gcNode3, gcNode4];
27
- const deletedNodes = [];
28
- runGCAndValidateResults(gcNodes, ["/"], deletedNodes);
29
- });
30
- it("should collect nodes that are not referenced", () => {
31
- const gcNode1 = { id: "/", outboundRoutes: ["/ds1"] };
32
- const gcNode2 = { id: "/ds1", outboundRoutes: ["/ds1/dds1"] };
33
- const gcNode3 = { id: "/ds1/dds1", outboundRoutes: [] };
34
- // The following nodes are not referenced by any of the nodes above.
35
- const gcNode4 = { id: "/ds2", outboundRoutes: ["/ds2/dds1"] };
36
- const gcNode5 = { id: "/ds2/dds1", outboundRoutes: [] };
37
- const gcNodes = [gcNode1, gcNode2, gcNode3, gcNode4, gcNode5];
38
- const deletedNodes = [gcNode4, gcNode5];
39
- runGCAndValidateResults(gcNodes, ["/"], deletedNodes);
40
- });
41
- it("should collect nodes with cycles in the graph", () => {
42
- const gcNode1 = { id: "/", outboundRoutes: ["/ds1"] };
43
- const gcNode2 = { id: "/ds1", outboundRoutes: ["/ds1/dds1"] };
44
- const gcNode3 = { id: "/ds2", outboundRoutes: ["/ds2/dds1"] };
45
- const gcNode4 = { id: "/ds1/dds1", outboundRoutes: ["/ds2", "/ds1"] };
46
- const gcNode5 = { id: "/ds2/dds1", outboundRoutes: ["/ds1", "/ds2"] };
47
- // The following node is not referenced by any of the nodes above.
48
- const gcNode6 = { id: "/ds3", outboundRoutes: [] };
49
- const gcNodes = [gcNode1, gcNode2, gcNode3, gcNode4, gcNode5, gcNode6];
50
- const deletedNodes = [gcNode6];
51
- runGCAndValidateResults(gcNodes, ["/"], deletedNodes);
52
- });
53
- it("should collect nodes with multiple starting ids", () => {
54
- const gcNode1 = { id: "/", outboundRoutes: ["/ds1"] };
55
- const gcNode2 = { id: "/ds1", outboundRoutes: ["/ds1/dds1"] };
56
- const gcNode3 = { id: "/ds1/dds1", outboundRoutes: [] };
57
- // The following node is not referenced by any of the nodes above. But its id will be given as starting id to
58
- // GC, so it will be referenced.
59
- const gcNode4 = { id: "/ds2", outboundRoutes: ["/ds2/dds1"] };
60
- const gcNode5 = { id: "/ds2/dds1", outboundRoutes: [] };
61
- // The following node is not referenced by any of the nodes above.
62
- const gcNode6 = { id: "/ds3", outboundRoutes: [] };
63
- const gcNodes = [gcNode1, gcNode2, gcNode3, gcNode4, gcNode5, gcNode6];
64
- const deletedNodes = [gcNode6];
65
- runGCAndValidateResults(gcNodes, ["/", "/ds2"], deletedNodes);
66
- });
67
- });
68
- //# sourceMappingURL=gcReferenceGraphAlgorithm.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gcReferenceGraphAlgorithm.spec.js","sourceRoot":"","sources":["../../../src/test/gc/gcReferenceGraphAlgorithm.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { IGCResult, runGarbageCollection } from \"../../gc/index.js\";\n\ninterface IGCNode {\n\tid: string;\n\toutboundRoutes: string[];\n}\n\ndescribe(\"Garbage Collector\", () => {\n\tfunction runGCAndValidateResults(\n\t\tgcNodes: IGCNode[],\n\t\tstartingIds: string[],\n\t\tdeletedNodes: IGCNode[],\n\t) {\n\t\tconst referenceGraph: { [id: string]: string[] } = {};\n\t\tfor (const node of gcNodes) {\n\t\t\treferenceGraph[node.id] = node.outboundRoutes;\n\t\t}\n\n\t\t// Referenced nodes are all nodes in the gcNodes that are not in deletedNodes.\n\t\tconst referencedNodes = gcNodes.filter((node) => !deletedNodes.includes(node));\n\t\tconst referencedNodeIds = Array.from(referencedNodes, (node: IGCNode) => node.id);\n\t\tconst deletedNodeIds = Array.from(deletedNodes, (node: IGCNode) => node.id);\n\n\t\tconst gcResult: IGCResult = runGarbageCollection(referenceGraph, startingIds);\n\t\tassert.deepStrictEqual(\n\t\t\tgcResult.referencedNodeIds.sort(),\n\t\t\treferencedNodeIds.sort(),\n\t\t\t\"Referenced nodes generated by GC are incorrect\",\n\t\t);\n\t\tassert.deepStrictEqual(\n\t\t\tgcResult.deletedNodeIds.sort(),\n\t\t\tdeletedNodeIds.sort(),\n\t\t\t\"Deleted nodes generated by GC are incorrect\",\n\t\t);\n\t}\n\n\tit(\"should not collect nodes when all nodes are referenced\", () => {\n\t\tconst gcNode1: IGCNode = { id: \"/\", outboundRoutes: [\"/ds1\"] };\n\t\tconst gcNode2: IGCNode = { id: \"/ds1\", outboundRoutes: [\"/ds1/dds1\"] };\n\t\tconst gcNode3: IGCNode = { id: \"/ds2\", outboundRoutes: [] };\n\t\tconst gcNode4: IGCNode = { id: \"/ds1/dds1\", outboundRoutes: [\"/ds2\"] };\n\n\t\tconst gcNodes = [gcNode1, gcNode2, gcNode3, gcNode4];\n\t\tconst deletedNodes = [];\n\n\t\trunGCAndValidateResults(gcNodes, [\"/\"], deletedNodes);\n\t});\n\n\tit(\"should collect nodes that are not referenced\", () => {\n\t\tconst gcNode1: IGCNode = { id: \"/\", outboundRoutes: [\"/ds1\"] };\n\t\tconst gcNode2: IGCNode = { id: \"/ds1\", outboundRoutes: [\"/ds1/dds1\"] };\n\t\tconst gcNode3: IGCNode = { id: \"/ds1/dds1\", outboundRoutes: [] };\n\t\t// The following nodes are not referenced by any of the nodes above.\n\t\tconst gcNode4: IGCNode = { id: \"/ds2\", outboundRoutes: [\"/ds2/dds1\"] };\n\t\tconst gcNode5: IGCNode = { id: \"/ds2/dds1\", outboundRoutes: [] };\n\n\t\tconst gcNodes = [gcNode1, gcNode2, gcNode3, gcNode4, gcNode5];\n\t\tconst deletedNodes = [gcNode4, gcNode5];\n\n\t\trunGCAndValidateResults(gcNodes, [\"/\"], deletedNodes);\n\t});\n\n\tit(\"should collect nodes with cycles in the graph\", () => {\n\t\tconst gcNode1: IGCNode = { id: \"/\", outboundRoutes: [\"/ds1\"] };\n\t\tconst gcNode2: IGCNode = { id: \"/ds1\", outboundRoutes: [\"/ds1/dds1\"] };\n\t\tconst gcNode3: IGCNode = { id: \"/ds2\", outboundRoutes: [\"/ds2/dds1\"] };\n\t\tconst gcNode4: IGCNode = { id: \"/ds1/dds1\", outboundRoutes: [\"/ds2\", \"/ds1\"] };\n\t\tconst gcNode5: IGCNode = { id: \"/ds2/dds1\", outboundRoutes: [\"/ds1\", \"/ds2\"] };\n\t\t// The following node is not referenced by any of the nodes above.\n\t\tconst gcNode6: IGCNode = { id: \"/ds3\", outboundRoutes: [] };\n\n\t\tconst gcNodes = [gcNode1, gcNode2, gcNode3, gcNode4, gcNode5, gcNode6];\n\t\tconst deletedNodes = [gcNode6];\n\n\t\trunGCAndValidateResults(gcNodes, [\"/\"], deletedNodes);\n\t});\n\n\tit(\"should collect nodes with multiple starting ids\", () => {\n\t\tconst gcNode1: IGCNode = { id: \"/\", outboundRoutes: [\"/ds1\"] };\n\t\tconst gcNode2: IGCNode = { id: \"/ds1\", outboundRoutes: [\"/ds1/dds1\"] };\n\t\tconst gcNode3: IGCNode = { id: \"/ds1/dds1\", outboundRoutes: [] };\n\t\t// The following node is not referenced by any of the nodes above. But its id will be given as starting id to\n\t\t// GC, so it will be referenced.\n\t\tconst gcNode4: IGCNode = { id: \"/ds2\", outboundRoutes: [\"/ds2/dds1\"] };\n\t\tconst gcNode5: IGCNode = { id: \"/ds2/dds1\", outboundRoutes: [] };\n\t\t// The following node is not referenced by any of the nodes above.\n\t\tconst gcNode6: IGCNode = { id: \"/ds3\", outboundRoutes: [] };\n\n\t\tconst gcNodes = [gcNode1, gcNode2, gcNode3, gcNode4, gcNode5, gcNode6];\n\t\tconst deletedNodes = [gcNode6];\n\n\t\trunGCAndValidateResults(gcNodes, [\"/\", \"/ds2\"], deletedNodes);\n\t});\n});\n"]}