[web] adopt free/premium compile backend class (#34846)

* [web] adopt free/premium compile backend class

* [rails] adopt free compile backend class for pdf conversion

GitOrigin-RevId: e12c99a27363f5654132c2fcdc6c5d8ccc591868
This commit is contained in:
Jakob Ackermann
2026-06-23 08:05:59 +00:00
committed by Copybot
parent 23dca72cd3
commit 88267716a3
10 changed files with 130 additions and 76 deletions
@@ -249,7 +249,7 @@ async function createTemplateClsiCache({
docEntries,
}) {
const compileGroup = Settings.defaultFeatures.compileGroup
const compileBackendClass = Settings.apis.clsi.submissionBackendClass
const compileBackendClass = Settings.apis.clsi.submissionCompileBackendClass
const submissionId = new ObjectId().toString()
const editorId = Crypto.randomUUID()
const historyId = project.overleaf.history.id
@@ -34,6 +34,18 @@ const ClsiCookieManagerFactory = function (backendGroup) {
}
}
// TODO: remove this once the old keys have expired after the rollout of the
// c3d->free / c4d->premium compile backend class rename.
function buildOldKey(projectId, userId, compileBackendClass) {
let oldCompileBackendClass = compileBackendClass
if (compileBackendClass === 'free') {
oldCompileBackendClass = 'c3d'
} else if (compileBackendClass === 'premium') {
oldCompileBackendClass = 'c4d'
}
return buildKey(projectId, userId, oldCompileBackendClass)
}
async function getServerId(
projectId,
userId,
@@ -43,9 +55,16 @@ const ClsiCookieManagerFactory = function (backendGroup) {
if (!clsiCookiesEnabled) {
return
}
const serverId = await rclient.get(
let serverId = await rclient.get(
buildKey(projectId, userId, compileBackendClass)
)
if (!serverId) {
// Fallback to the old key from before the c3d->free / c4d->premium rename.
// TODO: remove this once the old keys have expired.
serverId = await rclient.get(
buildOldKey(projectId, userId, compileBackendClass)
)
}
if (!serverId) {
return await cookieManager.promises._populateServerIdViaRequest(
@@ -215,7 +234,10 @@ const ClsiCookieManagerFactory = function (backendGroup) {
return
}
try {
await rclient.del(buildKey(projectId, userId, compileBackendClass))
await rclient.del(
buildKey(projectId, userId, compileBackendClass),
buildOldKey(projectId, userId, compileBackendClass)
)
} catch (err) {
// redis errors need wrapping as the instance may be shared
throw new OError(
@@ -87,16 +87,14 @@ function getDoubleCompilePercentile(projectId) {
}
function getNewCompileBackendClass(projectId, compileBackendClass) {
const clsi = Settings.apis.clsi
let cfg
switch (compileBackendClass) {
case 'c3d':
cfg = Settings.apis.clsi_new.doubleCompileFree
break
case 'c4d':
cfg = Settings.apis.clsi_new.doubleCompilePremium
break
default:
throw new Error('unknown ?compileBackendClass')
if (compileBackendClass === clsi.standardCompileBackendClass) {
cfg = Settings.apis.clsi_new.doubleCompileFree
} else if (compileBackendClass === clsi.priorityCompileBackendClass) {
cfg = Settings.apis.clsi_new.doubleCompilePremium
} else {
throw new Error('unknown ?compileBackendClass')
}
if (!cfg.backendClass || !cfg.sample) return null
if (getDoubleCompilePercentile(projectId) >= cfg.sample) return null
@@ -338,7 +338,8 @@ const _CompileController = {
}
options.compileGroup =
req.body?.compileGroup || Settings.defaultFeatures.compileGroup
options.compileBackendClass = Settings.apis.clsi.submissionBackendClass
options.compileBackendClass =
Settings.apis.clsi.submissionCompileBackendClass
options.timeout =
req.body?.timeout || Settings.defaultFeatures.compileTimeout
const { status, outputFiles, clsiServerId, validationProblems } =
@@ -164,7 +164,10 @@ async function _getUserCompileLimits(userId) {
timeout:
ownerFeatures.compileTimeout || Settings.defaultFeatures.compileTimeout,
compileGroup,
compileBackendClass: compileGroup === 'standard' ? 'c3d' : 'c4d',
compileBackendClass:
compileGroup === 'standard'
? Settings.apis.clsi.standardCompileBackendClass
: Settings.apis.clsi.priorityCompileBackendClass,
ownerAnalyticsId: analyticsId,
}
+6 -2
View File
@@ -252,8 +252,12 @@ module.exports = {
? `http://${process.env.CLSI_LB_IP || process.env.CLSI_LB_HOST}:80`
: `http://${process.env.DOWNLOAD_HOST || '127.0.0.1'}:8080`,
backendGroupName: undefined,
submissionBackendClass:
process.env.CLSI_SUBMISSION_BACKEND_CLASS || 'c3d',
submissionCompileBackendClass:
process.env.CLSI_SUBMISSION_COMPILE_BACKEND_CLASS || 'free',
standardCompileBackendClass:
process.env.CLSI_STANDARD_COMPILE_BACKEND_CLASS || 'free',
priorityCompileBackendClass:
process.env.CLSI_PRIORITY_COMPILE_BACKEND_CLASS || 'premium',
},
clsiCache: {
instances: JSON.parse(process.env.CLSI_CACHE_INSTANCES || '[]'),
@@ -51,7 +51,26 @@ describe('ClsiCookieManager', function () {
ctx.project_id,
ctx.user_id,
'',
'c3d'
'free'
)
ctx.redis.get
.calledWith(`clsiserver:free:${ctx.project_id}:${ctx.user_id}`)
.should.equal(true)
serverId.should.equal('clsi-7')
})
it('should fall back to the old key during the free/premium rollout', async function (ctx) {
ctx.redis.get
.withArgs(`clsiserver:free:${ctx.project_id}:${ctx.user_id}`)
.resolves(null)
ctx.redis.get
.withArgs(`clsiserver:c3d:${ctx.project_id}:${ctx.user_id}`)
.resolves('clsi-7')
const serverId = await ctx.ClsiCookieManager.promises.getServerId(
ctx.project_id,
ctx.user_id,
'',
'free'
)
ctx.redis.get
.calledWith(`clsiserver:c3d:${ctx.project_id}:${ctx.user_id}`)
@@ -83,7 +102,7 @@ describe('ClsiCookieManager', function () {
ctx.project_id,
ctx.user_id,
'',
'c3d'
'free'
)
ctx.ClsiCookieManager.promises._populateServerIdViaRequest
.calledWith(ctx.project_id, ctx.user_id)
@@ -114,13 +133,13 @@ describe('ClsiCookieManager', function () {
ctx.project_id,
ctx.user_id,
'standard',
'c3d'
'free'
)
const args = ctx.ClsiCookieManager.promises.setServerId.args[0]
args[0].should.equal(ctx.project_id)
args[1].should.equal(ctx.user_id)
args[2].should.equal('standard')
args[3].should.equal('c3d')
args[3].should.equal('free')
args[4].should.deep.equal(ctx.clsiServerId)
})
@@ -130,7 +149,7 @@ describe('ClsiCookieManager', function () {
ctx.project_id,
ctx.user_id,
'',
'c3d'
'free'
)
serverId.should.equal(ctx.clsiServerId)
})
@@ -149,7 +168,7 @@ describe('ClsiCookieManager', function () {
ctx.project_id,
ctx.user_id,
'standard',
'c3d',
'free',
ctx.clsiServerId,
null
)
@@ -163,9 +182,10 @@ describe('ClsiCookieManager', function () {
await ctx.ClsiCookieManager.promises.clearServerId(
ctx.project_id,
ctx.user_id,
'c3d'
'free'
)
ctx.redis.del.should.have.been.calledWith(
`clsiserver:free:${ctx.project_id}:${ctx.user_id}`,
`clsiserver:c3d:${ctx.project_id}:${ctx.user_id}`
)
})
@@ -184,12 +204,12 @@ describe('ClsiCookieManager', function () {
ctx.project_id,
ctx.user_id,
'standard',
'c3d',
'free',
ctx.clsiServerId,
null
)
ctx.redis.setex.should.have.been.calledWith(
`clsiserver:c3d:${ctx.project_id}:${ctx.user_id}`,
`clsiserver:free:${ctx.project_id}:${ctx.user_id}`,
ctx.settings.clsiCookie.ttlInSeconds,
ctx.clsiServerId
)
@@ -201,12 +221,12 @@ describe('ClsiCookieManager', function () {
ctx.project_id,
ctx.user_id,
'standard',
'c3d',
'free',
ctx.clsiServerId,
null
)
expect(ctx.redis.setex).to.have.been.calledWith(
`clsiserver:c3d:${ctx.project_id}:${ctx.user_id}`,
`clsiserver:free:${ctx.project_id}:${ctx.user_id}`,
ctx.settings.clsiCookie.ttlInSecondsRegular,
ctx.clsiServerId
)
@@ -229,7 +249,7 @@ describe('ClsiCookieManager', function () {
ctx.project_id,
ctx.user_id,
'standard',
'c3d',
'free',
ctx.clsiServerId,
null
)
@@ -254,12 +274,12 @@ describe('ClsiCookieManager', function () {
ctx.project_id,
ctx.user_id,
'standard',
'c3d',
'free',
ctx.clsiServerId,
null
)
ctx.redis_secondary.setex.should.have.been.calledWith(
`clsiserver:c3d:${ctx.project_id}:${ctx.user_id}`,
`clsiserver:free:${ctx.project_id}:${ctx.user_id}`,
ctx.settings.clsiCookie.ttlInSeconds,
ctx.clsiServerId
)
@@ -273,14 +293,14 @@ describe('ClsiCookieManager', function () {
ctx.project_id,
ctx.user_id,
'standard',
'c3d',
'free',
ctx.clsiServerId,
'previous-clsi-server-id'
)
expect(
ctx.fetchUtils.fetchStringWithResponse
).to.have.been.calledWith(
`${ctx.settings.apis.clsi.url}/instance-state?clsiserverid=previous-clsi-server-id&compileGroup=standard&compileBackendClass=c3d`,
`${ctx.settings.apis.clsi.url}/instance-state?clsiserverid=previous-clsi-server-id&compileGroup=standard&compileBackendClass=free`,
{ method: 'GET', signal: sinon.match.instanceOf(AbortSignal) }
)
}
@@ -178,7 +178,9 @@ describe('ClsiManager', function () {
},
clsi: {
url: `http://${CLSI_HOST}`,
submissionBackendClass: 'c3d',
submissionCompileBackendClass: 'free',
standardCompileBackendClass: 'free',
priorityCompileBackendClass: 'premium',
},
clsi_new: {
doubleCompileFree: {
@@ -333,7 +335,7 @@ describe('ClsiManager', function () {
ctx.project._id,
ctx.user_id,
{
compileBackendClass: 'c3d',
compileBackendClass: 'free',
compileGroup: 'standard',
timeout: ctx.timeout,
}
@@ -347,7 +349,7 @@ describe('ClsiManager', function () {
url.host === CLSI_HOST &&
url.pathname ===
`/project/${ctx.project._id}/user/${ctx.user_id}/compile` &&
url.searchParams.get('compileBackendClass') === 'c3d' &&
url.searchParams.get('compileBackendClass') === 'free' &&
url.searchParams.get('compileGroup') === 'standard'
),
{
@@ -427,7 +429,7 @@ describe('ClsiManager', function () {
ctx.project._id,
ctx.user_id,
'standard',
'c3d',
'free',
`${ctx.newClsiServerId}1`
)
})
@@ -471,7 +473,7 @@ describe('ClsiManager', function () {
ctx.project._id,
ctx.user_id,
{
compileBackendClass: 'c3d',
compileBackendClass: 'free',
compileGroup: 'standard',
timeout: ctx.timeout,
compileFromHistory: true,
@@ -488,7 +490,7 @@ describe('ClsiManager', function () {
url.host === CLSI_HOST &&
url.pathname ===
`/project/${ctx.project._id}/user/${ctx.user_id}/compile` &&
url.searchParams.get('compileBackendClass') === 'c3d' &&
url.searchParams.get('compileBackendClass') === 'free' &&
url.searchParams.get('compileGroup') === 'standard'
),
{
@@ -576,7 +578,7 @@ describe('ClsiManager', function () {
ctx.project._id,
ctx.user_id,
'standard',
'c3d',
'free',
`${ctx.newClsiServerId}1`
)
})
@@ -619,7 +621,7 @@ describe('ClsiManager', function () {
ctx.result = await ctx.ClsiManager.promises.sendRequest(
ctx.project._id,
ctx.user_id,
{ compileBackendClass: 'c3d', compileGroup: 'standard' }
{ compileBackendClass: 'free', compileGroup: 'standard' }
)
})
@@ -654,7 +656,7 @@ describe('ClsiManager', function () {
{
timeout: 100,
incrementalCompilesEnabled: true,
compileBackendClass: 'c3d',
compileBackendClass: 'free',
compileGroup: 'priority',
compileFromClsiCache: true,
populateClsiCache: true,
@@ -707,7 +709,7 @@ describe('ClsiManager', function () {
url.hostname === CLSI_HOST &&
url.pathname ===
`/project/${ctx.project._id}/user/${ctx.user_id}/compile` &&
url.searchParams.get('compileBackendClass') === 'c3d' &&
url.searchParams.get('compileBackendClass') === 'free' &&
url.searchParams.get('compileGroup') === 'priority'
),
{
@@ -1006,7 +1008,7 @@ describe('ClsiManager', function () {
ctx.result = await ctx.ClsiManager.promises.sendRequest(
ctx.project._id,
ctx.user_id,
{ compileBackendClass: 'c3d' }
{ compileBackendClass: 'free' }
)
})
@@ -1031,7 +1033,7 @@ describe('ClsiManager', function () {
it('should clear the CLSI server id cookie', function (ctx) {
expect(
ctx.ClsiCookieManager.promises.clearServerId
).to.have.been.calledWith(ctx.project._id, ctx.user_id, 'c3d')
).to.have.been.calledWith(ctx.project._id, ctx.user_id, 'free')
})
it('should return a success status', function (ctx) {
@@ -1060,7 +1062,7 @@ describe('ClsiManager', function () {
ctx.project._id,
ctx.user_id,
{
compileBackendClass: 'c3d',
compileBackendClass: 'free',
compileGroup: 'standard',
}
)
@@ -1076,7 +1078,7 @@ describe('ClsiManager', function () {
url.host === CLSI_HOST &&
url.pathname ===
`/project/${ctx.project._id}/user/${ctx.user_id}/compile` &&
url.searchParams.get('compileBackendClass') === 'c3d' &&
url.searchParams.get('compileBackendClass') === 'free' &&
url.searchParams.get('compileGroup') === 'standard'
)
)
@@ -1093,7 +1095,7 @@ describe('ClsiManager', function () {
ctx.AnalyticsManager.recordEventForUserInBackground
).to.have.been.calledWith(ctx.user_id, 'double-compile-result', {
projectId: 'project-id',
compileBackendClass: 'c3d',
compileBackendClass: 'free',
newCompileBackendClass: 'n4',
status: 'success',
compileTime: 1337,
@@ -1114,7 +1116,7 @@ describe('ClsiManager', function () {
ctx.project._id,
ctx.user_id,
{
compileBackendClass: 'c3d',
compileBackendClass: 'free',
compileGroup: 'standard',
}
)
@@ -1130,7 +1132,7 @@ describe('ClsiManager', function () {
url.host === CLSI_HOST &&
url.pathname ===
`/project/${ctx.project._id}/user/${ctx.user_id}/compile` &&
url.searchParams.get('compileBackendClass') === 'c3d' &&
url.searchParams.get('compileBackendClass') === 'free' &&
url.searchParams.get('compileGroup') === 'standard'
)
)
@@ -1144,7 +1146,7 @@ describe('ClsiManager', function () {
ctx.project._id,
ctx.user_id,
{
compileBackendClass: 'c4d',
compileBackendClass: 'premium',
compileGroup: 'priority',
}
)
@@ -1160,7 +1162,7 @@ describe('ClsiManager', function () {
url.host === CLSI_HOST &&
url.pathname ===
`/project/${ctx.project._id}/user/${ctx.user_id}/compile` &&
url.searchParams.get('compileBackendClass') === 'c4d' &&
url.searchParams.get('compileBackendClass') === 'premium' &&
url.searchParams.get('compileGroup') === 'priority'
)
)
@@ -1177,7 +1179,7 @@ describe('ClsiManager', function () {
ctx.AnalyticsManager.recordEventForUserInBackground
).to.have.been.calledWith(ctx.user_id, 'double-compile-result', {
projectId: 'project-id',
compileBackendClass: 'c4d',
compileBackendClass: 'premium',
newCompileBackendClass: 'n4d',
status: 'success',
compileTime: 1337,
@@ -1222,7 +1224,7 @@ describe('ClsiManager', function () {
ctx.result = await ctx.ClsiManager.promises.sendExternalRequest(
ctx.submissionId,
ctx.clsiRequest,
{ compileBackendClass: 'c3d', compileGroup: 'standard' }
{ compileBackendClass: 'free', compileGroup: 'standard' }
)
})
@@ -1232,7 +1234,7 @@ describe('ClsiManager', function () {
url =>
url.host === CLSI_HOST &&
url.pathname === `/project/${ctx.submissionId}/compile` &&
url.searchParams.get('compileBackendClass') === 'c3d' &&
url.searchParams.get('compileBackendClass') === 'free' &&
url.searchParams.get('compileGroup') === 'standard'
),
{
@@ -1297,7 +1299,7 @@ describe('ClsiManager', function () {
await ctx.ClsiManager.promises.deleteAuxFiles(
ctx.project._id,
ctx.user_id,
{ compileBackendClass: 'c3d', compileGroup: 'standard' },
{ compileBackendClass: 'free', compileGroup: 'standard' },
'node-1'
)
})
@@ -1309,7 +1311,7 @@ describe('ClsiManager', function () {
url.host === CLSI_HOST &&
url.pathname ===
`/project/${ctx.project._id}/user/${ctx.user_id}` &&
url.searchParams.get('compileBackendClass') === 'c3d' &&
url.searchParams.get('compileBackendClass') === 'free' &&
url.searchParams.get('compileGroup') === 'standard' &&
url.searchParams.get('clsiserverid') === 'node-1'
),
@@ -1331,7 +1333,7 @@ describe('ClsiManager', function () {
it('should clear the clsi persistance', function (ctx) {
ctx.ClsiCookieManager.promises.clearServerId
.calledWith(ctx.project._id, ctx.user_id, 'c3d')
.calledWith(ctx.project._id, ctx.user_id, 'free')
.should.equal(true)
})
@@ -1347,7 +1349,7 @@ describe('ClsiManager', function () {
await ctx.ClsiManager.promises.deleteAuxFiles(
ctx.project._id,
ctx.user_id,
{ compileBackendClass: 'c4d', compileGroup: 'priority' },
{ compileBackendClass: 'premium', compileGroup: 'priority' },
'node-1'
)
// wait for the background task to finish
@@ -1357,7 +1359,7 @@ describe('ClsiManager', function () {
it('should clear both cookies', function (ctx) {
expect(
ctx.ClsiCookieManager.promises.clearServerId
).to.have.been.calledWith(ctx.project._id, ctx.user_id, 'c4d')
).to.have.been.calledWith(ctx.project._id, ctx.user_id, 'premium')
expect(
ctx.ClsiCookieManager.promises.clearServerId
).to.have.been.calledWith(ctx.project._id, ctx.user_id, 'n4d')
@@ -1370,7 +1372,7 @@ describe('ClsiManager', function () {
url.host === CLSI_HOST &&
url.pathname ===
`/project/${ctx.project._id}/user/${ctx.user_id}` &&
url.searchParams.get('compileBackendClass') === 'c4d' &&
url.searchParams.get('compileBackendClass') === 'premium' &&
url.searchParams.get('compileGroup') === 'priority' &&
url.searchParams.get('clsiserverid') === 'node-1'
),
@@ -1399,7 +1401,7 @@ describe('ClsiManager', function () {
ctx.project._id,
ctx.user_id,
false,
{ compileBackendClass: 'c3d', compileGroup: 'standard' },
{ compileBackendClass: 'free', compileGroup: 'standard' },
'node-1'
)
})
@@ -1409,7 +1411,7 @@ describe('ClsiManager', function () {
sinon.match(
url =>
url.toString() ===
`http://clsi.example.com/project/${ctx.project._id}/user/${ctx.user_id}/wordcount?compileBackendClass=c3d&compileGroup=standard&file=main.tex&image=mock-image-name&clsiserverid=node-1`
`http://clsi.example.com/project/${ctx.project._id}/user/${ctx.user_id}/wordcount?compileBackendClass=free&compileGroup=standard&file=main.tex&image=mock-image-name&clsiserverid=node-1`
)
)
})
@@ -1426,7 +1428,7 @@ describe('ClsiManager', function () {
ctx.project._id,
ctx.user_id,
'other.tex',
{ compileBackendClass: 'c3d', compileGroup: 'standard' },
{ compileBackendClass: 'free', compileGroup: 'standard' },
'node-2'
)
})
@@ -1438,7 +1440,7 @@ describe('ClsiManager', function () {
url.host === CLSI_HOST &&
url.pathname ===
`/project/${ctx.project._id}/user/${ctx.user_id}/wordcount` &&
url.searchParams.get('compileBackendClass') === 'c3d' &&
url.searchParams.get('compileBackendClass') === 'free' &&
url.searchParams.get('compileGroup') === 'standard' &&
url.searchParams.get('clsiserverid') === 'node-2' &&
url.searchParams.get('file') === 'other.tex' &&
@@ -1460,7 +1462,7 @@ describe('ClsiManager', function () {
ctx.project._id,
ctx.user_id,
false,
{ compileBackendClass: 'c4d', compileGroup: 'priority' },
{ compileBackendClass: 'premium', compileGroup: 'priority' },
'node-1'
)
// wait for the background task to finish
@@ -1472,7 +1474,7 @@ describe('ClsiManager', function () {
sinon.match(
url =>
url.toString() ===
`http://clsi.example.com/project/${ctx.project._id}/user/${ctx.user_id}/wordcount?compileBackendClass=c4d&compileGroup=priority&file=main.tex&image=mock-image-name&clsiserverid=node-1`
`http://clsi.example.com/project/${ctx.project._id}/user/${ctx.user_id}/wordcount?compileBackendClass=premium&compileGroup=priority&file=main.tex&image=mock-image-name&clsiserverid=node-1`
)
)
expect(ctx.FetchUtils.fetchStringWithResponse).to.have.been.calledWith(
@@ -27,7 +27,7 @@ describe('CompileController', function () {
promises: {
compile: sinon.stub(),
getProjectCompileLimits: sinon.stub().resolves({
compileBackendClass: 'c3d',
compileBackendClass: 'free',
compileGroup: 'standard',
}),
syncTeX: sinon.stub(),
@@ -48,7 +48,7 @@ describe('CompileController', function () {
clsi: {
url: 'http://clsi.example.com:3013',
downloadHost: 'http://clsi.example.com:8080',
submissionBackendClass: 'c3d',
submissionCompileBackendClass: 'free',
},
clsi_priority: {
url: 'http://clsi-priority.example.com',
@@ -481,7 +481,7 @@ describe('CompileController', function () {
ctx.ClsiManager.promises.sendExternalRequest.should.have.been.calledWith(
ctx.submission_id,
{ compileGroup: 'special', timeout: 600 },
{ compileGroup: 'special', compileBackendClass: 'c3d', timeout: 600 }
{ compileGroup: 'special', compileBackendClass: 'free', timeout: 600 }
)
})
})
@@ -512,7 +512,7 @@ describe('CompileController', function () {
draft: true,
check: 'validate',
compileGroup: 'standard',
compileBackendClass: 'c3d',
compileBackendClass: 'free',
timeout: 60,
}
)
@@ -646,7 +646,7 @@ describe('CompileController', function () {
it('should proxy the PDF from the CLSI', function (ctx) {
ctx.fetchUtils.fetchStreamWithResponse.should.have.been.calledWith(
`${ctx.settings.apis.clsi.url}/project/${ctx.projectId}/user/${ctx.user_id}/build/${ctx.build_id}/output/output.zip?compileBackendClass=c3d&clsiserverid=${ctx.clsiServerId}`
`${ctx.settings.apis.clsi.url}/project/${ctx.projectId}/user/${ctx.user_id}/build/${ctx.build_id}/output/output.zip?compileBackendClass=free&clsiserverid=${ctx.clsiServerId}`
)
})
})
@@ -657,7 +657,7 @@ describe('CompileController', function () {
.stub()
.resolves({
compileGroup: 'priority',
compileBackendClass: 'c4d',
compileBackendClass: 'premium',
})
await ctx.CompileController.getOutputZipFromClsi(
ctx.req,
@@ -668,7 +668,7 @@ describe('CompileController', function () {
it('should proxy the PDF from the CLSI', function (ctx) {
ctx.fetchUtils.fetchStreamWithResponse.should.have.been.calledWith(
`${ctx.settings.apis.clsi.url}/project/${ctx.projectId}/user/${ctx.user_id}/build/${ctx.build_id}/output/output.zip?compileBackendClass=c4d&clsiserverid=${ctx.clsiServerId}`
`${ctx.settings.apis.clsi.url}/project/${ctx.projectId}/user/${ctx.user_id}/build/${ctx.build_id}/output/output.zip?compileBackendClass=premium&clsiserverid=${ctx.clsiServerId}`
)
})
})
@@ -19,7 +19,11 @@ describe('CompileManager', function () {
vi.doMock('@overleaf/settings', () => ({
default: (ctx.settings = {
apis: {
clsi: { submissionBackendClass: 'c3d' },
clsi: {
submissionCompileBackendClass: 'free',
standardCompileBackendClass: 'free',
priorityCompileBackendClass: 'premium',
},
},
redis: { web: { host: '127.0.0.1', port: 42 } },
rateLimit: { autoCompile: {} },
@@ -292,7 +296,7 @@ describe('CompileManager', function () {
.calledWith(null, {
timeout: ctx.timeout,
compileGroup: ctx.group,
compileBackendClass: 'c4d',
compileBackendClass: 'premium',
ownerAnalyticsId: 'abc',
})
.should.equal(true)
@@ -322,7 +326,7 @@ describe('CompileManager', function () {
await ctx.CompileManager.promises.getProjectCompileLimits(
ctx.project_id
)
expect(compileBackendClass).to.equal('c4d')
expect(compileBackendClass).to.equal('premium')
})
})
})