1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use std::str::FromStr;
use cyfs_base::*;
use cyfs_bdt::*;


pub fn random_mem(piece: usize, count: usize) -> (usize, Vec<u8>) {
    let mut buffer = vec![0u8; piece * count];
    for i in 0..count {
        let r = rand::random::<u64>();
        buffer[i * 8..(i + 1) * 8].copy_from_slice(&r.to_be_bytes());
    }
    (piece * count, buffer)
}

pub fn create_device(owner: &str, endpoints: &[&str]) -> BuckyResult<(Device, PrivateKey)> {
    let private_key = PrivateKey::generate_rsa(1024).unwrap();
    let public_key = private_key.public();
    let owner = ObjectId::from_str(owner)?;
    let ep_list = endpoints
        .iter()
        .map(|ep| Endpoint::from_str(ep).unwrap())
        .collect();
    let device = Device::new(
        Some(owner),
        UniqueId::default(),
        ep_list,
        vec![],
        vec![],
        public_key,
        Area::default(),
        DeviceCategory::PC,
    )
    .build();

    Ok((device, private_key))
}

pub async fn local_stack_pair(
    ln_ep: &[&str],
    rn_ep: &[&str],
) -> BuckyResult<((StackGuard, MemChunkStore), (StackGuard, MemChunkStore))> {
    local_stack_pair_with_config(ln_ep, rn_ep, None, None).await
}

pub async fn local_stack_pair_with_config(
    ln_ep: &[&str],
    rn_ep: &[&str],
    ln_config: Option<StackConfig>,
    rn_config: Option<StackConfig>,
) -> BuckyResult<((StackGuard, MemChunkStore), (StackGuard, MemChunkStore))> {
    let (ln_dev, ln_secret) = create_device("5aSixgLuJjfrNKn9D4z66TEM6oxL3uNmWCWHk52cJDKR", ln_ep)?;
    let (rn_dev, rn_secret) = create_device("5aSixgLuJjfrNKn9D4z66TEM6oxL3uNmWCWHk52cJDKR", rn_ep)?;

    let mut ln_params = StackOpenParams::new("");
    let ln_store = MemChunkStore::new();
    ln_params.chunk_store = Some(ln_store.clone_as_reader());
    let mut ln_config = ln_config;
    if ln_config.is_some() {
        std::mem::swap(&mut ln_params.config, ln_config.as_mut().unwrap());
    }

    ln_params.known_device = Some(vec![rn_dev.clone()]);
    let ln_stack = Stack::open(ln_dev.clone(), ln_secret, ln_params).await?;

    let mut rn_params = StackOpenParams::new("");
    let rn_store = MemChunkStore::new();
    rn_params.chunk_store = Some(rn_store.clone_as_reader());
    let mut rn_config = rn_config;
    if rn_config.is_some() {
        std::mem::swap(&mut rn_params.config, rn_config.as_mut().unwrap());
    }

    let rn_stack = Stack::open(rn_dev, rn_secret, rn_params).await?;

    Ok(((ln_stack, ln_store), (rn_stack, rn_store)))
}


fn main() {

}