Skip to content

Commit a49c00b

Browse files
d-e-s-oryzhyk
authored andcommitted
Move MockObserver into observe crate and expose it optionally
Right now already and even more so in the future we need a couple of observer types solely for testing purposes. We already have MockObserver and DummyObserver, defined in different locations but with the former pretty much subsuming all functionality provided by the latter. This change moves MockObserver's definition into the observe crate and exposes it to clients using it with the newly introduced 'test' feature enabled. This step will allow us to have a single source for types commonly used for testing.
1 parent 8002b7d commit a49c00b

File tree

9 files changed

+72
-73
lines changed

9 files changed

+72
-73
lines changed

rust/template/distributed_datalog/Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,8 @@ edition = "2018"
66
[dependencies]
77
observe = {path = "observe"}
88
tcp_channel = {path = "tcp_channel"}
9+
10+
[features]
11+
# The 'test' feature set on this crate requires the 'test' feature of
12+
# the `observe` crate being enabled as well.
13+
test = ["observe/test"]

rust/template/distributed_datalog/observe/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,7 @@
22
name = "observe"
33
version = "0.1.0"
44
edition = "2018"
5+
6+
[features]
7+
# Expose additional types commonly used only for testing purposes.
8+
test = []

rust/template/distributed_datalog/observe/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@
99
1010
mod observable;
1111
mod observer;
12+
#[cfg(any(test, feature = "test"))]
13+
mod test;
1214

1315
pub use observable::Observable;
1416
pub use observable::UpdatesObservable;
1517
pub use observer::Observer;
1618
pub use observer::ObserverBox;
1719
pub use observer::SharedObserver;
20+
21+
#[cfg(feature = "test")]
22+
pub use test::MockObserver;

rust/template/distributed_datalog/observe/src/observable.rs

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -72,36 +72,15 @@ where
7272
mod tests {
7373
use super::*;
7474

75-
use crate::Observer;
76-
77-
#[derive(Debug)]
78-
struct DummyObserver(());
79-
80-
impl Observer<(), ()> for DummyObserver {
81-
fn on_start(&mut self) -> Result<(), ()> {
82-
Ok(())
83-
}
84-
85-
fn on_commit(&mut self) -> Result<(), ()> {
86-
Ok(())
87-
}
88-
89-
fn on_updates<'a>(&mut self, _: Box<dyn Iterator<Item = ()> + 'a>) -> Result<(), ()> {
90-
Ok(())
91-
}
92-
93-
fn on_completed(&mut self) -> Result<(), ()> {
94-
Ok(())
95-
}
96-
}
75+
use crate::test::MockObserver;
9776

9877
/// Test subscribing and unsubscribing for an `UpdatesObservable`.
9978
#[test]
10079
fn subscribe_unsubscribe() {
101-
let mut observable = UpdatesObservable {
80+
let mut observable = UpdatesObservable::<(), ()> {
10281
observer: Arc::new(Mutex::new(None)),
10382
};
104-
let observer = Box::new(DummyObserver(()));
83+
let observer = Box::new(MockObserver::new());
10584

10685
assert!(observable.subscribe(observer).is_ok());
10786
assert!(observable.unsubscribe(&()).is_some());
@@ -110,11 +89,11 @@ mod tests {
11089
/// Test multiple subscriptions to an `UpdatesObservable`.
11190
#[test]
11291
fn multiple_subscribe() {
113-
let mut observable = UpdatesObservable {
92+
let mut observable = UpdatesObservable::<(), ()> {
11493
observer: Arc::new(Mutex::new(None)),
11594
};
116-
let observer1 = Box::new(DummyObserver(()));
117-
let observer2 = Box::new(DummyObserver(()));
95+
let observer1 = Box::new(MockObserver::new());
96+
let observer2 = Box::new(MockObserver::new());
11897

11998
assert!(observable.subscribe(observer1).is_ok());
12099
assert!(observable.subscribe(observer2).is_err());
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
use crate::Observer;
2+
3+
#[derive(Clone, Debug, Default)]
4+
pub struct MockObserver {
5+
pub called_on_start: usize,
6+
pub called_on_commit: usize,
7+
pub called_on_updates: usize,
8+
pub called_on_completed: usize,
9+
}
10+
11+
impl MockObserver {
12+
pub fn new() -> Self {
13+
Self {
14+
called_on_start: 0,
15+
called_on_commit: 0,
16+
called_on_updates: 0,
17+
called_on_completed: 0,
18+
}
19+
}
20+
}
21+
22+
impl<T, E> Observer<T, E> for MockObserver
23+
where
24+
T: Send,
25+
E: Send,
26+
{
27+
fn on_start(&mut self) -> Result<(), E> {
28+
self.called_on_start += 1;
29+
Ok(())
30+
}
31+
32+
fn on_commit(&mut self) -> Result<(), E> {
33+
self.called_on_commit += 1;
34+
Ok(())
35+
}
36+
37+
fn on_updates<'a>(&mut self, updates: Box<dyn Iterator<Item = T> + 'a>) -> Result<(), E> {
38+
self.called_on_updates += updates.count();
39+
Ok(())
40+
}
41+
42+
fn on_completed(&mut self) -> Result<(), E> {
43+
self.called_on_completed += 1;
44+
Ok(())
45+
}
46+
}

rust/template/distributed_datalog/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,6 @@ pub use observe::SharedObserver;
55
pub use observe::UpdatesObservable;
66
pub use tcp_channel::TcpReceiver;
77
pub use tcp_channel::TcpSender;
8+
9+
#[cfg(feature = "test")]
10+
pub use observe::MockObserver;

src/Language/DifferentialDatalog/Compile.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ rustLibFiles specname =
164164
, (dir </> "distributed_datalog/observe/src/lib.rs" , $(embedFile "rust/template/distributed_datalog/observe/src/lib.rs"))
165165
, (dir </> "distributed_datalog/observe/src/observable.rs" , $(embedFile "rust/template/distributed_datalog/observe/src/observable.rs"))
166166
, (dir </> "distributed_datalog/observe/src/observer.rs" , $(embedFile "rust/template/distributed_datalog/observe/src/observer.rs"))
167+
, (dir </> "distributed_datalog/observe/src/test.rs" , $(embedFile "rust/template/distributed_datalog/observe/src/test.rs"))
167168
, (dir </> "distributed_datalog/tcp_channel/Cargo.toml" , $(embedFile "rust/template/distributed_datalog/tcp_channel/Cargo.toml"))
168169
, (dir </> "distributed_datalog/tcp_channel/src/lib.rs" , $(embedFile "rust/template/distributed_datalog/tcp_channel/src/lib.rs"))
169170
, (dir </> "distributed_datalog/tcp_channel/src/message.rs" , $(embedFile "rust/template/distributed_datalog/tcp_channel/src/message.rs"))

test/datalog_tests/server_api/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ edition = "2018"
55

66
[dependencies]
77
differential_datalog = {path = "../server_api_ddlog/differential_datalog"}
8-
distributed_datalog = {path = "../server_api_ddlog/distributed_datalog"}
8+
distributed_datalog = {path = "../server_api_ddlog/distributed_datalog", features=["test"]}
99
maplit = "1.0"
1010
server_api = {path = "../server_api_ddlog"}
1111

test/datalog_tests/server_api/tests/events.rs

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use differential_datalog::program::Update;
88
use differential_datalog::record::Record;
99
use differential_datalog::record::RelIdentifier;
1010
use differential_datalog::record::UpdCmd;
11+
use distributed_datalog::MockObserver as Mock;
1112
use distributed_datalog::Observable;
1213
use distributed_datalog::Observer;
1314
use distributed_datalog::SharedObserver;
@@ -28,51 +29,6 @@ use test_env_log::test;
2829

2930
use waitfor::wait_for;
3031

31-
#[derive(Clone, Debug)]
32-
struct Mock {
33-
called_on_start: usize,
34-
called_on_commit: usize,
35-
called_on_updates: usize,
36-
called_on_completed: usize,
37-
}
38-
39-
impl Mock {
40-
fn new() -> Self {
41-
Self {
42-
called_on_start: 0,
43-
called_on_commit: 0,
44-
called_on_updates: 0,
45-
called_on_completed: 0,
46-
}
47-
}
48-
}
49-
50-
impl<T, E> Observer<T, E> for Mock
51-
where
52-
T: Send,
53-
E: Send,
54-
{
55-
fn on_start(&mut self) -> Result<(), E> {
56-
self.called_on_start += 1;
57-
Ok(())
58-
}
59-
60-
fn on_commit(&mut self) -> Result<(), E> {
61-
self.called_on_commit += 1;
62-
Ok(())
63-
}
64-
65-
fn on_updates<'a>(&mut self, updates: Box<dyn Iterator<Item = T> + 'a>) -> Result<(), E> {
66-
self.called_on_updates += updates.count();
67-
Ok(())
68-
}
69-
70-
fn on_completed(&mut self) -> Result<(), E> {
71-
self.called_on_completed += 1;
72-
Ok(())
73-
}
74-
}
75-
7632
type MockObserver = SharedObserver<Mock>;
7733

7834
fn await_expected<F>(mut op: F)

0 commit comments

Comments
 (0)