Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update/template comments #287

Open
wants to merge 6 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions crates/cli/src/command/fuzz.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use fehler::throws;
use heck::ToSnakeCase;
use trident_client::___private::{Commander, TestGenerator};

use crate::{_discover, show_howto};
use crate::_discover;

pub const TRIDENT_TOML: &str = "Trident.toml";
pub const TRIDENT_TESTS: &str = "trident-tests";
Expand Down Expand Up @@ -169,7 +169,6 @@ pub async fn fuzz(subcmd: FuzzCommand) {
generator
.add_fuzz_test(program_name, test_name_snake)
.await?;
show_howto();
}
};
}
45 changes: 35 additions & 10 deletions crates/cli/src/howto.md
Original file line number Diff line number Diff line change
@@ -1,33 +1,58 @@


# How To start fuzzing.
# HOW TO START FUZZING

## To start fuzzing, follow these steps:
## 1. Install Honggfuzz and AFL:

- Install ***Honggfuzz***
To install **Honggfuzz**, run:

```bash
cargo install honggfuzz
```

For supported versions check https://ackee.xyz/trident/docs/latest/getting-started/getting-started/#supported-versions
To install **AFL**, run:

For more info about Honggfuzz installation check https://github.com/rust-fuzz/honggfuzz-rs?tab=readme-ov-file#dependencies
```bash
cargo install cargo-afl
```

- Initialize ***Trident*** using
## 2. Initialize **Trident**

Navigate to the project directory and run:

```bash
trident init
```

## Write Fuzz Test
## 3. Write Fuzz Test

In order to start fuzzing, you need to guide the fuzzer to use correct and meaningful instruction inputs. Trident also provides various features to tailor your fuzz tests to your specific needs, behavior, and use cases. To learn more, check out the documentation.

- Implement the ***todo!*** placeholders in ***fuzz_instructions.rs*** based on the provided descriptions.
## 4. Run Fuzz Test

- Run fuzzing with ***Honggfuzz***
You can run the fuzz test using either AFL or Honggfuzz:

```bash
trident fuzz run-hfuzz <FUZZ_TARGET>
```

### For more details, refer to the Trident documentation: https://ackee.xyz/trident/docs/latest/
```bash
trident fuzz run-afl <FUZZ_TARGET>
```

## 5. Debugging

To debug your program, run:

```bash
trident fuzz debug-hfuzz <FUZZ_TARGET> <CRASH_FILE>
```

```bash
trident fuzz debug-afl <FUZZ_TARGET> <CRASH_FILE>
```

## Resources

- Use the `--help` flag for more information
- Documentation: https://ackee.xyz/trident/docs/latest/
13 changes: 7 additions & 6 deletions crates/client/tests/fuzz_template/fuzz_transactions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@ use crate::transactions::*;
use trident_fuzz::fuzzing::*;
/// FuzzTransactions contains all available transactions
///
/// Below, the transaction variants are defined.
/// Each variant contains a transaction struct.
/// The transaction struct contains the instruction and the accounts and data.
///
/// You can create your own transactions by adding new variants to the enum.
///
/// Docs: https://ackee.xyz/trident/docs/latest/trident-api-macro/trident-types/fuzz-transactions/
#[derive(Arbitrary, FuzzTestExecutor)]
pub enum FuzzTransactions {
InitializeTransaction(InitializeTransaction),
ProcessCustomTypesTransaction(ProcessCustomTypesTransaction),
ProcessRustTypesTransaction(ProcessRustTypesTransaction),
}
/// Check supported AccountsStorages at
/// https://ackee.xyz/trident/docs/latest/features/account-storages/
/// FuzzAccounts contains all available accounts
///
/// You can create your own accounts by adding new fields to the struct.
///
/// Docs: https://ackee.xyz/trident/docs/latest/trident-api-macro/trident-types/fuzz-accounts/
#[derive(Default)]
pub struct FuzzAccounts {
pub data_account_6: AccountsStorage,
Expand Down
2 changes: 2 additions & 0 deletions crates/client/tests/fuzz_template/instructions/initialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ pub struct InitializeInstructionData {}
/// - Set instruction data during fuzzing
/// - Configure instruction accounts during fuzzing
/// - (Optional) Set remaining accounts during fuzzing
///
/// Docs: https://ackee.xyz/trident/docs/latest/start-fuzzing/writting-fuzz-test/
impl InstructionSetters for InitializeInstruction {
type IxAccounts = FuzzAccounts;
fn set_data(&mut self, client: &mut impl FuzzClient, fuzz_accounts: &mut Self::IxAccounts) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ pub struct ProcessCustomTypesInstructionData {
/// - Set instruction data during fuzzing
/// - Configure instruction accounts during fuzzing
/// - (Optional) Set remaining accounts during fuzzing
///
/// Docs: https://ackee.xyz/trident/docs/latest/start-fuzzing/writting-fuzz-test/
impl InstructionSetters for ProcessCustomTypesInstruction {
type IxAccounts = FuzzAccounts;
fn set_data(&mut self, client: &mut impl FuzzClient, fuzz_accounts: &mut Self::IxAccounts) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ pub struct ProcessRustTypesInstructionData {
/// - Set instruction data during fuzzing
/// - Configure instruction accounts during fuzzing
/// - (Optional) Set remaining accounts during fuzzing
///
/// Docs: https://ackee.xyz/trident/docs/latest/start-fuzzing/writting-fuzz-test/
impl InstructionSetters for ProcessRustTypesInstruction {
type IxAccounts = FuzzAccounts;
fn set_data(&mut self, client: &mut impl FuzzClient, fuzz_accounts: &mut Self::IxAccounts) {
Expand Down
26 changes: 6 additions & 20 deletions crates/client/tests/fuzz_template/test_fuzz.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,12 @@ use additional_program::entry as entry_additional_program;
use idl_test::entry as entry_idl_test;
pub use transactions::*;
struct TransactionsSequence;
/// Define transaction sequences for execution.
/// `starting_sequence` runs at the start, `middle` in the middle, and `ending`
/// at the end.
/// For example, to call `InitializeFn`, `UpdateFn` and then `WithdrawFn` during
/// each fuzzing iteration:
/// ```
/// impl FuzzDataBuilder<FuzzTransactions> for InstructionsSequence {
/// fn starting_sequence(fuzzer_data: &mut FuzzerData) ->
/// SequenceResult<FuzzTransactions> {
/// let seq1 = sequence!([InitializeFn, UpdateFn], fuzzer_data);
/// Ok(seq1)
/// }
/// fn middle_sequence(fuzzer_data: &mut FuzzerData) ->
/// SequenceResult<FuzzTransactions> {
/// let seq1 = sequence!([WithdrawFn], fuzzer_data);
/// Ok(seq1)
/// }
///}
/// ```
/// For more details, see: https://ackee.xyz/trident/docs/latest/features/instructions-sequences/#instructions-sequences
/// Define the order in which the transactions are executed:
/// - `starting_sequence`
/// - `middle_sequence`
/// - `ending_sequence`
///
/// Docs: https://ackee.xyz/trident/docs/latest/features/trident-advanced/trident-transactions/trident-fuzzing-flows/
impl FuzzSequenceBuilder<FuzzTransactions> for TransactionsSequence {}
fn main() {
let program_additional_program = ProgramEntrypoint::new(
Expand Down
9 changes: 6 additions & 3 deletions crates/client/tests/fuzz_template/transactions/initialize.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
use crate::fuzz_transactions::FuzzAccounts;
use crate::instructions::*;
use trident_fuzz::fuzzing::*;
/// Customize transaction behavior by adding more instructions.
///
/// Docs: https://ackee.xyz/trident/docs/latest/trident-advanced/trident-transactions/multi-instruction-transactions/
#[derive(Arbitrary, Debug, TridentTransaction)]
pub struct InitializeTransaction {
pub instruction: InitializeInstruction,
}
/// Custom Transaction Methods
///
/// Provides hooks for customizing transaction behavior:
/// Methods for customizing transaction behavior:
/// - `pre_transaction`: Execute custom logic before transaction execution
/// - `transaction_invariant_check`: Validate transaction-specific invariants
/// - `transaction_error_handler`: Custom handling of transaction errors
/// - `post_transaction`: Execute custom logic after transaction execution
///
/// Docs: https://ackee.xyz/trident/docs/latest/trident-advanced/trident-transactions/transaction-methods/
impl TransactionCustomMethods for InitializeTransaction {}
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
use crate::fuzz_transactions::FuzzAccounts;
use crate::instructions::*;
use trident_fuzz::fuzzing::*;
/// Customize transaction behavior by adding more instructions.
///
/// Docs: https://ackee.xyz/trident/docs/latest/trident-advanced/trident-transactions/multi-instruction-transactions/
#[derive(Arbitrary, Debug, TridentTransaction)]
pub struct ProcessCustomTypesTransaction {
pub instruction: ProcessCustomTypesInstruction,
}
/// Custom Transaction Methods
///
/// Provides hooks for customizing transaction behavior:
/// Methods for customizing transaction behavior:
/// - `pre_transaction`: Execute custom logic before transaction execution
/// - `transaction_invariant_check`: Validate transaction-specific invariants
/// - `transaction_error_handler`: Custom handling of transaction errors
/// - `post_transaction`: Execute custom logic after transaction execution
///
/// Docs: https://ackee.xyz/trident/docs/latest/trident-advanced/trident-transactions/transaction-methods/
impl TransactionCustomMethods for ProcessCustomTypesTransaction {}
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
use crate::fuzz_transactions::FuzzAccounts;
use crate::instructions::*;
use trident_fuzz::fuzzing::*;
/// Customize transaction behavior by adding more instructions.
///
/// Docs: https://ackee.xyz/trident/docs/latest/trident-advanced/trident-transactions/multi-instruction-transactions/
#[derive(Arbitrary, Debug, TridentTransaction)]
pub struct ProcessRustTypesTransaction {
pub instruction: ProcessRustTypesInstruction,
}
/// Custom Transaction Methods
///
/// Provides hooks for customizing transaction behavior:
/// Methods for customizing transaction behavior:
/// - `pre_transaction`: Execute custom logic before transaction execution
/// - `transaction_invariant_check`: Validate transaction-specific invariants
/// - `transaction_error_handler`: Custom handling of transaction errors
/// - `post_transaction`: Execute custom logic after transaction execution
///
/// Docs: https://ackee.xyz/trident/docs/latest/trident-advanced/trident-transactions/transaction-methods/
impl TransactionCustomMethods for ProcessRustTypesTransaction {}
8 changes: 3 additions & 5 deletions crates/client/tests/fuzz_template/types.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
use borsh::{BorshDeserialize, BorshSerialize};
use trident_fuzz::fuzzing::*;
/// File containing all custom types which can be used in transactions and
/// instructions
/// or invariant checks.
/// File containing all custom types which can be used
/// in transactions and instructions or invariant checks.
///
/// You can create your own types here and use them in transactions and
/// instructions.
/// You can define your own custom types here.
#[derive(Arbitrary, Debug, BorshDeserialize, BorshSerialize, Clone)]
pub struct ClassicStruct {
field1: u8,
Expand Down
19 changes: 10 additions & 9 deletions crates/template/src/template_getters.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,18 +68,19 @@ impl Template {

/// FuzzTransactions contains all available transactions
///
/// Below, the transaction variants are defined.
/// Each variant contains a transaction struct.
/// The transaction struct contains the instruction and the accounts and data.
///
/// You can create your own transactions by adding new variants to the enum.
///
/// Docs: https://ackee.xyz/trident/docs/latest/trident-api-macro/trident-types/fuzz-transactions/
#[derive(Arbitrary, FuzzTestExecutor)]
pub enum FuzzTransactions {
#(#transaction_variants),*
}

/// Check supported AccountsStorages at
/// https://ackee.xyz/trident/docs/latest/features/account-storages/
/// FuzzAccounts contains all available accounts
///
/// You can create your own accounts by adding new fields to the struct.
///
/// Docs: https://ackee.xyz/trident/docs/latest/trident-api-macro/trident-types/fuzz-accounts/
#[derive(Default)]
pub struct FuzzAccounts {
#(#account_storages),*
Expand All @@ -94,10 +95,10 @@ impl Template {
use borsh::{BorshDeserialize, BorshSerialize};
use trident_fuzz::fuzzing::*;

/// File containing all custom types which can be used in transactions and instructions
/// or invariant checks.
/// File containing all custom types which can be used
/// in transactions and instructions or invariant checks.
///
/// You can create your own types here and use them in transactions and instructions.
/// You can define your own custom types here.
};

let module_definition: syn::File = match custom_types.len() {
Expand Down
2 changes: 2 additions & 0 deletions crates/template/src/template_instruction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ impl Template {
/// - Set instruction data during fuzzing
/// - Configure instruction accounts during fuzzing
/// - (Optional) Set remaining accounts during fuzzing
///
/// Docs: https://ackee.xyz/trident/docs/latest/start-fuzzing/writting-fuzz-test/
impl InstructionSetters for #instruction_struct_name {
type IxAccounts = FuzzAccounts;

Expand Down
17 changes: 10 additions & 7 deletions crates/template/src/template_transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,23 @@ impl Template {
let instruction_struct_name: syn::Ident = parse_str(&instruction_name).unwrap();

let transaction: syn::ItemStruct = parse_quote! {
/// Customize transaction behavior by adding more instructions.
///
/// Docs: https://ackee.xyz/trident/docs/latest/trident-advanced/trident-transactions/multi-instruction-transactions/
#[derive(Arbitrary, Debug, TridentTransaction)]
pub struct #transaction_struct_name {
pub instruction: #instruction_struct_name,
}
};

let transaction_custom_methods_impl: syn::ItemImpl = parse_quote! {
/// Custom Transaction Methods
///
/// Provides hooks for customizing transaction behavior:
/// - `pre_transaction`: Execute custom logic before transaction execution
/// - `transaction_invariant_check`: Validate transaction-specific invariants
/// - `transaction_error_handler`: Custom handling of transaction errors
/// - `post_transaction`: Execute custom logic after transaction execution
/// Methods for customizing transaction behavior:
/// - `pre_transaction`: Execute custom logic before transaction execution
/// - `transaction_invariant_check`: Validate transaction-specific invariants
/// - `transaction_error_handler`: Custom handling of transaction errors
/// - `post_transaction`: Execute custom logic after transaction execution
///
/// Docs: https://ackee.xyz/trident/docs/latest/trident-advanced/trident-transactions/transaction-methods/
impl TransactionCustomMethods for #transaction_struct_name {}
};

Expand Down
22 changes: 6 additions & 16 deletions crates/template/src/test_fuzz.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,22 +41,12 @@ impl Template {

struct TransactionsSequence;

/// Define transaction sequences for execution.
/// `starting_sequence` runs at the start, `middle` in the middle, and `ending` at the end.
/// For example, to call `InitializeFn`, `UpdateFn` and then `WithdrawFn` during each fuzzing iteration:
/// ```
/// impl FuzzDataBuilder<FuzzTransactions> for InstructionsSequence {
/// fn starting_sequence(fuzzer_data: &mut FuzzerData) -> SequenceResult<FuzzTransactions> {
/// let seq1 = sequence!([InitializeFn, UpdateFn], fuzzer_data);
/// Ok(seq1)
/// }
/// fn middle_sequence(fuzzer_data: &mut FuzzerData) -> SequenceResult<FuzzTransactions> {
/// let seq1 = sequence!([WithdrawFn], fuzzer_data);
/// Ok(seq1)
/// }
///}
/// ```
/// For more details, see: https://ackee.xyz/trident/docs/latest/features/instructions-sequences/#instructions-sequences
/// Define the order in which the transactions are executed:
/// - `starting_sequence`
/// - `middle_sequence`
/// - `ending_sequence`
///
/// Docs: https://ackee.xyz/trident/docs/latest/features/trident-advanced/trident-transactions/trident-fuzzing-flows/
impl FuzzSequenceBuilder<FuzzTransactions> for TransactionsSequence {}

fn main() {
Expand Down
Loading