anchor/tests/zero-copy/tests/zero-copy.js

247 lines
8.0 KiB
JavaScript
Raw Normal View History

2021-10-08 09:24:25 -07:00
const anchor = require('@project-serum/anchor')
const PublicKey = anchor.web3.PublicKey
const BN = anchor.BN
const assert = require('assert')
2021-04-17 12:07:48 -07:00
2021-10-08 09:24:25 -07:00
describe('zero-copy', () => {
2021-04-17 12:07:48 -07:00
// Configure the client to use the local cluster.
2021-10-08 09:24:25 -07:00
anchor.setProvider(anchor.Provider.env())
2021-04-17 12:07:48 -07:00
2021-10-08 09:24:25 -07:00
const program = anchor.workspace.ZeroCopy
const programCpi = anchor.workspace.ZeroCpi
2021-04-17 12:07:48 -07:00
2021-10-08 09:24:25 -07:00
const foo = anchor.web3.Keypair.generate()
it('Is creates a zero copy account', async () => {
2021-04-17 12:07:48 -07:00
await program.rpc.createFoo({
accounts: {
foo: foo.publicKey,
authority: program.provider.wallet.publicKey,
rent: anchor.web3.SYSVAR_RENT_PUBKEY,
},
instructions: [await program.account.foo.createInstruction(foo)],
signers: [foo],
2021-10-08 09:24:25 -07:00
})
const account = await program.account.foo.fetch(foo.publicKey)
2021-04-17 12:07:48 -07:00
assert.ok(
JSON.stringify(account.authority.toBuffer()) ===
JSON.stringify(program.provider.wallet.publicKey.toBuffer())
2021-10-08 09:24:25 -07:00
)
assert.ok(account.data.toNumber() === 0)
assert.ok(account.secondData.toNumber() === 0)
2021-04-17 12:07:48 -07:00
assert.ok(
JSON.stringify(account.secondAuthority) ===
JSON.stringify([...program.provider.wallet.publicKey.toBuffer()])
2021-10-08 09:24:25 -07:00
)
})
2021-04-17 12:07:48 -07:00
2021-10-08 09:24:25 -07:00
it('Updates a zero copy account field', async () => {
await program.rpc.updateFoo(new BN(1234), {
2021-04-17 12:07:48 -07:00
accounts: {
foo: foo.publicKey,
authority: program.provider.wallet.publicKey,
},
2021-10-08 09:24:25 -07:00
})
2021-04-17 12:07:48 -07:00
2021-10-08 09:24:25 -07:00
const account = await program.account.foo.fetch(foo.publicKey)
2021-04-17 12:07:48 -07:00
assert.ok(
JSON.stringify(account.authority.toBuffer()) ===
JSON.stringify(program.provider.wallet.publicKey.toBuffer())
2021-10-08 09:24:25 -07:00
)
assert.ok(account.data.toNumber() === 1234)
assert.ok(account.secondData.toNumber() === 0)
2021-04-17 12:07:48 -07:00
assert.ok(
JSON.stringify(account.secondAuthority) ===
JSON.stringify([...program.provider.wallet.publicKey.toBuffer()])
2021-10-08 09:24:25 -07:00
)
})
2021-04-17 12:07:48 -07:00
2021-10-08 09:24:25 -07:00
it('Updates a a second zero copy account field', async () => {
await program.rpc.updateFooSecond(new BN(55), {
2021-04-17 12:07:48 -07:00
accounts: {
foo: foo.publicKey,
secondAuthority: program.provider.wallet.publicKey,
},
2021-10-08 09:24:25 -07:00
})
2021-04-17 12:07:48 -07:00
2021-10-08 09:24:25 -07:00
const account = await program.account.foo.fetch(foo.publicKey)
2021-04-17 12:07:48 -07:00
assert.ok(
JSON.stringify(account.authority.toBuffer()) ===
JSON.stringify(program.provider.wallet.publicKey.toBuffer())
2021-10-08 09:24:25 -07:00
)
assert.ok(account.data.toNumber() === 1234)
assert.ok(account.secondData.toNumber() === 55)
2021-04-17 12:07:48 -07:00
assert.ok(
JSON.stringify(account.secondAuthority) ===
JSON.stringify([...program.provider.wallet.publicKey.toBuffer()])
2021-10-08 09:24:25 -07:00
)
})
2021-04-17 12:07:48 -07:00
2021-10-08 09:24:25 -07:00
it('Creates an associated zero copy account', async () => {
2021-04-17 12:07:48 -07:00
await program.rpc.createBar({
accounts: {
bar: (
await PublicKey.findProgramAddress(
2021-10-08 09:24:25 -07:00
[program.provider.wallet.publicKey.toBuffer(), foo.publicKey.toBuffer()],
program.programId
)
)[0],
2021-04-17 12:07:48 -07:00
authority: program.provider.wallet.publicKey,
foo: foo.publicKey,
systemProgram: anchor.web3.SystemProgram.programId,
},
2021-10-08 09:24:25 -07:00
})
2021-04-17 12:07:48 -07:00
const bar = (
await PublicKey.findProgramAddress(
2021-10-08 09:24:25 -07:00
[program.provider.wallet.publicKey.toBuffer(), foo.publicKey.toBuffer()],
program.programId
)
2021-10-08 09:24:25 -07:00
)[0]
const barAccount = await program.account.bar.fetch(bar)
assert.ok(barAccount.authority.equals(program.provider.wallet.publicKey))
assert.ok(barAccount.data.toNumber() === 0)
})
2021-04-17 12:07:48 -07:00
2021-10-08 09:24:25 -07:00
it('Updates an associated zero copy account', async () => {
const bar = (
await PublicKey.findProgramAddress(
2021-10-08 09:24:25 -07:00
[program.provider.wallet.publicKey.toBuffer(), foo.publicKey.toBuffer()],
program.programId
)
2021-10-08 09:24:25 -07:00
)[0]
await program.rpc.updateBar(new BN(99), {
2021-04-17 12:07:48 -07:00
accounts: {
bar,
2021-04-17 12:07:48 -07:00
authority: program.provider.wallet.publicKey,
foo: foo.publicKey,
2021-04-17 12:07:48 -07:00
},
2021-10-08 09:24:25 -07:00
})
const barAccount = await program.account.bar.fetch(bar)
assert.ok(barAccount.authority.equals(program.provider.wallet.publicKey))
assert.ok(barAccount.data.toNumber() === 99)
// Check zero_copy CPI
await programCpi.rpc.checkCpi(new BN(1337), {
accounts: {
bar,
authority: program.provider.wallet.publicKey,
foo: foo.publicKey,
zeroCopyProgram: program.programId,
},
})
const barAccountAfterCpi = await program.account.bar.fetch(bar)
assert.ok(barAccountAfterCpi.authority.equals(program.provider.wallet.publicKey))
assert.ok(barAccountAfterCpi.data.toNumber() === 1337)
})
2021-04-17 12:07:48 -07:00
2021-10-08 09:24:25 -07:00
const eventQ = anchor.web3.Keypair.generate()
const size = 1000000 + 8 // Account size in bytes.
2021-04-17 12:07:48 -07:00
2021-10-08 09:24:25 -07:00
it('Creates a large event queue', async () => {
2021-04-17 12:07:48 -07:00
await program.rpc.createLargeAccount({
accounts: {
eventQ: eventQ.publicKey,
rent: anchor.web3.SYSVAR_RENT_PUBKEY,
},
2021-10-08 09:24:25 -07:00
instructions: [await program.account.eventQ.createInstruction(eventQ, size)],
2021-04-17 12:07:48 -07:00
signers: [eventQ],
2021-10-08 09:24:25 -07:00
})
const account = await program.account.eventQ.fetch(eventQ.publicKey)
assert.ok(account.events.length === 25000)
2021-04-17 12:07:48 -07:00
account.events.forEach((event) => {
2021-10-08 09:24:25 -07:00
assert.ok(event.from.equals(PublicKey.default))
assert.ok(event.data.toNumber() === 0)
})
})
2021-04-17 12:07:48 -07:00
2021-10-08 09:24:25 -07:00
it('Updates a large event queue', async () => {
2021-04-17 12:07:48 -07:00
// Set index 0.
await program.rpc.updateLargeAccount(0, new BN(48), {
2021-04-17 12:07:48 -07:00
accounts: {
eventQ: eventQ.publicKey,
from: program.provider.wallet.publicKey,
},
2021-10-08 09:24:25 -07:00
})
2021-04-17 12:07:48 -07:00
// Verify update.
2021-10-08 09:24:25 -07:00
let account = await program.account.eventQ.fetch(eventQ.publicKey)
assert.ok(account.events.length === 25000)
2021-04-17 12:07:48 -07:00
account.events.forEach((event, idx) => {
if (idx === 0) {
2021-10-08 09:24:25 -07:00
assert.ok(event.from.equals(program.provider.wallet.publicKey))
assert.ok(event.data.toNumber() === 48)
2021-04-17 12:07:48 -07:00
} else {
2021-10-08 09:24:25 -07:00
assert.ok(event.from.equals(PublicKey.default))
assert.ok(event.data.toNumber() === 0)
2021-04-17 12:07:48 -07:00
}
2021-10-08 09:24:25 -07:00
})
2021-04-17 12:07:48 -07:00
// Set index 11111.
await program.rpc.updateLargeAccount(11111, new BN(1234), {
2021-04-17 12:07:48 -07:00
accounts: {
eventQ: eventQ.publicKey,
from: program.provider.wallet.publicKey,
},
2021-10-08 09:24:25 -07:00
})
2021-04-17 12:07:48 -07:00
// Verify update.
2021-10-08 09:24:25 -07:00
account = await program.account.eventQ.fetch(eventQ.publicKey)
assert.ok(account.events.length === 25000)
2021-04-17 12:07:48 -07:00
account.events.forEach((event, idx) => {
if (idx === 0) {
2021-10-08 09:24:25 -07:00
assert.ok(event.from.equals(program.provider.wallet.publicKey))
assert.ok(event.data.toNumber() === 48)
2021-04-17 12:07:48 -07:00
} else if (idx === 11111) {
2021-10-08 09:24:25 -07:00
assert.ok(event.from.equals(program.provider.wallet.publicKey))
assert.ok(event.data.toNumber() === 1234)
2021-04-17 12:07:48 -07:00
} else {
2021-10-08 09:24:25 -07:00
assert.ok(event.from.equals(PublicKey.default))
assert.ok(event.data.toNumber() === 0)
2021-04-17 12:07:48 -07:00
}
2021-10-08 09:24:25 -07:00
})
2021-04-17 12:07:48 -07:00
// Set last index.
await program.rpc.updateLargeAccount(24999, new BN(99), {
2021-04-17 12:07:48 -07:00
accounts: {
eventQ: eventQ.publicKey,
from: program.provider.wallet.publicKey,
},
2021-10-08 09:24:25 -07:00
})
2021-04-17 12:07:48 -07:00
// Verify update.
2021-10-08 09:24:25 -07:00
account = await program.account.eventQ.fetch(eventQ.publicKey)
assert.ok(account.events.length === 25000)
2021-04-17 12:07:48 -07:00
account.events.forEach((event, idx) => {
if (idx === 0) {
2021-10-08 09:24:25 -07:00
assert.ok(event.from.equals(program.provider.wallet.publicKey))
assert.ok(event.data.toNumber() === 48)
2021-04-17 12:07:48 -07:00
} else if (idx === 11111) {
2021-10-08 09:24:25 -07:00
assert.ok(event.from.equals(program.provider.wallet.publicKey))
assert.ok(event.data.toNumber() === 1234)
2021-04-17 12:07:48 -07:00
} else if (idx === 24999) {
2021-10-08 09:24:25 -07:00
assert.ok(event.from.equals(program.provider.wallet.publicKey))
assert.ok(event.data.toNumber() === 99)
2021-04-17 12:07:48 -07:00
} else {
2021-10-08 09:24:25 -07:00
assert.ok(event.from.equals(PublicKey.default))
assert.ok(event.data.toNumber() === 0)
2021-04-17 12:07:48 -07:00
}
2021-10-08 09:24:25 -07:00
})
})
2021-04-17 12:07:48 -07:00
2021-10-08 09:24:25 -07:00
it('Errors when setting an out of bounds index', async () => {
2021-04-17 12:07:48 -07:00
// Fail to set non existing index.
await assert.rejects(
async () => {
await program.rpc.updateLargeAccount(25000, new BN(1), {
2021-04-17 12:07:48 -07:00
accounts: {
eventQ: eventQ.publicKey,
from: program.provider.wallet.publicKey,
},
2021-10-08 09:24:25 -07:00
})
2021-04-17 12:07:48 -07:00
},
(err) => {
2021-10-08 09:24:25 -07:00
console.log('err', err)
return true
2021-04-17 12:07:48 -07:00
}
2021-10-08 09:24:25 -07:00
)
})
})