|
@@ -0,0 +1,115 @@
|
|
|
|
|
+const config = require('config')
|
|
|
|
|
+const sinon = require('sinon')
|
|
|
|
|
+const { expect } = require('chai')
|
|
|
|
|
+
|
|
|
|
|
+const cleanup = require('../storage/support/cleanup')
|
|
|
|
|
+const Rollout = require('../../../../api/app/rollout')
|
|
|
|
|
+
|
|
|
|
|
+describe('rollout', function () {
|
|
|
|
|
+ beforeEach(cleanup.everything)
|
|
|
|
|
+ beforeEach('Set up stubs', function () {
|
|
|
|
|
+ sinon.stub(config, 'has').callThrough()
|
|
|
|
|
+ sinon.stub(config, 'get').callThrough()
|
|
|
|
|
+ })
|
|
|
|
|
+ afterEach(sinon.restore)
|
|
|
|
|
+
|
|
|
|
|
+ it('should return a valid history buffer level', function () {
|
|
|
|
|
+ setMockConfig('historyBufferLevel', '2')
|
|
|
|
|
+ setMockConfig('forcePersistBuffer', 'false')
|
|
|
|
|
+
|
|
|
|
|
+ const rollout = new Rollout(config)
|
|
|
|
|
+ const { historyBufferLevel, forcePersistBuffer } =
|
|
|
|
|
+ rollout.getHistoryBufferLevelOptions('test-project-id')
|
|
|
|
|
+ expect(historyBufferLevel).to.equal(2)
|
|
|
|
|
+ expect(forcePersistBuffer).to.be.false
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ it('should return a valid history buffer level and force persist buffer options', function () {
|
|
|
|
|
+ setMockConfig('historyBufferLevel', '1')
|
|
|
|
|
+ setMockConfig('forcePersistBuffer', 'true')
|
|
|
|
|
+ const rollout = new Rollout(config)
|
|
|
|
|
+ const { historyBufferLevel, forcePersistBuffer } =
|
|
|
|
|
+ rollout.getHistoryBufferLevelOptions('test-project-id')
|
|
|
|
|
+ expect(historyBufferLevel).to.equal(1)
|
|
|
|
|
+ expect(forcePersistBuffer).to.be.true
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ describe('with a higher next history buffer level rollout', function () {
|
|
|
|
|
+ beforeEach(function () {
|
|
|
|
|
+ setMockConfig('historyBufferLevel', '2')
|
|
|
|
|
+ setMockConfig('forcePersistBuffer', 'false')
|
|
|
|
|
+ setMockConfig('nextHistoryBufferLevel', '3')
|
|
|
|
|
+ })
|
|
|
|
|
+ it('should return the expected history buffer level when the rollout percentage is zero', function () {
|
|
|
|
|
+ setMockConfig('nextHistoryBufferLevelRolloutPercentage', '0')
|
|
|
|
|
+ const rollout = new Rollout(config)
|
|
|
|
|
+ for (let i = 0; i < 1000; i++) {
|
|
|
|
|
+ const { historyBufferLevel, forcePersistBuffer } =
|
|
|
|
|
+ rollout.getHistoryBufferLevelOptions(`test-project-id-${i}`)
|
|
|
|
|
+ expect(historyBufferLevel).to.equal(2)
|
|
|
|
|
+ expect(forcePersistBuffer).to.be.false
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ it('should return the expected distribution of levels when the rollout percentage is 10%', function () {
|
|
|
|
|
+ setMockConfig('nextHistoryBufferLevelRolloutPercentage', '10')
|
|
|
|
|
+ const rollout = new Rollout(config)
|
|
|
|
|
+ let currentLevel = 0
|
|
|
|
|
+ let nextLevel = 0
|
|
|
|
|
+ for (let i = 0; i < 1000; i++) {
|
|
|
|
|
+ const { historyBufferLevel } = rollout.getHistoryBufferLevelOptions(
|
|
|
|
|
+ `test-project-id-${i}`
|
|
|
|
|
+ )
|
|
|
|
|
+ switch (historyBufferLevel) {
|
|
|
|
|
+ case 2:
|
|
|
|
|
+ currentLevel++
|
|
|
|
|
+ break
|
|
|
|
|
+ case 3:
|
|
|
|
|
+ nextLevel++
|
|
|
|
|
+ break
|
|
|
|
|
+ default:
|
|
|
|
|
+ expect.fail(
|
|
|
|
|
+ `Unexpected history buffer level: ${historyBufferLevel}`
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ const twoPercentage = (currentLevel / 1000) * 100
|
|
|
|
|
+ const threePercentage = (nextLevel / 1000) * 100
|
|
|
|
|
+ expect(twoPercentage).to.be.closeTo(90, 5) // 90% for level 2
|
|
|
|
|
+ expect(threePercentage).to.be.closeTo(10, 5) // 10% for level 3
|
|
|
|
|
+ })
|
|
|
|
|
+ })
|
|
|
|
|
+ describe('with a next history buffer level lower than the current level', function () {
|
|
|
|
|
+ beforeEach(function () {
|
|
|
|
|
+ setMockConfig('historyBufferLevel', '3')
|
|
|
|
|
+ setMockConfig('forcePersistBuffer', 'false')
|
|
|
|
|
+ setMockConfig('nextHistoryBufferLevel', '2')
|
|
|
|
|
+ })
|
|
|
|
|
+ it('should always return the current level when the rollout percentage is zero', function () {
|
|
|
|
|
+ setMockConfig('nextHistoryBufferLevelRolloutPercentage', '0')
|
|
|
|
|
+ const rollout = new Rollout(config)
|
|
|
|
|
+ for (let i = 0; i < 1000; i++) {
|
|
|
|
|
+ const { historyBufferLevel, forcePersistBuffer } =
|
|
|
|
|
+ rollout.getHistoryBufferLevelOptions(`test-project-id-${i}`)
|
|
|
|
|
+ expect(historyBufferLevel).to.equal(3)
|
|
|
|
|
+ expect(forcePersistBuffer).to.be.false
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ it('should always return the current level regardless of the rollout percentage', function () {
|
|
|
|
|
+ setMockConfig('nextHistoryBufferLevelRolloutPercentage', '10')
|
|
|
|
|
+ const rollout = new Rollout(config)
|
|
|
|
|
+ for (let i = 0; i < 1000; i++) {
|
|
|
|
|
+ const { historyBufferLevel } = rollout.getHistoryBufferLevelOptions(
|
|
|
|
|
+ `test-project-id-${i}`
|
|
|
|
|
+ )
|
|
|
|
|
+ expect(historyBufferLevel).to.equal(3)
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ })
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+function setMockConfig(path, value) {
|
|
|
|
|
+ config.has.withArgs(path).returns(true)
|
|
|
|
|
+ config.get.withArgs(path).returns(value)
|
|
|
|
|
+}
|