runtime_errors.spec.ts 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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: runtime_error: storage index out of bounds in runtime_errors.sol:42:11-12,
  22. `);
  23. }
  24. try {
  25. let res = await program.methods.getStorageBytes().accounts({ dataAccount: storage.publicKey }).simulate();;
  26. }
  27. catch (e: any) {
  28. const logs = e.simulationResponse.logs;
  29. expect(logs).toContain(`Program log: runtime_error: storage array index out of bounds in runtime_errors.sol:49:19-23,
  30. `);
  31. }
  32. try {
  33. let res = await program.methods.popEmptyStorage().accounts({ dataAccount: storage.publicKey }).simulate();
  34. } catch (e: any) {
  35. const logs = e.simulationResponse.logs;
  36. expect(logs).toContain(`Program log: runtime_error: pop from empty storage array in runtime_errors.sol:61:9-12,
  37. `)
  38. }
  39. try {
  40. let res = await program.methods.invalidInstruction().accounts({ dataAccount: storage.publicKey }).simulate();
  41. } catch (e: any) {
  42. const logs = e.simulationResponse.logs;
  43. expect(logs).toContain(`Program log: runtime_error: reached invalid instruction in runtime_errors.sol:108:13-22,
  44. `)
  45. }
  46. try {
  47. let res = await program.methods.byteCastFailure(new BN(33)).accounts({ dataAccount: storage.publicKey }).simulate();
  48. } catch (e: any) {
  49. const logs = e.simulationResponse.logs;
  50. expect(logs).toContain(`Program log: runtime_error: bytes cast error in runtime_errors.sol:114:23-40,
  51. `)
  52. }
  53. try {
  54. let res = await program.methods.iWillRevert().accounts({ dataAccount: storage.publicKey }).simulate();
  55. } catch (e: any) {
  56. const logs = e.simulationResponse.logs;
  57. expect(logs).toContain(`Program log: runtime_error: revert encountered in runtime_errors.sol:76:9-15,
  58. `)
  59. }
  60. try {
  61. let res = await program.methods.assertTest(new BN(9)).accounts({ dataAccount: storage.publicKey }).simulate();
  62. } catch (e: any) {
  63. const logs = e.simulationResponse.logs;
  64. expect(logs).toContain(`Program log: runtime_error: assert failure in runtime_errors.sol:35:16-24,
  65. `)
  66. }
  67. try {
  68. let res = await program.methods.writeIntegerFailure(new BN(1)).accounts({ dataAccount: storage.publicKey }).simulate();
  69. } catch (e: any) {
  70. const logs = e.simulationResponse.logs;
  71. expect(logs).toContain(`Program log: runtime_error: integer too large to write in buffer in runtime_errors.sol:81:18-31,
  72. `)
  73. }
  74. try {
  75. let res = await program.methods.writeBytesFailure(new BN(9)).accounts({ dataAccount: storage.publicKey }).simulate();
  76. } catch (e: any) {
  77. const logs = e.simulationResponse.logs;
  78. expect(logs).toContain(`Program log: runtime_error: data does not fit into buffer in runtime_errors.sol:87:18-28,
  79. `)
  80. }
  81. try {
  82. let res = await program.methods.readIntegerFailure(new BN(2)).accounts({ dataAccount: storage.publicKey }).simulate();
  83. } catch (e: any) {
  84. const logs = e.simulationResponse.logs;
  85. expect(logs).toContain(`Program log: runtime_error: read integer out of bounds in runtime_errors.sol:92:18-30,
  86. `)
  87. }
  88. try {
  89. let res = await program.methods.outOfBounds(new BN(19)).accounts({ dataAccount: storage.publicKey }).simulate();
  90. } catch (e: any) {
  91. const logs = e.simulationResponse.logs;
  92. expect(logs).toContain(`Program log: runtime_error: array index out of bounds in runtime_errors.sol:103:16-21,
  93. `)
  94. }
  95. try {
  96. let res = await program.methods.truncFailure(new BN(99999999999999)).accounts({ dataAccount: storage.publicKey }).simulate();
  97. } catch (e: any) {
  98. const logs = e.simulationResponse.logs;
  99. expect(logs).toContain(`Program log: runtime_error: truncated type overflows in runtime_errors.sol:97:37-42,
  100. `)
  101. }
  102. let child_program = new PublicKey("Cre7AzxtwSxXwU2jekYtCAQ57DkBhY9SjGDLdcrwhAo6");
  103. let child = Keypair.generate();
  104. const signature = await program.methods.createChild(child.publicKey, payer.publicKey)
  105. .accounts({ dataAccount: storage.publicKey })
  106. .remainingAccounts([
  107. { pubkey: child_program, isSigner: false, isWritable: false },
  108. { pubkey: child.publicKey, isSigner: true, isWritable: true },
  109. { pubkey: payer.publicKey, isSigner: true, isWritable: true },
  110. ])
  111. .signers([payer, child])
  112. .rpc({ commitment: 'confirmed' });
  113. const tx = await provider.connection.getTransaction(signature, { commitment: 'confirmed' });
  114. try {
  115. const signature = await program.methods.createChild(child.publicKey, payer.publicKey)
  116. .accounts({ dataAccount: storage.publicKey })
  117. .remainingAccounts([
  118. { pubkey: child_program, isSigner: false, isWritable: false },
  119. { pubkey: payer.publicKey, isSigner: true, isWritable: true },
  120. ])
  121. .signers([payer]).simulate();
  122. } catch (e: any) {
  123. const logs = e.simulationResponse.logs
  124. expect(logs).toContain(`Program log: runtime_error: contract creation failed in runtime_errors.sol:71:13-62,
  125. `)
  126. }
  127. });
  128. });