Skip to content

Commit c6d1c20

Browse files
authored
Merge pull request #210 from tox-rs/kbucket
Add parameter for eviction strategy
2 parents 8144e6a + c190ac1 commit c6d1c20

File tree

5 files changed

+533
-533
lines changed

5 files changed

+533
-533
lines changed

src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ extern crate cookie_factory;
2727
extern crate sodiumoxide;
2828

2929
#[cfg(test)]
30-
#[macro_use]
3130
extern crate quickcheck;
3231

3332
extern crate tokio;

src/toxcore/dht/dht_friend.rs

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::net::SocketAddr;
88
use toxcore::time::*;
99
use toxcore::dht::kbucket::*;
1010
use toxcore::crypto_core::*;
11+
use toxcore::dht::packed_node::*;
1112
use toxcore::dht::server::hole_punching::*;
1213

1314
/// Number of bootstrap nodes each friend has.
@@ -79,6 +80,16 @@ impl DhtFriend {
7980

8081
addrs
8182
}
83+
84+
/// Try to add a node to the friend's close nodes list.
85+
pub fn try_add_to_close(&mut self, node: &PackedNode) -> bool {
86+
self.close_nodes.try_add(&self.pk, node, /* evict */ true)
87+
}
88+
89+
/// Check if a node can be added to the friend's close nodes list.
90+
pub fn can_add_to_close(&self, node: &PackedNode) -> bool {
91+
self.close_nodes.can_add(&self.pk, node, /* evict */ true)
92+
}
8293
}
8394

8495
#[cfg(test)]
@@ -91,16 +102,15 @@ mod tests {
91102
use tokio_timer::clock::*;
92103

93104
use toxcore::dht::dht_node::*;
94-
use toxcore::dht::packed_node::*;
95105
use toxcore::time::ConstNow;
96106

97107
#[test]
98108
fn addr_is_unknown() {
99109
let pk = gen_keypair().0;
100110
let mut friend = DhtFriend::new(pk);
101111

102-
assert!(friend.close_nodes.try_add(&pk, &PackedNode::new("192.168.1.1:12345".parse().unwrap(), &gen_keypair().0)));
103-
assert!(friend.close_nodes.try_add(&pk, &PackedNode::new("192.168.1.2:12345".parse().unwrap(), &gen_keypair().0)));
112+
assert!(friend.try_add_to_close(&PackedNode::new("192.168.1.1:12345".parse().unwrap(), &gen_keypair().0)));
113+
assert!(friend.try_add_to_close(&PackedNode::new("192.168.1.2:12345".parse().unwrap(), &gen_keypair().0)));
104114

105115
assert!(!friend.is_addr_known())
106116
}
@@ -110,10 +120,10 @@ mod tests {
110120
let pk = gen_keypair().0;
111121
let mut friend = DhtFriend::new(pk);
112122

113-
assert!(friend.close_nodes.try_add(&pk, &PackedNode::new("192.168.1.1:12345".parse().unwrap(), &gen_keypair().0)));
114-
assert!(friend.close_nodes.try_add(&pk, &PackedNode::new("192.168.1.2:12345".parse().unwrap(), &gen_keypair().0)));
123+
assert!(friend.try_add_to_close(&PackedNode::new("192.168.1.1:12345".parse().unwrap(), &gen_keypair().0)));
124+
assert!(friend.try_add_to_close(&PackedNode::new("192.168.1.2:12345".parse().unwrap(), &gen_keypair().0)));
115125

116-
assert!(friend.close_nodes.try_add(&pk, &PackedNode::new("192.168.1.3:12345".parse().unwrap(), &pk)));
126+
assert!(friend.try_add_to_close(&PackedNode::new("192.168.1.3:12345".parse().unwrap(), &pk)));
117127

118128
assert!(friend.is_addr_known())
119129
}
@@ -135,7 +145,7 @@ mod tests {
135145
];
136146

137147
for (&node, &addr) in nodes.iter().zip(addrs.iter()) {
138-
friend.close_nodes.try_add(&pk, &node);
148+
friend.try_add_to_close(&node);
139149
let dht_node = friend.close_nodes.get_node_mut(&pk, &node.pk).unwrap();
140150
dht_node.update_returned_addr(addr);
141151
}
@@ -167,7 +177,7 @@ mod tests {
167177
];
168178

169179
for (&node, &addr) in nodes.iter().zip(addrs.iter()) {
170-
friend.close_nodes.try_add(&pk, &node);
180+
friend.try_add_to_close(&node);
171181
let dht_node = friend.close_nodes.get_node_mut(&pk, &node.pk).unwrap();
172182
dht_node.update_returned_addr(addr);
173183
}
@@ -181,4 +191,25 @@ mod tests {
181191
assert!(friend.get_returned_addrs().is_empty());
182192
});
183193
}
194+
195+
#[test]
196+
fn can_and_try_add_to_close() {
197+
let pk = PublicKey([0; PUBLICKEYBYTES]);
198+
let mut friend = DhtFriend::new(pk);
199+
200+
for i in 0 .. 8 {
201+
let addr = SocketAddr::new("1.2.3.4".parse().unwrap(), 12345 + i as u16);
202+
let node = PackedNode::new(addr, &PublicKey([i + 2; PUBLICKEYBYTES]));
203+
assert!(friend.try_add_to_close(&node));
204+
}
205+
206+
let closer_node = PackedNode::new(
207+
"1.2.3.5:12345".parse().unwrap(),
208+
&PublicKey([1; PUBLICKEYBYTES])
209+
);
210+
211+
// should add a new closer node with eviction
212+
assert!(friend.can_add_to_close(&closer_node));
213+
assert!(friend.try_add_to_close(&closer_node));
214+
}
184215
}

src/toxcore/dht/dht_node.rs

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,6 @@ impl DhtNode {
213213
#[cfg(test)]
214214
mod tests {
215215
use super::*;
216-
use quickcheck::quickcheck;
217-
218-
use toxcore::dht::kbucket::*;
219216

220217
#[test]
221218
fn dht_node_clonable() {
@@ -226,27 +223,4 @@ mod tests {
226223
let dht_node = DhtNode::new(pn);
227224
let _ = dht_node.clone();
228225
}
229-
230-
#[test]
231-
fn dht_node_bucket_try_add_test() {
232-
fn with_nodes(n1: PackedNode, n2: PackedNode, n3: PackedNode,
233-
n4: PackedNode, n5: PackedNode, n6: PackedNode,
234-
n7: PackedNode, n8: PackedNode) {
235-
let pk = PublicKey([0; PUBLICKEYBYTES]);
236-
let mut bucket = Bucket::new(BUCKET_DEFAULT_SIZE);
237-
assert_eq!(true, bucket.try_add(&pk, &n1));
238-
assert_eq!(true, bucket.try_add(&pk, &n2));
239-
assert_eq!(true, bucket.try_add(&pk, &n3));
240-
assert_eq!(true, bucket.try_add(&pk, &n4));
241-
assert_eq!(true, bucket.try_add(&pk, &n5));
242-
assert_eq!(true, bucket.try_add(&pk, &n6));
243-
assert_eq!(true, bucket.try_add(&pk, &n7));
244-
assert_eq!(true, bucket.try_add(&pk, &n8));
245-
246-
// updating bucket
247-
assert_eq!(true, bucket.try_add(&pk, &n1));
248-
}
249-
quickcheck(with_nodes as fn(PackedNode, PackedNode, PackedNode, PackedNode,
250-
PackedNode, PackedNode, PackedNode, PackedNode));
251-
}
252226
}

0 commit comments

Comments
 (0)