@fluidframework/container-runtime 2.0.0-dev-rc.2.0.0.246488 → 2.0.0-dev-rc.3.0.0.250606

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 (456) hide show
  1. package/api-report/container-runtime.api.md +78 -25
  2. package/dist/batchTracker.d.ts +1 -1
  3. package/dist/batchTracker.d.ts.map +1 -1
  4. package/dist/batchTracker.js +2 -2
  5. package/dist/batchTracker.js.map +1 -1
  6. package/dist/blobManager.d.ts +3 -3
  7. package/dist/blobManager.d.ts.map +1 -1
  8. package/dist/blobManager.js +3 -3
  9. package/dist/blobManager.js.map +1 -1
  10. package/dist/channelCollection.d.ts +5 -5
  11. package/dist/channelCollection.d.ts.map +1 -1
  12. package/dist/channelCollection.js +44 -11
  13. package/dist/channelCollection.js.map +1 -1
  14. package/dist/connectionTelemetry.d.ts +2 -2
  15. package/dist/connectionTelemetry.d.ts.map +1 -1
  16. package/dist/connectionTelemetry.js +3 -3
  17. package/dist/connectionTelemetry.js.map +1 -1
  18. package/dist/container-runtime-alpha.d.ts +205 -11
  19. package/dist/container-runtime-beta.d.ts +16 -2
  20. package/dist/container-runtime-public.d.ts +16 -2
  21. package/dist/container-runtime-untrimmed.d.ts +205 -24
  22. package/dist/containerHandleContext.d.ts.map +1 -1
  23. package/dist/containerHandleContext.js.map +1 -1
  24. package/dist/containerRuntime.d.ts +32 -26
  25. package/dist/containerRuntime.d.ts.map +1 -1
  26. package/dist/containerRuntime.js +213 -119
  27. package/dist/containerRuntime.js.map +1 -1
  28. package/dist/dataStore.d.ts +1 -1
  29. package/dist/dataStore.d.ts.map +1 -1
  30. package/dist/dataStore.js +2 -2
  31. package/dist/dataStore.js.map +1 -1
  32. package/dist/dataStoreContext.d.ts +4 -4
  33. package/dist/dataStoreContext.d.ts.map +1 -1
  34. package/dist/dataStoreContext.js +18 -18
  35. package/dist/dataStoreContext.js.map +1 -1
  36. package/dist/dataStoreContexts.d.ts.map +1 -1
  37. package/dist/dataStoreContexts.js.map +1 -1
  38. package/dist/dataStoreRegistry.d.ts.map +1 -1
  39. package/dist/dataStoreRegistry.js.map +1 -1
  40. package/dist/deltaScheduler.d.ts +1 -1
  41. package/dist/deltaScheduler.d.ts.map +1 -1
  42. package/dist/deltaScheduler.js +1 -1
  43. package/dist/deltaScheduler.js.map +1 -1
  44. package/dist/gc/garbageCollection.d.ts +1 -1
  45. package/dist/gc/garbageCollection.d.ts.map +1 -1
  46. package/dist/gc/garbageCollection.js +1 -1
  47. package/dist/gc/garbageCollection.js.map +1 -1
  48. package/dist/gc/gcConfigs.d.ts +1 -1
  49. package/dist/gc/gcConfigs.d.ts.map +1 -1
  50. package/dist/gc/gcConfigs.js.map +1 -1
  51. package/dist/gc/gcDefinitions.d.ts +1 -1
  52. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  53. package/dist/gc/gcDefinitions.js.map +1 -1
  54. package/dist/gc/gcHelpers.d.ts.map +1 -1
  55. package/dist/gc/gcHelpers.js.map +1 -1
  56. package/dist/gc/gcSummaryStateTracker.d.ts +1 -1
  57. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  58. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  59. package/dist/gc/gcTelemetry.d.ts +1 -1
  60. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  61. package/dist/gc/gcTelemetry.js.map +1 -1
  62. package/dist/index.d.ts +2 -2
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +4 -2
  65. package/dist/index.js.map +1 -1
  66. package/dist/messageTypes.d.ts +11 -5
  67. package/dist/messageTypes.d.ts.map +1 -1
  68. package/dist/messageTypes.js +4 -0
  69. package/dist/messageTypes.js.map +1 -1
  70. package/dist/opLifecycle/definitions.d.ts +1 -19
  71. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  72. package/dist/opLifecycle/definitions.js.map +1 -1
  73. package/dist/opLifecycle/index.d.ts +3 -3
  74. package/dist/opLifecycle/index.d.ts.map +1 -1
  75. package/dist/opLifecycle/index.js +3 -1
  76. package/dist/opLifecycle/index.js.map +1 -1
  77. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  78. package/dist/opLifecycle/opCompressor.js +2 -3
  79. package/dist/opLifecycle/opCompressor.js.map +1 -1
  80. package/dist/opLifecycle/opDecompressor.d.ts +15 -4
  81. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  82. package/dist/opLifecycle/opDecompressor.js +60 -61
  83. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  84. package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
  85. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  86. package/dist/opLifecycle/opGroupingManager.js +9 -11
  87. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  88. package/dist/opLifecycle/opSplitter.d.ts +11 -3
  89. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  90. package/dist/opLifecycle/opSplitter.js +48 -38
  91. package/dist/opLifecycle/opSplitter.js.map +1 -1
  92. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  93. package/dist/opLifecycle/outbox.js +7 -12
  94. package/dist/opLifecycle/outbox.js.map +1 -1
  95. package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  96. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  97. package/dist/opLifecycle/remoteMessageProcessor.js +36 -35
  98. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  99. package/dist/packageVersion.d.ts +1 -1
  100. package/dist/packageVersion.js +1 -1
  101. package/dist/packageVersion.js.map +1 -1
  102. package/dist/pendingStateManager.d.ts +1 -1
  103. package/dist/pendingStateManager.d.ts.map +1 -1
  104. package/dist/pendingStateManager.js.map +1 -1
  105. package/dist/scheduleManager.d.ts +1 -1
  106. package/dist/scheduleManager.d.ts.map +1 -1
  107. package/dist/scheduleManager.js +2 -2
  108. package/dist/scheduleManager.js.map +1 -1
  109. package/dist/summary/documentSchema.d.ts +178 -0
  110. package/dist/summary/documentSchema.d.ts.map +1 -0
  111. package/dist/summary/documentSchema.js +345 -0
  112. package/dist/summary/documentSchema.js.map +1 -0
  113. package/dist/summary/index.d.ts +2 -1
  114. package/dist/summary/index.d.ts.map +1 -1
  115. package/dist/summary/index.js +4 -1
  116. package/dist/summary/index.js.map +1 -1
  117. package/dist/summary/orderedClientElection.d.ts +2 -2
  118. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  119. package/dist/summary/orderedClientElection.js +3 -2
  120. package/dist/summary/orderedClientElection.js.map +1 -1
  121. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
  122. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  123. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  124. package/dist/summary/runningSummarizer.d.ts +2 -2
  125. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  126. package/dist/summary/runningSummarizer.js +2 -2
  127. package/dist/summary/runningSummarizer.js.map +1 -1
  128. package/dist/summary/summarizer.d.ts +2 -2
  129. package/dist/summary/summarizer.d.ts.map +1 -1
  130. package/dist/summary/summarizer.js +2 -2
  131. package/dist/summary/summarizer.js.map +1 -1
  132. package/dist/summary/summarizerClientElection.d.ts +2 -2
  133. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  134. package/dist/summary/summarizerClientElection.js.map +1 -1
  135. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  136. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  137. package/dist/summary/summarizerHeuristics.js.map +1 -1
  138. package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -2
  139. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  140. package/dist/summary/summarizerNode/summarizerNode.js +3 -3
  141. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  142. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
  143. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  144. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  145. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
  146. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  147. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
  148. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  149. package/dist/summary/summarizerTypes.d.ts +3 -3
  150. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  151. package/dist/summary/summarizerTypes.js.map +1 -1
  152. package/dist/summary/summaryCollection.d.ts +2 -2
  153. package/dist/summary/summaryCollection.d.ts.map +1 -1
  154. package/dist/summary/summaryCollection.js +1 -1
  155. package/dist/summary/summaryCollection.js.map +1 -1
  156. package/dist/summary/summaryFormat.d.ts +5 -16
  157. package/dist/summary/summaryFormat.d.ts.map +1 -1
  158. package/dist/summary/summaryFormat.js.map +1 -1
  159. package/dist/summary/summaryGenerator.d.ts +2 -2
  160. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  161. package/dist/summary/summaryGenerator.js +2 -2
  162. package/dist/summary/summaryGenerator.js.map +1 -1
  163. package/dist/summary/summaryManager.d.ts +1 -1
  164. package/dist/summary/summaryManager.d.ts.map +1 -1
  165. package/dist/summary/summaryManager.js +2 -2
  166. package/dist/summary/summaryManager.js.map +1 -1
  167. package/lib/batchTracker.d.ts +1 -1
  168. package/lib/batchTracker.d.ts.map +1 -1
  169. package/lib/batchTracker.js +2 -2
  170. package/lib/batchTracker.js.map +1 -1
  171. package/lib/blobManager.d.ts +3 -3
  172. package/lib/blobManager.d.ts.map +1 -1
  173. package/lib/blobManager.js +5 -5
  174. package/lib/blobManager.js.map +1 -1
  175. package/lib/channelCollection.d.ts +5 -5
  176. package/lib/channelCollection.d.ts.map +1 -1
  177. package/lib/channelCollection.js +46 -13
  178. package/lib/channelCollection.js.map +1 -1
  179. package/lib/connectionTelemetry.d.ts +2 -2
  180. package/lib/connectionTelemetry.d.ts.map +1 -1
  181. package/lib/connectionTelemetry.js +3 -3
  182. package/lib/connectionTelemetry.js.map +1 -1
  183. package/lib/container-runtime-alpha.d.ts +205 -11
  184. package/lib/container-runtime-beta.d.ts +16 -2
  185. package/lib/container-runtime-public.d.ts +16 -2
  186. package/lib/container-runtime-untrimmed.d.ts +205 -24
  187. package/lib/containerHandleContext.d.ts.map +1 -1
  188. package/lib/containerHandleContext.js.map +1 -1
  189. package/lib/containerRuntime.d.ts +32 -26
  190. package/lib/containerRuntime.d.ts.map +1 -1
  191. package/lib/containerRuntime.js +175 -81
  192. package/lib/containerRuntime.js.map +1 -1
  193. package/lib/dataStore.d.ts +1 -1
  194. package/lib/dataStore.d.ts.map +1 -1
  195. package/lib/dataStore.js +2 -2
  196. package/lib/dataStore.js.map +1 -1
  197. package/lib/dataStoreContext.d.ts +4 -4
  198. package/lib/dataStoreContext.d.ts.map +1 -1
  199. package/lib/dataStoreContext.js +3 -3
  200. package/lib/dataStoreContext.js.map +1 -1
  201. package/lib/dataStoreContexts.d.ts.map +1 -1
  202. package/lib/dataStoreContexts.js.map +1 -1
  203. package/lib/dataStoreRegistry.d.ts.map +1 -1
  204. package/lib/dataStoreRegistry.js.map +1 -1
  205. package/lib/deltaScheduler.d.ts +1 -1
  206. package/lib/deltaScheduler.d.ts.map +1 -1
  207. package/lib/deltaScheduler.js +1 -1
  208. package/lib/deltaScheduler.js.map +1 -1
  209. package/lib/gc/garbageCollection.d.ts +1 -1
  210. package/lib/gc/garbageCollection.d.ts.map +1 -1
  211. package/lib/gc/garbageCollection.js +3 -3
  212. package/lib/gc/garbageCollection.js.map +1 -1
  213. package/lib/gc/gcConfigs.d.ts +1 -1
  214. package/lib/gc/gcConfigs.d.ts.map +1 -1
  215. package/lib/gc/gcConfigs.js +1 -1
  216. package/lib/gc/gcConfigs.js.map +1 -1
  217. package/lib/gc/gcDefinitions.d.ts +1 -1
  218. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  219. package/lib/gc/gcDefinitions.js.map +1 -1
  220. package/lib/gc/gcHelpers.d.ts.map +1 -1
  221. package/lib/gc/gcHelpers.js.map +1 -1
  222. package/lib/gc/gcSummaryStateTracker.d.ts +1 -1
  223. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  224. package/lib/gc/gcSummaryStateTracker.js +1 -1
  225. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  226. package/lib/gc/gcTelemetry.d.ts +1 -1
  227. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  228. package/lib/gc/gcTelemetry.js +1 -1
  229. package/lib/gc/gcTelemetry.js.map +1 -1
  230. package/lib/index.d.ts +2 -2
  231. package/lib/index.d.ts.map +1 -1
  232. package/lib/index.js +2 -2
  233. package/lib/index.js.map +1 -1
  234. package/lib/messageTypes.d.ts +11 -5
  235. package/lib/messageTypes.d.ts.map +1 -1
  236. package/lib/messageTypes.js +4 -0
  237. package/lib/messageTypes.js.map +1 -1
  238. package/lib/opLifecycle/definitions.d.ts +1 -19
  239. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  240. package/lib/opLifecycle/definitions.js.map +1 -1
  241. package/lib/opLifecycle/index.d.ts +3 -3
  242. package/lib/opLifecycle/index.d.ts.map +1 -1
  243. package/lib/opLifecycle/index.js +2 -2
  244. package/lib/opLifecycle/index.js.map +1 -1
  245. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  246. package/lib/opLifecycle/opCompressor.js +2 -3
  247. package/lib/opLifecycle/opCompressor.js.map +1 -1
  248. package/lib/opLifecycle/opDecompressor.d.ts +15 -4
  249. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  250. package/lib/opLifecycle/opDecompressor.js +60 -61
  251. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  252. package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
  253. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  254. package/lib/opLifecycle/opGroupingManager.js +7 -10
  255. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  256. package/lib/opLifecycle/opSplitter.d.ts +11 -3
  257. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  258. package/lib/opLifecycle/opSplitter.js +46 -37
  259. package/lib/opLifecycle/opSplitter.js.map +1 -1
  260. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  261. package/lib/opLifecycle/outbox.js +7 -12
  262. package/lib/opLifecycle/outbox.js.map +1 -1
  263. package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  264. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  265. package/lib/opLifecycle/remoteMessageProcessor.js +36 -35
  266. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  267. package/lib/packageVersion.d.ts +1 -1
  268. package/lib/packageVersion.js +1 -1
  269. package/lib/packageVersion.js.map +1 -1
  270. package/lib/pendingStateManager.d.ts +1 -1
  271. package/lib/pendingStateManager.d.ts.map +1 -1
  272. package/lib/pendingStateManager.js.map +1 -1
  273. package/lib/scheduleManager.d.ts +1 -1
  274. package/lib/scheduleManager.d.ts.map +1 -1
  275. package/lib/scheduleManager.js +2 -2
  276. package/lib/scheduleManager.js.map +1 -1
  277. package/lib/summary/documentSchema.d.ts +178 -0
  278. package/lib/summary/documentSchema.d.ts.map +1 -0
  279. package/lib/summary/documentSchema.js +341 -0
  280. package/lib/summary/documentSchema.js.map +1 -0
  281. package/lib/summary/index.d.ts +2 -1
  282. package/lib/summary/index.d.ts.map +1 -1
  283. package/lib/summary/index.js +1 -0
  284. package/lib/summary/index.js.map +1 -1
  285. package/lib/summary/orderedClientElection.d.ts +2 -2
  286. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  287. package/lib/summary/orderedClientElection.js +3 -2
  288. package/lib/summary/orderedClientElection.js.map +1 -1
  289. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
  290. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  291. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  292. package/lib/summary/runningSummarizer.d.ts +2 -2
  293. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  294. package/lib/summary/runningSummarizer.js +3 -3
  295. package/lib/summary/runningSummarizer.js.map +1 -1
  296. package/lib/summary/summarizer.d.ts +2 -2
  297. package/lib/summary/summarizer.d.ts.map +1 -1
  298. package/lib/summary/summarizer.js +3 -3
  299. package/lib/summary/summarizer.js.map +1 -1
  300. package/lib/summary/summarizerClientElection.d.ts +2 -2
  301. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  302. package/lib/summary/summarizerClientElection.js.map +1 -1
  303. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  304. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  305. package/lib/summary/summarizerHeuristics.js.map +1 -1
  306. package/lib/summary/summarizerNode/summarizerNode.d.ts +2 -2
  307. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  308. package/lib/summary/summarizerNode/summarizerNode.js +4 -4
  309. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  310. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
  311. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  312. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  313. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
  314. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  315. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
  316. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  317. package/lib/summary/summarizerTypes.d.ts +3 -3
  318. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  319. package/lib/summary/summarizerTypes.js.map +1 -1
  320. package/lib/summary/summaryCollection.d.ts +2 -2
  321. package/lib/summary/summaryCollection.d.ts.map +1 -1
  322. package/lib/summary/summaryCollection.js +1 -1
  323. package/lib/summary/summaryCollection.js.map +1 -1
  324. package/lib/summary/summaryFormat.d.ts +5 -16
  325. package/lib/summary/summaryFormat.d.ts.map +1 -1
  326. package/lib/summary/summaryFormat.js +1 -1
  327. package/lib/summary/summaryFormat.js.map +1 -1
  328. package/lib/summary/summaryGenerator.d.ts +2 -2
  329. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  330. package/lib/summary/summaryGenerator.js +3 -3
  331. package/lib/summary/summaryGenerator.js.map +1 -1
  332. package/lib/summary/summaryManager.d.ts +1 -1
  333. package/lib/summary/summaryManager.d.ts.map +1 -1
  334. package/lib/summary/summaryManager.js +2 -2
  335. package/lib/summary/summaryManager.js.map +1 -1
  336. package/lib/test/blobManager.spec.js +3 -3
  337. package/lib/test/blobManager.spec.js.map +1 -1
  338. package/lib/test/containerRuntime.spec.js +6 -4
  339. package/lib/test/containerRuntime.spec.js.map +1 -1
  340. package/lib/test/dataStoreContext.spec.js +4 -4
  341. package/lib/test/dataStoreContext.spec.js.map +1 -1
  342. package/lib/test/dataStoreCreation.spec.js +1 -1
  343. package/lib/test/dataStoreCreation.spec.js.map +1 -1
  344. package/lib/test/dataStoreRegistry.spec.js.map +1 -1
  345. package/lib/test/documentSchema.spec.js +282 -0
  346. package/lib/test/documentSchema.spec.js.map +1 -0
  347. package/lib/test/fuzz/fuzzUtils.js +11 -7
  348. package/lib/test/fuzz/fuzzUtils.js.map +1 -1
  349. package/lib/test/fuzz/summarizer.fuzz.spec.js +9 -7
  350. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +1 -1
  351. package/lib/test/fuzz/summarizerFuzzMocks.js +43 -25
  352. package/lib/test/fuzz/summarizerFuzzMocks.js.map +1 -1
  353. package/lib/test/fuzz/summarizerFuzzSuite.js +7 -4
  354. package/lib/test/fuzz/summarizerFuzzSuite.js.map +1 -1
  355. package/lib/test/gc/garbageCollection.spec.js +5 -5
  356. package/lib/test/gc/garbageCollection.spec.js.map +1 -1
  357. package/lib/test/gc/gcConfigs.spec.js +2 -2
  358. package/lib/test/gc/gcConfigs.spec.js.map +1 -1
  359. package/lib/test/gc/gcHelpers.spec.js.map +1 -1
  360. package/lib/test/gc/gcStats.spec.js +2 -2
  361. package/lib/test/gc/gcStats.spec.js.map +1 -1
  362. package/lib/test/gc/gcSummaryStateTracker.spec.js +1 -1
  363. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +1 -1
  364. package/lib/test/gc/gcTelemetry.spec.js +3 -3
  365. package/lib/test/gc/gcTelemetry.spec.js.map +1 -1
  366. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +1 -1
  367. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +1 -1
  368. package/lib/test/getPendingBlobs.spec.js +1 -1
  369. package/lib/test/getPendingBlobs.spec.js.map +1 -1
  370. package/lib/test/hardwareStats.spec.js +1 -1
  371. package/lib/test/hardwareStats.spec.js.map +1 -1
  372. package/lib/test/opLifecycle/OpGroupingManager.spec.js +95 -118
  373. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +1 -1
  374. package/lib/test/opLifecycle/batchManager.spec.js +1 -1
  375. package/lib/test/opLifecycle/batchManager.spec.js.map +1 -1
  376. package/lib/test/opLifecycle/opCompressor.spec.js +0 -1
  377. package/lib/test/opLifecycle/opCompressor.spec.js.map +1 -1
  378. package/lib/test/opLifecycle/opDecompressor.spec.js +60 -55
  379. package/lib/test/opLifecycle/opDecompressor.spec.js.map +1 -1
  380. package/lib/test/opLifecycle/opSplitter.spec.js +56 -41
  381. package/lib/test/opLifecycle/opSplitter.spec.js.map +1 -1
  382. package/lib/test/opLifecycle/outbox.spec.js +118 -10
  383. package/lib/test/opLifecycle/outbox.spec.js.map +1 -1
  384. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +115 -91
  385. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +1 -1
  386. package/lib/test/pendingStateManager.spec.js +1 -1
  387. package/lib/test/pendingStateManager.spec.js.map +1 -1
  388. package/lib/test/scheduleManager.spec.js +1 -1
  389. package/lib/test/scheduleManager.spec.js.map +1 -1
  390. package/lib/test/summarizerNode.spec.js +1 -1
  391. package/lib/test/summarizerNode.spec.js.map +1 -1
  392. package/lib/test/summarizerNodeWithGc.spec.js +1 -1
  393. package/lib/test/summarizerNodeWithGc.spec.js.map +1 -1
  394. package/lib/test/summary/runningSummarizer.spec.js +4 -4
  395. package/lib/test/summary/runningSummarizer.spec.js.map +1 -1
  396. package/lib/test/summary/summarizer.spec.js.map +1 -1
  397. package/lib/test/summary/summarizerClientElection.spec.js +2 -2
  398. package/lib/test/summary/summarizerClientElection.spec.js.map +1 -1
  399. package/lib/test/summary/summarizerHeuristics.spec.js +1 -1
  400. package/lib/test/summary/summarizerHeuristics.spec.js.map +1 -1
  401. package/lib/test/summary/summaryCollection.spec.js +1 -1
  402. package/lib/test/summary/summaryCollection.spec.js.map +1 -1
  403. package/lib/test/summary/summaryManager.spec.js +3 -3
  404. package/lib/test/summary/summaryManager.spec.js.map +1 -1
  405. package/lib/test/throttler.spec.js +1 -1
  406. package/lib/test/throttler.spec.js.map +1 -1
  407. package/lib/test/types/validateContainerRuntimePrevious.generated.js +6 -4
  408. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +1 -1
  409. package/package.json +35 -21
  410. package/src/batchTracker.ts +3 -3
  411. package/src/blobManager.ts +15 -15
  412. package/src/channelCollection.ts +75 -35
  413. package/src/connectionTelemetry.ts +10 -10
  414. package/src/containerHandleContext.ts +1 -1
  415. package/src/containerRuntime.ts +352 -197
  416. package/src/dataStore.ts +2 -2
  417. package/src/dataStoreContext.ts +19 -19
  418. package/src/dataStoreContexts.ts +2 -2
  419. package/src/dataStoreRegistry.ts +1 -1
  420. package/src/deltaScheduler.ts +1 -1
  421. package/src/gc/garbageCollection.ts +12 -12
  422. package/src/gc/gcConfigs.ts +11 -11
  423. package/src/gc/gcDefinitions.ts +2 -2
  424. package/src/gc/gcHelpers.ts +2 -2
  425. package/src/gc/gcSummaryStateTracker.ts +4 -4
  426. package/src/gc/gcTelemetry.ts +6 -6
  427. package/src/index.ts +8 -1
  428. package/src/messageTypes.ts +18 -5
  429. package/src/opLifecycle/README.md +89 -0
  430. package/src/opLifecycle/definitions.ts +1 -20
  431. package/src/opLifecycle/index.ts +3 -9
  432. package/src/opLifecycle/opCompressor.ts +4 -5
  433. package/src/opLifecycle/opDecompressor.ts +83 -100
  434. package/src/opLifecycle/opGroupingManager.ts +9 -12
  435. package/src/opLifecycle/opSplitter.ts +73 -47
  436. package/src/opLifecycle/outbox.ts +13 -31
  437. package/src/opLifecycle/remoteMessageProcessor.ts +41 -59
  438. package/src/packageVersion.ts +1 -1
  439. package/src/pendingStateManager.ts +2 -2
  440. package/src/scheduleManager.ts +7 -7
  441. package/src/summary/documentSchema.ts +553 -0
  442. package/src/summary/index.ts +10 -1
  443. package/src/summary/orderedClientElection.ts +6 -5
  444. package/src/summary/runWhileConnectedCoordinator.ts +1 -1
  445. package/src/summary/runningSummarizer.ts +19 -19
  446. package/src/summary/summarizer.ts +14 -14
  447. package/src/summary/summarizerClientElection.ts +2 -2
  448. package/src/summary/summarizerHeuristics.ts +2 -2
  449. package/src/summary/summarizerNode/summarizerNode.ts +15 -15
  450. package/src/summary/summarizerNode/summarizerNodeUtils.ts +1 -1
  451. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +4 -4
  452. package/src/summary/summarizerTypes.ts +3 -3
  453. package/src/summary/summaryCollection.ts +3 -3
  454. package/src/summary/summaryFormat.ts +8 -19
  455. package/src/summary/summaryGenerator.ts +10 -10
  456. package/src/summary/summaryManager.ts +4 -4
@@ -3,9 +3,9 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "assert";
6
+ import { MockLogger, createChildLogger, mixinMonitoringContext, } from "@fluidframework/telemetry-utils";
6
7
  import { useFakeTimers } from "sinon";
7
- import { MockLogger, mixinMonitoringContext, createChildLogger, } from "@fluidframework/telemetry-utils";
8
- import { GarbageCollector, GCNodeType, defaultSessionExpiryDurationMs, oneDayMs, runGCKey, runSweepKey, defaultInactiveTimeoutMs, defaultSweepGracePeriodMs, gcTestModeKey, nextGCVersion, stableGCVersion, gcVersionUpgradeToV4Key, gcGenerationOptionName, throwOnTombstoneLoadOverrideKey, gcDisableDataStoreSweepOptionName, gcDisableThrowOnTombstoneLoadOptionName, runSessionExpiryKey, disableDatastoreSweepKey, } from "../../gc/index.js";
8
+ import { GCNodeType, GarbageCollector, defaultInactiveTimeoutMs, defaultSessionExpiryDurationMs, defaultSweepGracePeriodMs, disableDatastoreSweepKey, gcDisableDataStoreSweepOptionName, gcDisableThrowOnTombstoneLoadOptionName, gcGenerationOptionName, gcTestModeKey, gcVersionUpgradeToV4Key, nextGCVersion, oneDayMs, runGCKey, runSessionExpiryKey, runSweepKey, stableGCVersion, throwOnTombstoneLoadOverrideKey, } from "../../gc/index.js";
9
9
  import { pkgVersion } from "../../packageVersion.js";
10
10
  import { createTestConfigProvider } from "./gcUnitTestHelpers.js";
11
11
  describe("Garbage Collection configurations", () => {
@@ -1 +1 @@
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\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
+ {"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 { ICriticalContainerError } from \"@fluidframework/container-definitions\";\nimport { IErrorBase } from \"@fluidframework/core-interfaces\";\nimport { Timer } from \"@fluidframework/core-utils\";\nimport {\n\tIGarbageCollectionData,\n\tIGarbageCollectionDetailsBase,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n\tMockLogger,\n\tMonitoringContext,\n\tcreateChildLogger,\n\tmixinMonitoringContext,\n} from \"@fluidframework/telemetry-utils\";\nimport { SinonFakeTimers, useFakeTimers } from \"sinon\";\nimport {\n\tGCNodeType,\n\tGCSummaryStateTracker,\n\tGCVersion,\n\tGarbageCollector,\n\tIGCMetadata,\n\tIGCMetadata_Deprecated,\n\tIGCRuntimeOptions,\n\tIGarbageCollectionRuntime,\n\tIGarbageCollectionState,\n\tIGarbageCollector,\n\tIGarbageCollectorConfigs,\n\tIGarbageCollectorCreateParams,\n\tdefaultInactiveTimeoutMs,\n\tdefaultSessionExpiryDurationMs,\n\tdefaultSweepGracePeriodMs,\n\tdisableDatastoreSweepKey,\n\tgcDisableDataStoreSweepOptionName,\n\tgcDisableThrowOnTombstoneLoadOptionName,\n\tgcGenerationOptionName,\n\tgcTestModeKey,\n\tgcVersionUpgradeToV4Key,\n\tnextGCVersion,\n\toneDayMs,\n\trunGCKey,\n\trunSessionExpiryKey,\n\trunSweepKey,\n\tstableGCVersion,\n\tthrowOnTombstoneLoadOverrideKey,\n} from \"../../gc/index.js\";\nimport { ContainerRuntimeGCMessage } from \"../../messageTypes.js\";\nimport { pkgVersion } from \"../../packageVersion.js\";\nimport { IContainerRuntimeMetadata } from \"../../summary/index.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\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 +1 @@
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
+ {"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\";\n// eslint-disable-next-line import/no-internal-modules\nimport { shouldAllowGcSweep } from \"../../gc/gcHelpers.js\";\nimport { GCFeatureMatrix } from \"../../gc/index.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"]}
@@ -3,9 +3,9 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "assert";
6
+ import { MockLogger, createChildLogger, mixinMonitoringContext, } from "@fluidframework/telemetry-utils";
6
7
  import { useFakeTimers } from "sinon";
7
- import { MockLogger, mixinMonitoringContext, createChildLogger, } from "@fluidframework/telemetry-utils";
8
- import { GarbageCollector, GCNodeType, defaultSessionExpiryDurationMs, oneDayMs, stableGCVersion, defaultSweepGracePeriodMs, } from "../../gc/index.js";
8
+ import { GCNodeType, GarbageCollector, defaultSessionExpiryDurationMs, defaultSweepGracePeriodMs, oneDayMs, stableGCVersion, } from "../../gc/index.js";
9
9
  import { pkgVersion } from "../../packageVersion.js";
10
10
  describe("Garbage Collection Stats", () => {
11
11
  // Nodes in the reference graph.
@@ -1 +1 @@
1
- {"version":3,"file":"gcStats.spec.js","sourceRoot":"","sources":["../../../src/test/gc/gcStats.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 { IGarbageCollectionData } from \"@fluidframework/runtime-definitions\";\nimport {\n\tMockLogger,\n\tmixinMonitoringContext,\n\tMonitoringContext,\n\tcreateChildLogger,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n\tGarbageCollector,\n\tGCNodeType,\n\tIGarbageCollectionRuntime,\n\tIGarbageCollector,\n\tIGarbageCollectorCreateParams,\n\tIGCMetadata,\n\tdefaultSessionExpiryDurationMs,\n\toneDayMs,\n\tstableGCVersion,\n\tIGCStats,\n\tdefaultSweepGracePeriodMs,\n} from \"../../gc/index.js\";\nimport { ContainerRuntimeGCMessage } from \"../../messageTypes.js\";\nimport { pkgVersion } from \"../../packageVersion.js\";\n\ndescribe(\"Garbage Collection Stats\", () => {\n\t// Nodes in the reference graph.\n\tconst nodes: string[] = [\"/node1\", \"/node2\", \"/node3\", \"/node4\", \"/node5\", \"/node6\"];\n\tconst testPkgPath = [\"testPkg\"];\n\n\tlet mockLogger: MockLogger;\n\tlet mc: MonitoringContext<MockLogger>;\n\tlet clock: SinonFakeTimers;\n\tlet lastGCMessage: ContainerRuntimeGCMessage | undefined;\n\tlet gcMessagesCount: number = 0;\n\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\t/**\n\t * Called when sweep runs. It deleted the nodes from defaultGCData.\n\t */\n\tfunction deleteSweepReadyNodes(sweepReadyRoutes: string[]): string[] {\n\t\tfor (const nodeId of sweepReadyRoutes) {\n\t\t\tassert(\n\t\t\t\tdefaultGCData.gcNodes[nodeId] !== undefined,\n\t\t\t\t`Deleted node ${nodeId} doesn't exist`,\n\t\t\t);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\tdelete defaultGCData.gcNodes[nodeId];\n\t\t}\n\t\treturn sweepReadyRoutes;\n\t}\n\n\tfunction createGarbageCollector(\n\t\tcreateParams: Partial<IGarbageCollectorCreateParams> = {},\n\t\tgcBlobsMap: Map<string, any> = new Map(),\n\t\tgcMetadata: IGCMetadata = {},\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\tdeleteSweepReadyNodes,\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\tlet metadata = createParams.metadata;\n\t\tconst existing = createParams.baseSnapshot !== undefined;\n\t\t// For existing, add container runtime metadata which is required for GC to be enabled.\n\t\tif (existing) {\n\t\t\tmetadata = {\n\t\t\t\t...metadata,\n\t\t\t\t...gcMetadata,\n\t\t\t\tgcFeature: gcMetadata.gcFeature ?? stableGCVersion,\n\t\t\t\tsummaryFormatVersion: 1,\n\t\t\t\tmessage: undefined,\n\t\t\t};\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,\n\t\t\tmetadata,\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\t\tgcMessagesCount++;\n\t\t\t\tlastGCMessage = message;\n\t\t\t},\n\t\t});\n\t}\n\n\tbefore(() => {\n\t\tclock = useFakeTimers();\n\t});\n\n\tbeforeEach(() => {\n\t\tlastGCMessage = undefined;\n\t\tmockLogger = new MockLogger();\n\t\tmc = mixinMonitoringContext(mockLogger);\n\n\t\t// Set up initial GC graph with 5 nodes and 2 are unreferenced.\n\t\tdefaultGCData.gcNodes[\"/\"] = [nodes[0]];\n\t\tdefaultGCData.gcNodes[nodes[0]] = [nodes[1]];\n\t\tdefaultGCData.gcNodes[nodes[1]] = [];\n\t\tdefaultGCData.gcNodes[nodes[2]] = [];\n\t\tdefaultGCData.gcNodes[nodes[3]] = [];\n\n\t\t// Set up the initial GC stats based on the initial GC graph.\n\t\tinitialStats = {\n\t\t\tnodeCount: 5,\n\t\t\tunrefNodeCount: 2,\n\t\t\tupdatedNodeCount: 5,\n\t\t\tdataStoreCount: 5,\n\t\t\tunrefDataStoreCount: 2,\n\t\t\tupdatedDataStoreCount: 5,\n\t\t\tattachmentBlobCount: 0,\n\t\t\tunrefAttachmentBlobCount: 0,\n\t\t\tupdatedAttachmentBlobCount: 0,\n\t\t\tlifetimeNodeCount: 5,\n\t\t\tlifetimeDataStoreCount: 5,\n\t\t\tlifetimeAttachmentBlobCount: 0,\n\t\t\tdeletedNodeCount: 0,\n\t\t\tdeletedDataStoreCount: 0,\n\t\t\tdeletedAttachmentBlobCount: 0,\n\t\t};\n\t});\n\n\tafterEach(() => {\n\t\tclock.reset();\n\t\tmockLogger.clear();\n\t\tdefaultGCData = { gcNodes: {} };\n\t});\n\n\tafter(() => {\n\t\tclock.restore();\n\t});\n\n\tlet garbageCollector: IGarbageCollector;\n\tlet initialStats: IGCStats;\n\n\t/** Helper function that makes the garbage collector process the last GC message */\n\tfunction processLastGCMessage() {\n\t\tif (lastGCMessage === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tgarbageCollector.processMessage(lastGCMessage, true /* local */);\n\t}\n\n\tdescribe(\"Mark phase stats\", () => {\n\t\tbeforeEach(() => {\n\t\t\tgarbageCollector = createGarbageCollector({});\n\t\t});\n\n\t\tit(\"can generate initial stats\", async () => {\n\t\t\tconst gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\tinitialStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can generate stats with unreferenced nodes\", async () => {\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Unreference another data store node.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\t// Unreference another data store node\n\t\t\tdefaultGCData.gcNodes[\"/\"] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\t\t});\n\n\t\tit(\"can generate stats with re-referenced nodes\", async () => {\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Unreference another data store node.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\t// Add a new reference.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [nodes[2]];\n\n\t\t\t// There should be 1 less unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount--;\n\t\t\texpectedStats.unrefDataStoreCount--;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\t\t});\n\n\t\tit(\"can generate stats with new nodes\", async () => {\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Add 2 new nodes and make one of them unreferenced.\n\t\t\tdefaultGCData.gcNodes[\"/\"].push(nodes[4]);\n\t\t\tdefaultGCData.gcNodes[nodes[4]] = [];\n\t\t\tdefaultGCData.gcNodes[nodes[5]] = [];\n\n\t\t\t// There should be 2 more nodes / data stores.\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose referenced state got updated.\n\t\t\texpectedStats.nodeCount += 2;\n\t\t\texpectedStats.dataStoreCount += 2;\n\t\t\texpectedStats.lifetimeNodeCount += 2;\n\t\t\texpectedStats.lifetimeDataStoreCount += 2;\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats\");\n\t\t});\n\t});\n\n\t/**\n\t * Note that the life time and deleted stats are the same whether sweep is enabled or not.\n\t */\n\tdescribe(\"Sweep phase stats\", () => {\n\t\tconst defaultSnapshotCacheExpiryMs = 5 * oneDayMs;\n\t\tconst sweepTimeoutMs =\n\t\t\t// Tombstone timeout\n\t\t\tdefaultSessionExpiryDurationMs +\n\t\t\tdefaultSnapshotCacheExpiryMs +\n\t\t\toneDayMs +\n\t\t\t// + Grace Period\n\t\t\tdefaultSweepGracePeriodMs;\n\n\t\t/**\n\t\t * When sweep is enabled, deleted stats are updated in the GC run next to the one where the objects become\n\t\t * sweep ready. This is because the objects are deleted when the GC op sent during GC is ack'd.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes - sweep enabled\", async () => {\n\t\t\t// Create garbage collector with sweep enabled.\n\t\t\tgarbageCollector = createGarbageCollector({\n\t\t\t\tgcOptions: { enableGCSweep: true },\n\t\t\t});\n\n\t\t\tlet previousGCMessagesCount = gcMessagesCount;\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === previousGCMessagesCount,\n\t\t\t\t\"There shouldn't be new GC messages\",\n\t\t\t);\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are marked sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\t// Note that the 2 sweep-ready nodes won't actually be deleted yet (until the GC op is processed)\n\t\t\t// but we account for them in the deleted stats now.\n\t\t\texpectedStats.deletedNodeCount += 2;\n\t\t\texpectedStats.deletedDataStoreCount += 2;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === ++previousGCMessagesCount,\n\t\t\t\t\"There should be one new GC message\",\n\t\t\t);\n\n\t\t\t// Process the GC message so that the sweep ready nodes are deleted.\n\t\t\tprocessLastGCMessage();\n\n\t\t\t// The 2 sweep ready nodes / data stores should now be truly deleted.\n\t\t\t// They should be removed from the total node and unreferenced counts.\n\t\t\texpectedStats.nodeCount -= 2;\n\t\t\texpectedStats.dataStoreCount -= 2;\n\t\t\texpectedStats.unrefNodeCount -= 2;\n\t\t\texpectedStats.unrefDataStoreCount -= 2;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\t\t});\n\n\t\t/**\n\t\t * When sweep is enabled, deleted stats are updated in the GC run next to the one where the objects become\n\t\t * sweep ready. This is because the objects are deleted when the GC op sent during GC is ack'd.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes after multiple sweep runs - sweep enabled\", async () => {\n\t\t\tgarbageCollector = createGarbageCollector({\n\t\t\t\tgcOptions: { enableGCSweep: true },\n\t\t\t});\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\tlet previousGCMessagesCount = gcMessagesCount;\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are marked sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\t// Note that the 2 sweep-ready nodes won't actually be deleted yet (until the GC op is processed)\n\t\t\t// but we account for them in the deleted stats now.\n\t\t\texpectedStats.deletedNodeCount += 2;\n\t\t\texpectedStats.deletedDataStoreCount += 2;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === ++previousGCMessagesCount,\n\t\t\t\t\"There should be one new GC message\",\n\t\t\t);\n\n\t\t\t// Process the GC message so that the sweep ready nodes are deleted.\n\t\t\tprocessLastGCMessage();\n\n\t\t\t// Unreference one more data store node (nodes[1])\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// The 2 sweep ready nodes / data stores should now be deleted.\n\t\t\t// They should be removed from the total node and unreferenced counts.\n\t\t\texpectedStats.nodeCount -= 2;\n\t\t\texpectedStats.dataStoreCount -= 2;\n\t\t\texpectedStats.unrefNodeCount -= 2;\n\t\t\texpectedStats.unrefDataStoreCount -= 2;\n\t\t\t// There should 1 new unreferenced node / data store and its reference state is updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\n\t\t\t// Advance the clock past sweep timeout again so that unreferenced node is sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// No nodes are updated since the last run.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\t// Note that the new sweep-ready node won't actually be deleted yet (until the GC op is processed)\n\t\t\t// but we account for it in the deleted stats now.\n\t\t\texpectedStats.deletedNodeCount += 1;\n\t\t\texpectedStats.deletedDataStoreCount += 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 3\");\n\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === ++previousGCMessagesCount,\n\t\t\t\t\"There should be one new GC message\",\n\t\t\t);\n\n\t\t\t// Process the GC message so that the sweep ready node is deleted.\n\t\t\tprocessLastGCMessage();\n\n\t\t\t// The sweep ready node / data store should now be truly deleted.\n\t\t\t// It should be removed from the total node and unreferenced counts.\n\t\t\texpectedStats.nodeCount--;\n\t\t\texpectedStats.dataStoreCount--;\n\t\t\texpectedStats.unrefNodeCount--;\n\t\t\texpectedStats.unrefDataStoreCount--;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 4\");\n\t\t});\n\n\t\t/**\n\t\t * When sweep is disabled, deleted stats are updated in the same GC run where the objects become\n\t\t * sweep ready. This is because the stats are based on sweep ready state.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes - sweep disabled\", async () => {\n\t\t\tgarbageCollector = createGarbageCollector({});\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// The 2 sweep ready nodes / data stores should now show up deleted.\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.deletedNodeCount = 2;\n\t\t\texpectedStats.deletedDataStoreCount = 2;\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats\");\n\t\t});\n\n\t\t/**\n\t\t * When sweep is disabled, deleted stats are updated in the same GC run where the objects become\n\t\t * sweep ready. This is because the stats are based on sweep ready state.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes after multiple sweep runs - sweep disabled\", async () => {\n\t\t\tgarbageCollector = createGarbageCollector({});\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// The 2 sweep ready nodes / data stores should now show up deleted.\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.deletedNodeCount = 2;\n\t\t\texpectedStats.deletedDataStoreCount = 2;\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\t// Unreference another data store node.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store and its referenced\n\t\t\t// state is updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\n\t\t\t// Advance the clock past sweep timeout again so that unreferenced node is sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// No nodes are updated since the last run.\n\t\t\t// The sweep ready node / data store should show up as deleted.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\t\t\texpectedStats.deletedNodeCount++;\n\t\t\texpectedStats.deletedDataStoreCount++;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 3\");\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"gcStats.spec.js","sourceRoot":"","sources":["../../../src/test/gc/gcStats.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 { ICriticalContainerError } from \"@fluidframework/container-definitions\";\nimport { IGarbageCollectionData } from \"@fluidframework/runtime-definitions\";\nimport {\n\tMockLogger,\n\tMonitoringContext,\n\tcreateChildLogger,\n\tmixinMonitoringContext,\n} from \"@fluidframework/telemetry-utils\";\nimport { SinonFakeTimers, useFakeTimers } from \"sinon\";\nimport {\n\tGCNodeType,\n\tGarbageCollector,\n\tIGCMetadata,\n\tIGCStats,\n\tIGarbageCollectionRuntime,\n\tIGarbageCollector,\n\tIGarbageCollectorCreateParams,\n\tdefaultSessionExpiryDurationMs,\n\tdefaultSweepGracePeriodMs,\n\toneDayMs,\n\tstableGCVersion,\n} from \"../../gc/index.js\";\nimport { ContainerRuntimeGCMessage } from \"../../messageTypes.js\";\nimport { pkgVersion } from \"../../packageVersion.js\";\n\ndescribe(\"Garbage Collection Stats\", () => {\n\t// Nodes in the reference graph.\n\tconst nodes: string[] = [\"/node1\", \"/node2\", \"/node3\", \"/node4\", \"/node5\", \"/node6\"];\n\tconst testPkgPath = [\"testPkg\"];\n\n\tlet mockLogger: MockLogger;\n\tlet mc: MonitoringContext<MockLogger>;\n\tlet clock: SinonFakeTimers;\n\tlet lastGCMessage: ContainerRuntimeGCMessage | undefined;\n\tlet gcMessagesCount: number = 0;\n\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\t/**\n\t * Called when sweep runs. It deleted the nodes from defaultGCData.\n\t */\n\tfunction deleteSweepReadyNodes(sweepReadyRoutes: string[]): string[] {\n\t\tfor (const nodeId of sweepReadyRoutes) {\n\t\t\tassert(\n\t\t\t\tdefaultGCData.gcNodes[nodeId] !== undefined,\n\t\t\t\t`Deleted node ${nodeId} doesn't exist`,\n\t\t\t);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\tdelete defaultGCData.gcNodes[nodeId];\n\t\t}\n\t\treturn sweepReadyRoutes;\n\t}\n\n\tfunction createGarbageCollector(\n\t\tcreateParams: Partial<IGarbageCollectorCreateParams> = {},\n\t\tgcBlobsMap: Map<string, any> = new Map(),\n\t\tgcMetadata: IGCMetadata = {},\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\tdeleteSweepReadyNodes,\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\tlet metadata = createParams.metadata;\n\t\tconst existing = createParams.baseSnapshot !== undefined;\n\t\t// For existing, add container runtime metadata which is required for GC to be enabled.\n\t\tif (existing) {\n\t\t\tmetadata = {\n\t\t\t\t...metadata,\n\t\t\t\t...gcMetadata,\n\t\t\t\tgcFeature: gcMetadata.gcFeature ?? stableGCVersion,\n\t\t\t\tsummaryFormatVersion: 1,\n\t\t\t\tmessage: undefined,\n\t\t\t};\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,\n\t\t\tmetadata,\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\t\tgcMessagesCount++;\n\t\t\t\tlastGCMessage = message;\n\t\t\t},\n\t\t});\n\t}\n\n\tbefore(() => {\n\t\tclock = useFakeTimers();\n\t});\n\n\tbeforeEach(() => {\n\t\tlastGCMessage = undefined;\n\t\tmockLogger = new MockLogger();\n\t\tmc = mixinMonitoringContext(mockLogger);\n\n\t\t// Set up initial GC graph with 5 nodes and 2 are unreferenced.\n\t\tdefaultGCData.gcNodes[\"/\"] = [nodes[0]];\n\t\tdefaultGCData.gcNodes[nodes[0]] = [nodes[1]];\n\t\tdefaultGCData.gcNodes[nodes[1]] = [];\n\t\tdefaultGCData.gcNodes[nodes[2]] = [];\n\t\tdefaultGCData.gcNodes[nodes[3]] = [];\n\n\t\t// Set up the initial GC stats based on the initial GC graph.\n\t\tinitialStats = {\n\t\t\tnodeCount: 5,\n\t\t\tunrefNodeCount: 2,\n\t\t\tupdatedNodeCount: 5,\n\t\t\tdataStoreCount: 5,\n\t\t\tunrefDataStoreCount: 2,\n\t\t\tupdatedDataStoreCount: 5,\n\t\t\tattachmentBlobCount: 0,\n\t\t\tunrefAttachmentBlobCount: 0,\n\t\t\tupdatedAttachmentBlobCount: 0,\n\t\t\tlifetimeNodeCount: 5,\n\t\t\tlifetimeDataStoreCount: 5,\n\t\t\tlifetimeAttachmentBlobCount: 0,\n\t\t\tdeletedNodeCount: 0,\n\t\t\tdeletedDataStoreCount: 0,\n\t\t\tdeletedAttachmentBlobCount: 0,\n\t\t};\n\t});\n\n\tafterEach(() => {\n\t\tclock.reset();\n\t\tmockLogger.clear();\n\t\tdefaultGCData = { gcNodes: {} };\n\t});\n\n\tafter(() => {\n\t\tclock.restore();\n\t});\n\n\tlet garbageCollector: IGarbageCollector;\n\tlet initialStats: IGCStats;\n\n\t/** Helper function that makes the garbage collector process the last GC message */\n\tfunction processLastGCMessage() {\n\t\tif (lastGCMessage === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tgarbageCollector.processMessage(lastGCMessage, true /* local */);\n\t}\n\n\tdescribe(\"Mark phase stats\", () => {\n\t\tbeforeEach(() => {\n\t\t\tgarbageCollector = createGarbageCollector({});\n\t\t});\n\n\t\tit(\"can generate initial stats\", async () => {\n\t\t\tconst gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\tinitialStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can generate stats with unreferenced nodes\", async () => {\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Unreference another data store node.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\t// Unreference another data store node\n\t\t\tdefaultGCData.gcNodes[\"/\"] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\t\t});\n\n\t\tit(\"can generate stats with re-referenced nodes\", async () => {\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Unreference another data store node.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\t// Add a new reference.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [nodes[2]];\n\n\t\t\t// There should be 1 less unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount--;\n\t\t\texpectedStats.unrefDataStoreCount--;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\t\t});\n\n\t\tit(\"can generate stats with new nodes\", async () => {\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Add 2 new nodes and make one of them unreferenced.\n\t\t\tdefaultGCData.gcNodes[\"/\"].push(nodes[4]);\n\t\t\tdefaultGCData.gcNodes[nodes[4]] = [];\n\t\t\tdefaultGCData.gcNodes[nodes[5]] = [];\n\n\t\t\t// There should be 2 more nodes / data stores.\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose referenced state got updated.\n\t\t\texpectedStats.nodeCount += 2;\n\t\t\texpectedStats.dataStoreCount += 2;\n\t\t\texpectedStats.lifetimeNodeCount += 2;\n\t\t\texpectedStats.lifetimeDataStoreCount += 2;\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats\");\n\t\t});\n\t});\n\n\t/**\n\t * Note that the life time and deleted stats are the same whether sweep is enabled or not.\n\t */\n\tdescribe(\"Sweep phase stats\", () => {\n\t\tconst defaultSnapshotCacheExpiryMs = 5 * oneDayMs;\n\t\tconst sweepTimeoutMs =\n\t\t\t// Tombstone timeout\n\t\t\tdefaultSessionExpiryDurationMs +\n\t\t\tdefaultSnapshotCacheExpiryMs +\n\t\t\toneDayMs +\n\t\t\t// + Grace Period\n\t\t\tdefaultSweepGracePeriodMs;\n\n\t\t/**\n\t\t * When sweep is enabled, deleted stats are updated in the GC run next to the one where the objects become\n\t\t * sweep ready. This is because the objects are deleted when the GC op sent during GC is ack'd.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes - sweep enabled\", async () => {\n\t\t\t// Create garbage collector with sweep enabled.\n\t\t\tgarbageCollector = createGarbageCollector({\n\t\t\t\tgcOptions: { enableGCSweep: true },\n\t\t\t});\n\n\t\t\tlet previousGCMessagesCount = gcMessagesCount;\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === previousGCMessagesCount,\n\t\t\t\t\"There shouldn't be new GC messages\",\n\t\t\t);\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are marked sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\t// Note that the 2 sweep-ready nodes won't actually be deleted yet (until the GC op is processed)\n\t\t\t// but we account for them in the deleted stats now.\n\t\t\texpectedStats.deletedNodeCount += 2;\n\t\t\texpectedStats.deletedDataStoreCount += 2;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === ++previousGCMessagesCount,\n\t\t\t\t\"There should be one new GC message\",\n\t\t\t);\n\n\t\t\t// Process the GC message so that the sweep ready nodes are deleted.\n\t\t\tprocessLastGCMessage();\n\n\t\t\t// The 2 sweep ready nodes / data stores should now be truly deleted.\n\t\t\t// They should be removed from the total node and unreferenced counts.\n\t\t\texpectedStats.nodeCount -= 2;\n\t\t\texpectedStats.dataStoreCount -= 2;\n\t\t\texpectedStats.unrefNodeCount -= 2;\n\t\t\texpectedStats.unrefDataStoreCount -= 2;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\t\t});\n\n\t\t/**\n\t\t * When sweep is enabled, deleted stats are updated in the GC run next to the one where the objects become\n\t\t * sweep ready. This is because the objects are deleted when the GC op sent during GC is ack'd.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes after multiple sweep runs - sweep enabled\", async () => {\n\t\t\tgarbageCollector = createGarbageCollector({\n\t\t\t\tgcOptions: { enableGCSweep: true },\n\t\t\t});\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\tlet previousGCMessagesCount = gcMessagesCount;\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are marked sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\t// Note that the 2 sweep-ready nodes won't actually be deleted yet (until the GC op is processed)\n\t\t\t// but we account for them in the deleted stats now.\n\t\t\texpectedStats.deletedNodeCount += 2;\n\t\t\texpectedStats.deletedDataStoreCount += 2;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === ++previousGCMessagesCount,\n\t\t\t\t\"There should be one new GC message\",\n\t\t\t);\n\n\t\t\t// Process the GC message so that the sweep ready nodes are deleted.\n\t\t\tprocessLastGCMessage();\n\n\t\t\t// Unreference one more data store node (nodes[1])\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// The 2 sweep ready nodes / data stores should now be deleted.\n\t\t\t// They should be removed from the total node and unreferenced counts.\n\t\t\texpectedStats.nodeCount -= 2;\n\t\t\texpectedStats.dataStoreCount -= 2;\n\t\t\texpectedStats.unrefNodeCount -= 2;\n\t\t\texpectedStats.unrefDataStoreCount -= 2;\n\t\t\t// There should 1 new unreferenced node / data store and its reference state is updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\n\t\t\t// Advance the clock past sweep timeout again so that unreferenced node is sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// No nodes are updated since the last run.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\t// Note that the new sweep-ready node won't actually be deleted yet (until the GC op is processed)\n\t\t\t// but we account for it in the deleted stats now.\n\t\t\texpectedStats.deletedNodeCount += 1;\n\t\t\texpectedStats.deletedDataStoreCount += 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 3\");\n\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === ++previousGCMessagesCount,\n\t\t\t\t\"There should be one new GC message\",\n\t\t\t);\n\n\t\t\t// Process the GC message so that the sweep ready node is deleted.\n\t\t\tprocessLastGCMessage();\n\n\t\t\t// The sweep ready node / data store should now be truly deleted.\n\t\t\t// It should be removed from the total node and unreferenced counts.\n\t\t\texpectedStats.nodeCount--;\n\t\t\texpectedStats.dataStoreCount--;\n\t\t\texpectedStats.unrefNodeCount--;\n\t\t\texpectedStats.unrefDataStoreCount--;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 4\");\n\t\t});\n\n\t\t/**\n\t\t * When sweep is disabled, deleted stats are updated in the same GC run where the objects become\n\t\t * sweep ready. This is because the stats are based on sweep ready state.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes - sweep disabled\", async () => {\n\t\t\tgarbageCollector = createGarbageCollector({});\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// The 2 sweep ready nodes / data stores should now show up deleted.\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.deletedNodeCount = 2;\n\t\t\texpectedStats.deletedDataStoreCount = 2;\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats\");\n\t\t});\n\n\t\t/**\n\t\t * When sweep is disabled, deleted stats are updated in the same GC run where the objects become\n\t\t * sweep ready. This is because the stats are based on sweep ready state.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes after multiple sweep runs - sweep disabled\", async () => {\n\t\t\tgarbageCollector = createGarbageCollector({});\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// The 2 sweep ready nodes / data stores should now show up deleted.\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.deletedNodeCount = 2;\n\t\t\texpectedStats.deletedDataStoreCount = 2;\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\t// Unreference another data store node.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store and its referenced\n\t\t\t// state is updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\n\t\t\t// Advance the clock past sweep timeout again so that unreferenced node is sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// No nodes are updated since the last run.\n\t\t\t// The sweep ready node / data store should show up as deleted.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\t\t\texpectedStats.deletedNodeCount++;\n\t\t\texpectedStats.deletedDataStoreCount++;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 3\");\n\t\t});\n\t});\n});\n"]}
@@ -5,7 +5,7 @@
5
5
  import { strict as assert } from "assert";
6
6
  import { SummaryType } from "@fluidframework/protocol-definitions";
7
7
  import { gcDeletedBlobKey, gcTombstoneBlobKey } from "@fluidframework/runtime-definitions";
8
- import { nextGCVersion, gcStateBlobKey, GCSummaryStateTracker, } from "../../gc/index.js";
8
+ import { GCSummaryStateTracker, gcStateBlobKey, nextGCVersion, } from "../../gc/index.js";
9
9
  describe("GCSummaryStateTracker tests", () => {
10
10
  describe("Summary state reset", () => {
11
11
  // In these tests, Persisted = gcVersionInBaseSnapshot. Current = gcVersionInEffect.