You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: block_store_and_lec_recovery_test.rs
    path of file: ./repos/diem/consensus/src/block_storage
    
    the code of the file until where you have to start completion: // Copyright (c) The Diem Core Contributors
// SPDX-License-Identifier: Apache-2.0

use crate::{
    block_storage::{block_store::BlockStore, BlockReader},
    persistent_liveness_storage::{LedgerRecoveryData, RecoveryData, RootMetadata},
    state_computer::ExecutionProxy,
    test_utils::{EmptyStorage, TreeInserter},
    util::mock_time_service::SimulatedTimeService,
};
use consensus_types::{block::Block, quorum_cert::QuorumCert};
use diem_config::config::NodeConfig;
use diem_crypto::{ed25519::Ed25519PrivateKey, Uniform};
use diem_types::validator_signer::ValidatorSigner;
use execution_correctness::{ExecutionCorrectness, ExecutionCorrectnessManager};
use executor_test_helpers::start_storage_service;
use executor_types::ExecutedTrees;
use std::sync::Arc;
use storage_interface::DbReader;
#[allow(clippy::needless_borrow)]
fn get_initial_data_and_qc(db: &dyn DbReader) -> (RecoveryData, QuorumCert) {
    // find the block corresponding to storage latest ledger info
    let startup_info = db
        .get_startup_info()
        .expect("unable to read ledger info from storage")
        .expect("startup info is None");

    let ledger_info_with_sigs = star
    
fn get_initial_data_and_qc(db: &dyn DbReader) -> (RecoveryData, QuorumCert) {
    // find the block corresponding to storage latest ledger info
    let startup_info = db
        .get_startup_info()
        .expect("unable to read ledger info from storage")
        .expect("startup info is None");

    let ledger_info_with_sigs = startup_info.latest_ledger_info.clone();

    let qc = QuorumCert::certificate_for_genesis_from_ledger_info(
        ledger_info_with_sigs.ledger_info(),
        Block::make_genesis_block_from_ledger_info(ledger_info_with_sigs.ledger_info()).id(),
    );

    let ledger_recovery_data = LedgerRecoveryData::new(ledger_info_with_sigs);
    let frozen_root_hashes = startup_info
        .committed_tree_state
        .ledger_frozen_subtree_hashes
        .clone();
    let root_executed_trees = ExecutedTrees::from(startup_info.committed_tree_state);
    (
        RecoveryData::new(
            None,
            ledger_recovery_data,
            vec![],
            RootMetadata::new(
                root_executed_trees.txn_accumulator().num_leaves(),
                root_executed_trees.state_id(),
                frozen_root_hashes,
            ),
            vec![],
            None,
            None,
        )
        .unwrap(),
        qc,
    )
}