runtime_errors.spec.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // SPDX-License-Identifier: Apache-2.0
  2. import { Keypair, PublicKey } from '@solana/web3.js';
  3. import expect from 'expect';
  4. import { loadContract } from './setup';
  5. import { Program, Provider, BN } from '@project-serum/anchor';
  6. describe('Runtime Errors', function () {
  7. this.timeout(150000);
  8. let program: Program;
  9. let storage: Keypair;
  10. let payer: Keypair;
  11. let provider: Provider;
  12. before(async function () {
  13. ({ program, storage, payer, provider } = await loadContract('RuntimeErrors'));
  14. });
  15. it('Prints runtime errors', async function () {
  16. try {
  17. let res = await program.methods.setStorageBytes().accounts({ dataAccount: storage.publicKey }).simulate();
  18. }
  19. catch (e: any) {
  20. const logs = e.simulationResponse.logs;
  21. expect(logs).toContain("Program log: storage index out of bounds in runtime_errors.sol:42:10");
  22. }
  23. try {
  24. let res = await program.methods.getStorageBytes().accounts({ dataAccount: storage.publicKey }).simulate();;
  25. }
  26. catch (e: any) {
  27. const logs = e.simulationResponse.logs;
  28. expect(logs).toContain("Program log: storage array index out of bounds in runtime_errors.sol:49:18");
  29. }
  30. try {
  31. let res = await program.methods.popEmptyStorage().accounts({ dataAccount: storage.publicKey }).simulate();
  32. } catch (e: any) {
  33. const logs = e.simulationResponse.logs;
  34. expect(logs).toContain("Program log: pop from empty storage array in runtime_errors.sol:61:8")
  35. }
  36. try {
  37. let res = await program.methods.invalidInstruction().accounts({ dataAccount: storage.publicKey }).simulate();
  38. } catch (e: any) {
  39. const logs = e.simulationResponse.logs;
  40. expect(logs).toContain("Program log: reached invalid instruction in runtime_errors.sol:108:12")
  41. }
  42. try {
  43. let res = await program.methods.byteCastFailure(new BN(33)).accounts({ dataAccount: storage.publicKey }).simulate();
  44. } catch (e: any) {
  45. const logs = e.simulationResponse.logs;
  46. expect(logs).toContain("Program log: bytes cast error in runtime_errors.sol:114:22")
  47. }
  48. try {
  49. let res = await program.methods.iWillRevert().accounts({ dataAccount: storage.publicKey }).simulate();
  50. } catch (e: any) {
  51. const logs = e.simulationResponse.logs;
  52. expect(logs).toContain("Program log: revert encountered in runtime_errors.sol:76:8")
  53. }
  54. try {
  55. let res = await program.methods.assertTest(new BN(9)).accounts({ dataAccount: storage.publicKey }).simulate();
  56. } catch (e: any) {
  57. const logs = e.simulationResponse.logs;
  58. expect(logs).toContain("Program log: assert failure in runtime_errors.sol:35:15")
  59. }
  60. try {
  61. let res = await program.methods.writeIntegerFailure(new BN(1)).accounts({ dataAccount: storage.publicKey }).simulate();
  62. } catch (e: any) {
  63. const logs = e.simulationResponse.logs;
  64. expect(logs).toContain("Program log: integer too large to write in buffer in runtime_errors.sol:81:17")
  65. }
  66. try {
  67. let res = await program.methods.writeBytesFailure(new BN(9)).accounts({ dataAccount: storage.publicKey }).simulate();
  68. } catch (e: any) {
  69. const logs = e.simulationResponse.logs;
  70. expect(logs).toContain("Program log: data does not fit into buffer in runtime_errors.sol:87:17")
  71. }
  72. try {
  73. let res = await program.methods.readIntegerFailure(new BN(2)).accounts({ dataAccount: storage.publicKey }).simulate();
  74. } catch (e: any) {
  75. const logs = e.simulationResponse.logs;
  76. expect(logs).toContain("Program log: read integer out of bounds in runtime_errors.sol:92:17")
  77. }
  78. try {
  79. let res = await program.methods.outOfBounds(new BN(19)).accounts({ dataAccount: storage.publicKey }).simulate();
  80. } catch (e: any) {
  81. const logs = e.simulationResponse.logs;
  82. expect(logs).toContain("Program log: array index out of bounds in runtime_errors.sol:103:15")
  83. }
  84. try {
  85. let res = await program.methods.truncFailure(new BN(99999999999999)).accounts({ dataAccount: storage.publicKey }).simulate();
  86. } catch (e: any) {
  87. const logs = e.simulationResponse.logs;
  88. expect(logs).toContain("Program log: truncated type overflows in runtime_errors.sol:97:36")
  89. }
  90. let child_program = new PublicKey("Cre7AzxtwSxXwU2jekYtCAQ57DkBhY9SjGDLdcrwhAo6");
  91. let child = Keypair.generate();
  92. const signature = await program.methods.createChild(child.publicKey, payer.publicKey)
  93. .accounts({ dataAccount: storage.publicKey })
  94. .remainingAccounts([
  95. { pubkey: child_program, isSigner: false, isWritable: false },
  96. { pubkey: child.publicKey, isSigner: true, isWritable: true },
  97. { pubkey: payer.publicKey, isSigner: true, isWritable: true },
  98. ])
  99. .signers([payer, child])
  100. .rpc({ commitment: 'confirmed' });
  101. const tx = await provider.connection.getTransaction(signature, { commitment: 'confirmed' });
  102. try {
  103. const signature = await program.methods.createChild(child.publicKey, payer.publicKey)
  104. .accounts({ dataAccount: storage.publicKey })
  105. .remainingAccounts([
  106. { pubkey: child_program, isSigner: false, isWritable: false },
  107. { pubkey: payer.publicKey, isSigner: true, isWritable: true },
  108. ])
  109. .signers([payer]).simulate();
  110. } catch (e: any) {
  111. const logs = e.simulationResponse.logs
  112. expect(logs).toContain("Program log: contract creation failed in runtime_errors.sol:71:12")
  113. }
  114. });
  115. });