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

230 lines
7.4 KiB
JavaScript
Raw Normal View History

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