213 lines
6.2 KiB
TypeScript
213 lines
6.2 KiB
TypeScript
import { assert } from 'vitest'
|
|
|
|
import { sandboxTest, isDebug } from '../setup.js'
|
|
import { Sandbox } from '../../src'
|
|
|
|
sandboxTest.skipIf(isDebug)(
|
|
'create a snapshot from sandbox',
|
|
async ({ sandbox }) => {
|
|
// Write a file to the sandbox
|
|
await sandbox.files.write('/home/user/test.txt', 'snapshot test content')
|
|
|
|
// Create a snapshot
|
|
const snapshot = await sandbox.createSnapshot()
|
|
|
|
assert.isString(snapshot.snapshotId)
|
|
assert.isTrue(snapshot.snapshotId.length > 0)
|
|
|
|
// Cleanup
|
|
await Sandbox.deleteSnapshot(snapshot.snapshotId)
|
|
}
|
|
)
|
|
|
|
sandboxTest.skipIf(isDebug)(
|
|
'create sandbox from snapshot',
|
|
async ({ sandbox, sandboxTestId }) => {
|
|
const testContent = 'content from original sandbox'
|
|
|
|
// Write a file to the sandbox
|
|
await sandbox.files.write('/home/user/test.txt', testContent)
|
|
|
|
// Create a snapshot
|
|
const snapshot = await sandbox.createSnapshot()
|
|
|
|
try {
|
|
// Create a new sandbox from the snapshot
|
|
const newSandbox = await Sandbox.create(snapshot.snapshotId, {
|
|
metadata: { sandboxTestId: `${sandboxTestId}-from-snapshot` },
|
|
})
|
|
|
|
try {
|
|
// Verify the file exists in the new sandbox
|
|
const content = await newSandbox.files.read('/home/user/test.txt')
|
|
assert.equal(content, testContent)
|
|
} finally {
|
|
await newSandbox.kill()
|
|
}
|
|
} finally {
|
|
await Sandbox.deleteSnapshot(snapshot.snapshotId)
|
|
}
|
|
}
|
|
)
|
|
|
|
sandboxTest.skipIf(isDebug)(
|
|
'create multiple sandboxes from same snapshot',
|
|
async ({ sandbox, sandboxTestId }) => {
|
|
const testContent = 'shared snapshot content'
|
|
|
|
await sandbox.files.write('/home/user/shared.txt', testContent)
|
|
|
|
const snapshot = await sandbox.createSnapshot()
|
|
|
|
try {
|
|
// Create two sandboxes from the same snapshot
|
|
const sandbox1 = await Sandbox.create(snapshot.snapshotId, {
|
|
metadata: { sandboxTestId: `${sandboxTestId}-branch-1` },
|
|
})
|
|
const sandbox2 = await Sandbox.create(snapshot.snapshotId, {
|
|
metadata: { sandboxTestId: `${sandboxTestId}-branch-2` },
|
|
})
|
|
|
|
try {
|
|
// Both should have the same initial content
|
|
const content1 = await sandbox1.files.read('/home/user/shared.txt')
|
|
const content2 = await sandbox2.files.read('/home/user/shared.txt')
|
|
|
|
assert.equal(content1, testContent)
|
|
assert.equal(content2, testContent)
|
|
|
|
// Modify one sandbox - should not affect the other
|
|
await sandbox1.files.write(
|
|
'/home/user/shared.txt',
|
|
'modified in sandbox1'
|
|
)
|
|
|
|
const modifiedContent = await sandbox1.files.read(
|
|
'/home/user/shared.txt'
|
|
)
|
|
const unchangedContent = await sandbox2.files.read(
|
|
'/home/user/shared.txt'
|
|
)
|
|
|
|
assert.equal(modifiedContent, 'modified in sandbox1')
|
|
assert.equal(unchangedContent, testContent)
|
|
} finally {
|
|
await sandbox1.kill()
|
|
await sandbox2.kill()
|
|
}
|
|
} finally {
|
|
await Sandbox.deleteSnapshot(snapshot.snapshotId)
|
|
}
|
|
}
|
|
)
|
|
|
|
sandboxTest.skipIf(isDebug)('list snapshots', async ({ sandbox }) => {
|
|
// Create a snapshot
|
|
const snapshot = await sandbox.createSnapshot()
|
|
|
|
try {
|
|
// List all snapshots
|
|
const paginator = Sandbox.listSnapshots()
|
|
assert.isTrue(paginator.hasNext)
|
|
|
|
const snapshots = await paginator.nextItems()
|
|
assert.isArray(snapshots)
|
|
|
|
// Find our snapshot in the list
|
|
const found = snapshots.find((s) => s.snapshotId === snapshot.snapshotId)
|
|
assert.isDefined(found)
|
|
} finally {
|
|
await Sandbox.deleteSnapshot(snapshot.snapshotId)
|
|
}
|
|
})
|
|
|
|
sandboxTest.skipIf(isDebug)(
|
|
'list snapshots for specific sandbox',
|
|
async ({ sandbox }) => {
|
|
// Create a snapshot
|
|
const snapshot = await sandbox.createSnapshot()
|
|
|
|
try {
|
|
// List snapshots for this sandbox using instance method
|
|
const paginator = sandbox.listSnapshots()
|
|
const snapshots = await paginator.nextItems()
|
|
|
|
// Should find our snapshot
|
|
const found = snapshots.find((s) => s.snapshotId === snapshot.snapshotId)
|
|
assert.isDefined(found)
|
|
} finally {
|
|
await Sandbox.deleteSnapshot(snapshot.snapshotId)
|
|
}
|
|
}
|
|
)
|
|
|
|
sandboxTest.skipIf(isDebug)(
|
|
'create a named snapshot',
|
|
async ({ sandbox, sandboxTestId }) => {
|
|
const snapshotName = `snap-${sandboxTestId}`
|
|
|
|
const snapshot = await sandbox.createSnapshot({ name: snapshotName })
|
|
|
|
try {
|
|
assert.isString(snapshot.snapshotId)
|
|
assert.isArray(snapshot.names)
|
|
assert.isTrue(snapshot.names.length > 0)
|
|
assert.isTrue(snapshot.names.some((n) => n.includes(snapshotName)))
|
|
} finally {
|
|
await Sandbox.deleteSnapshot(snapshot.snapshotId)
|
|
}
|
|
}
|
|
)
|
|
|
|
sandboxTest.skipIf(isDebug)('delete snapshot', async ({ sandbox }) => {
|
|
const snapshot = await sandbox.createSnapshot()
|
|
|
|
// Delete should succeed
|
|
const deleted = await Sandbox.deleteSnapshot(snapshot.snapshotId)
|
|
assert.isTrue(deleted)
|
|
|
|
// Second delete should return false (not found)
|
|
const deletedAgain = await Sandbox.deleteSnapshot(snapshot.snapshotId)
|
|
assert.isFalse(deletedAgain)
|
|
})
|
|
|
|
sandboxTest.skipIf(isDebug)(
|
|
'snapshot preserves file system state',
|
|
async ({ sandbox, sandboxTestId }) => {
|
|
const appDir = '/home/user/app'
|
|
const configPath = `${appDir}/config.json`
|
|
const configContent = '{"env": "test"}'
|
|
const dataPath = `${appDir}/data.txt`
|
|
const dataContent = 'important data'
|
|
|
|
await sandbox.files.makeDir(appDir)
|
|
await sandbox.files.write(configPath, configContent)
|
|
await sandbox.files.write(dataPath, dataContent)
|
|
|
|
const snapshot = await sandbox.createSnapshot()
|
|
|
|
try {
|
|
const newSandbox = await Sandbox.create(snapshot.snapshotId, {
|
|
metadata: { sandboxTestId: `${sandboxTestId}-fs-test` },
|
|
})
|
|
|
|
try {
|
|
// Verify directory exists
|
|
const dirExists = await newSandbox.files.exists(appDir)
|
|
assert.isTrue(dirExists)
|
|
|
|
// Verify files exist with correct content
|
|
const config = await newSandbox.files.read(configPath)
|
|
const data = await newSandbox.files.read(dataPath)
|
|
|
|
assert.equal(config, configContent)
|
|
assert.equal(data, dataContent)
|
|
} finally {
|
|
await newSandbox.kill()
|
|
}
|
|
} finally {
|
|
await Sandbox.deleteSnapshot(snapshot.snapshotId)
|
|
}
|
|
}
|
|
)
|