helperCleanup.test.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233
  1. // @vitest-environment node
  2. import {expect,it,vi} from 'vitest'
  3. import {mkdtempSync,rmSync} from 'node:fs'
  4. import {tmpdir} from 'node:os'
  5. import {join} from 'node:path'
  6. import {randomUUID} from 'node:crypto'
  7. import {DatabaseSync} from 'node:sqlite'
  8. import {ComputerRuntime} from '../../src/runner/worker/gateway'
  9. it('rejects foreign retirement and resumes failed workspace cleanup from its durable record',async()=>{
  10. const home=mkdtempSync(join(tmpdir(),'yaoyao-helper-cleanup-')),db=new DatabaseSync(':memory:')
  11. const runtime=new ComputerRuntime(db,{protocol:1,runnerId:randomUUID(),serverURL:'http://127.0.0.1',hermesURL:'http://127.0.0.1',token:'fixture',allowedProfiles:['default'],artifactRoots:[],computers:{runtime:'docker',imageId:'sha256:'+'a'.repeat(64),python:'/fixture/python',hermesSource:'/fixture/source',hermesHome:'/fixture/home'}},home)
  12. try{
  13. await runtime.ready
  14. vi.spyOn(runtime.provider,'ensure').mockResolvedValue({id:'fixture',containerId:'fixture',running:true,workspace:'/fixture',isolation:'container'})
  15. const stop=vi.spyOn(runtime.provider,'stop').mockResolvedValue(undefined)
  16. vi.spyOn(runtime.provider,'remove').mockResolvedValue(undefined)
  17. const remove=vi.spyOn(runtime.provider,'deleteWorkspace').mockRejectedValueOnce(new Error('storage unavailable')).mockResolvedValue(undefined)
  18. const meta={environmentId:randomUUID(),agentId:randomUUID(),ownerKey:'owner'}
  19. const spec={id:meta.environmentId,ownerKey:meta.ownerKey,imageId:runtime.config.imageId}
  20. const lease=await runtime.pool.acquire(spec,'task',()=>{})
  21. await expect(runtime.retire({...meta,ownerKey:'foreign'})).rejects.toMatchObject({code:'computer_owner_mismatch'})
  22. expect(stop).not.toHaveBeenCalled()
  23. await runtime.pool.release(lease)
  24. await expect(runtime.retire(meta)).rejects.toThrow('storage unavailable')
  25. expect(runtime.pool.definition(meta.ownerKey,meta.environmentId)).toBeUndefined()
  26. expect(()=>runtime.assertTarget(meta)).toThrow('临时电脑已退役')
  27. await runtime.retire(meta)
  28. expect(remove).toHaveBeenCalledTimes(2)
  29. expect(remove.mock.calls[1]![0]).toMatchObject(spec)
  30. await runtime.retire(meta)
  31. expect(remove).toHaveBeenCalledTimes(2)
  32. }finally{await runtime.pool.close();db.close();rmSync(home,{recursive:true,force:true})}
  33. })