Skip to content
This repository has been archived by the owner on Sep 25, 2023. It is now read-only.

Commit

Permalink
fix(commit_store): fix bug in get_batch_by_transaction
Browse files Browse the repository at this point in the history
  • Loading branch information
suchapalaver committed Feb 22, 2023
1 parent fb84524 commit b38eed6
Showing 1 changed file with 94 additions and 1 deletion.
95 changes: 94 additions & 1 deletion validator/src/journal/commit_store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ impl CommitStore {
batch
.transaction_ids
.iter()
.any(|txn_id| txn_id == transaction_id)
.all(|txn_id| txn_id != transaction_id)
})
.next()
.ok_or_else(|| {
Expand Down Expand Up @@ -577,3 +577,96 @@ impl ChainReader for CommitStore {
.map_err(|err| ChainReadError::GeneralReadError(format!("{:?}", err)))
}
}

#[cfg(test)]
mod tests {
use sawdb::error::DatabaseError;

#[derive(Clone, Debug, PartialEq)]
pub struct TestBatch {
// pub header_signature: String,
// pub transactions: Vec<Transaction>,
// pub signer_public_key: String,
pub transaction_ids: Vec<String>,
// pub trace: bool,

// pub header_bytes: Vec<u8>,
}

pub struct TestBlock {
// pub header_signature: String,
pub batches: Vec<TestBatch>,
// pub state_root_hash: String,
// pub consensus: Vec<u8>,
// pub batch_ids: Vec<String>,
// pub signer_public_key: String,
// pub previous_block_id: String,
// pub block_num: u64,

// pub header_bytes: Vec<u8>,
}

// Copies flawed logic of `sawtooth_validator::journal::commit_store::CommitStore::get_batch_by_transaction`
fn mock_previous_get_batch_by_transaction(
transaction_id: &str,
block: TestBlock,
) -> Result<TestBatch, DatabaseError> {
// self.get_by_transaction_id(transaction_id)
// .and_then(|block| {
block
.batches
.into_iter()
.skip_while(|batch| {
batch
.transaction_ids
.iter()
.any(|txn_id| txn_id == transaction_id)
})
.next()
.ok_or_else(|| DatabaseError::CorruptionError("Transaction index corrupted".into()))
// })
}

#[test]
fn test_previous_get_batch_by_transaction_has_a_bug() {
let block = TestBlock {
batches: vec![TestBatch {
transaction_ids: vec!["1".to_string()],
}],
};
let transaction_id = "1";
assert!(mock_previous_get_batch_by_transaction(transaction_id, block).is_err());
}

// Copies logic of new `sawtooth_validator::journal::commit_store::CommitStore::get_batch_by_transaction`
fn mock_get_batch_by_transaction(
transaction_id: &str,
block: TestBlock,
) -> Result<TestBatch, DatabaseError> {
// self.get_by_transaction_id(transaction_id)
// .and_then(|block| {
block
.batches
.into_iter()
.skip_while(|batch| {
batch
.transaction_ids
.iter()
.all(|txn_id| txn_id != transaction_id)
})
.next()
.ok_or_else(|| DatabaseError::CorruptionError("Transaction index corrupted".into()))
// })
}

#[test]
fn test_get_batch_by_transaction() {
let block = TestBlock {
batches: vec![TestBatch {
transaction_ids: vec!["1".to_string()],
}],
};
let transaction_id = "1";
assert!(mock_get_batch_by_transaction(transaction_id, block).is_ok());
}
}

0 comments on commit b38eed6

Please sign in to comment.