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 () => {
|
2021-05-24 22:31:48 -07:00
|
|
|
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 () => {
|
2021-05-24 22:31:48 -07:00
|
|
|
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: {
|
2021-08-15 16:35:53 -07:00
|
|
|
bar: (
|
|
|
|
await PublicKey.findProgramAddress(
|
2021-10-08 09:24:25 -07:00
|
|
|
[program.provider.wallet.publicKey.toBuffer(), foo.publicKey.toBuffer()],
|
2021-08-15 16:35:53 -07:00
|
|
|
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
|
|
|
|
2021-08-15 16:35:53 -07:00
|
|
|
const bar = (
|
|
|
|
await PublicKey.findProgramAddress(
|
2021-10-08 09:24:25 -07:00
|
|
|
[program.provider.wallet.publicKey.toBuffer(), foo.publicKey.toBuffer()],
|
2021-08-15 16:35:53 -07:00
|
|
|
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 () => {
|
2021-08-15 16:35:53 -07:00
|
|
|
const bar = (
|
|
|
|
await PublicKey.findProgramAddress(
|
2021-10-08 09:24:25 -07:00
|
|
|
[program.provider.wallet.publicKey.toBuffer(), foo.publicKey.toBuffer()],
|
2021-08-15 16:35:53 -07:00
|
|
|
program.programId
|
|
|
|
)
|
2021-10-08 09:24:25 -07:00
|
|
|
)[0]
|
2021-05-24 22:31:48 -07:00
|
|
|
await program.rpc.updateBar(new BN(99), {
|
2021-04-17 12:07:48 -07:00
|
|
|
accounts: {
|
2021-08-15 16:35:53 -07:00
|
|
|
bar,
|
2021-04-17 12:07:48 -07:00
|
|
|
authority: program.provider.wallet.publicKey,
|
2021-05-24 22:31:48 -07:00
|
|
|
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.
|
2021-05-24 22:31:48 -07:00
|
|
|
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.
|
2021-05-24 22:31:48 -07:00
|
|
|
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.
|
2021-05-24 22:31:48 -07:00
|
|
|
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 () => {
|
2021-05-24 22:31:48 -07:00
|
|
|
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
|
|
|
)
|
|
|
|
})
|
|
|
|
})
|