@@ -20,8 +20,8 @@ impl State for MemoryState {
20
20
#[ derive( Clone ) ]
21
21
pub struct MemoryMessage {
22
22
pub message : Message < MemoryState > ,
23
- pub channel_id : ChannelId ,
24
- pub validator_id : ValidatorId ,
23
+ pub channel : ChannelId ,
24
+ pub owner : ValidatorId ,
25
25
}
26
26
27
27
pub struct MemoryMessageRepository {
@@ -46,8 +46,8 @@ impl MessageRepository<MemoryState> for MemoryMessageRepository {
46
46
fn add ( & self , channel_id : ChannelId , message : Message < MemoryState > ) -> RepositoryFuture < ( ) > {
47
47
let message = MemoryMessage {
48
48
message,
49
- channel_id,
50
- validator_id : self . self_validator_id . clone ( ) ,
49
+ channel : channel_id,
50
+ owner : self . self_validator_id . clone ( ) ,
51
51
} ;
52
52
// this should never match against the new record, that's why always pass false.
53
53
ready ( self . inner . add ( & false , message) . map_err ( Into :: into) ) . boxed ( )
@@ -58,15 +58,15 @@ impl MessageRepository<MemoryState> for MemoryMessageRepository {
58
58
/// If not `types` are provided, it will match against all types.
59
59
fn latest (
60
60
& self ,
61
- channel_id : ChannelId ,
62
- from : ValidatorId ,
61
+ channel_id : & ChannelId ,
62
+ from : & ValidatorId ,
63
63
types : Option < & [ & MessageType ] > ,
64
64
) -> RepositoryFuture < Option < Message < MemoryState > > > {
65
65
let latest = self
66
66
. inner
67
67
. list_all ( |mem_msg| {
68
- let is_from = mem_msg. validator_id == from;
69
- let is_channel_id = mem_msg. channel_id == channel_id;
68
+ let is_from = & mem_msg. owner == from;
69
+ let is_channel_id = & mem_msg. channel == channel_id;
70
70
// if there are no types provided, it should match every type, i.e. default `true` for `None`
71
71
let is_in_types = types. map_or ( true , |message_types| {
72
72
mem_msg. message . is_types ( message_types)
@@ -82,3 +82,148 @@ impl MessageRepository<MemoryState> for MemoryMessageRepository {
82
82
ready ( latest. map_err ( Into :: into) ) . boxed ( )
83
83
}
84
84
}
85
+
86
+ #[ cfg( test) ]
87
+ mod test {
88
+ use std:: convert:: TryFrom ;
89
+
90
+ use domain:: fixtures:: get_channel_id;
91
+ use domain:: validator:: message:: fixtures:: { get_heartbeat, get_reject_state} ;
92
+
93
+ use super :: * ;
94
+ use domain:: validator:: message:: TYPE_REJECT ;
95
+
96
+ fn get_reject_memory_message (
97
+ channel : & ChannelId ,
98
+ owner : & ValidatorId ,
99
+ reject_reason : Option < String > ,
100
+ ) -> MemoryMessage {
101
+ MemoryMessage {
102
+ channel : channel. clone ( ) ,
103
+ owner : owner. clone ( ) ,
104
+ message : Message :: RejectState ( get_reject_state ( reject_reason) ) ,
105
+ }
106
+ }
107
+
108
+ #[ test]
109
+ fn adds_message_with_the_self_validator_id ( ) {
110
+ futures:: executor:: block_on ( async {
111
+ let validator_id = ValidatorId :: try_from ( "identity" ) . expect ( "ValidatorId failed" ) ;
112
+ let repo = MemoryMessageRepository :: new ( & [ ] , validator_id. clone ( ) ) ;
113
+
114
+ let message = get_reject_state ( None ) ;
115
+ let channel_id = get_channel_id ( "channel id" ) ;
116
+
117
+ await ! ( repo. add( channel_id, Message :: RejectState ( message) ) )
118
+ . expect ( "Adding a message failed" ) ;
119
+
120
+ let list_all = repo
121
+ . inner
122
+ . list_all ( |m| Some ( m. clone ( ) ) )
123
+ . expect ( "Listing all Messages failed" ) ;
124
+
125
+ assert_eq ! ( 1 , list_all. len( ) ) ;
126
+ assert_eq ! ( validator_id, list_all[ 0 ] . owner) ;
127
+ assert_eq ! ( channel_id, list_all[ 0 ] . channel) ;
128
+ } )
129
+ }
130
+
131
+ #[ test]
132
+ fn getting_latest_message_with_self_validator_id ( ) {
133
+ futures:: executor:: block_on ( async {
134
+ let validator_id = ValidatorId :: try_from ( "identity" ) . expect ( "ValidatorId failed" ) ;
135
+ let channel_id = get_channel_id ( "channel id" ) ;
136
+
137
+ let repo = MemoryMessageRepository :: new ( & [ ] , validator_id. clone ( ) ) ;
138
+ // add an initial Reject message for checking latest ordering
139
+ let init_message =
140
+ Message :: RejectState ( get_reject_state ( Some ( "Initial Message" . to_string ( ) ) ) ) ;
141
+ await ! ( repo. add( channel_id. clone( ) , init_message) )
142
+ . expect ( "Adding the initial message failed" ) ;
143
+
144
+ let new_message = Message :: RejectState ( get_reject_state ( Some ( "my reason" . to_string ( ) ) ) ) ;
145
+ await ! ( repo. add( channel_id. clone( ) , new_message) ) . expect ( "Adding a message failed" ) ;
146
+
147
+ let latest_any = await ! ( repo. latest( & channel_id, & validator_id, None ) )
148
+ . expect ( "Getting latest Message failed" ) ;
149
+
150
+ match latest_any. expect ( "There was no latest message returned" ) {
151
+ Message :: RejectState ( reject_state) => assert_eq ! ( "my reason" , reject_state. reason) ,
152
+ _ => panic ! ( "A Reject state message was not returned as latest message!" ) ,
153
+ }
154
+ } )
155
+ }
156
+
157
+ #[ test]
158
+ fn getting_latest_message_filters_by_from ( ) {
159
+ futures:: executor:: block_on ( async {
160
+ let self_validator_id = ValidatorId :: try_from ( "identity" ) . expect ( "ValidatorId failed" ) ;
161
+ let channel = get_channel_id ( "channel id" ) ;
162
+
163
+ let from =
164
+ ValidatorId :: try_from ( "another validator" ) . expect ( "ValidatorId for form failed" ) ;
165
+ let init_message = get_reject_memory_message ( & channel, & self_validator_id, None ) ;
166
+
167
+ let repo = MemoryMessageRepository :: new ( & [ init_message] , self_validator_id. clone ( ) ) ;
168
+
169
+ let result =
170
+ await ! ( repo. latest( & channel, & from, None ) ) . expect ( "Fetching latest message failed" ) ;
171
+
172
+ assert ! (
173
+ result. is_none( ) ,
174
+ "A latest message was found, even though it has different ValidatorId"
175
+ ) ;
176
+ } )
177
+ }
178
+
179
+ #[ test]
180
+ fn getting_latest_message_filters_by_channel_id ( ) {
181
+ futures:: executor:: block_on ( async {
182
+ let self_validator_id = ValidatorId :: try_from ( "identity" ) . expect ( "ValidatorId failed" ) ;
183
+ let channel = get_channel_id ( "channel 1" ) ;
184
+ let from_channel = get_channel_id ( "channel 2" ) ;
185
+
186
+ let init_message = get_reject_memory_message ( & channel, & self_validator_id, None ) ;
187
+
188
+ let repo = MemoryMessageRepository :: new ( & [ init_message] , self_validator_id. clone ( ) ) ;
189
+
190
+ let result = await ! ( repo. latest( & from_channel, & self_validator_id, None ) )
191
+ . expect ( "Fetching latest message failed" ) ;
192
+
193
+ assert ! (
194
+ result. is_none( ) ,
195
+ "A latest message was found, even though it has different ChannelId"
196
+ ) ;
197
+ } )
198
+ }
199
+
200
+ #[ test]
201
+ fn getting_latest_message_filters_by_types ( ) {
202
+ futures:: executor:: block_on ( async {
203
+ let self_validator_id = ValidatorId :: try_from ( "identity" ) . expect ( "ValidatorId failed" ) ;
204
+ let channel = get_channel_id ( "channel 1" ) ;
205
+
206
+ let init_messages = [
207
+ get_reject_memory_message ( & channel, & self_validator_id, Some ( "reason" . to_string ( ) ) ) ,
208
+ MemoryMessage {
209
+ message : Message :: Heartbeat ( get_heartbeat :: < MemoryState > (
210
+ "state" . to_string ( ) ,
211
+ "signature" . to_string ( ) ,
212
+ ) ) ,
213
+ channel : channel. clone ( ) ,
214
+ owner : self_validator_id. clone ( ) ,
215
+ } ,
216
+ ] ;
217
+
218
+ let repo = MemoryMessageRepository :: new ( & init_messages, self_validator_id. clone ( ) ) ;
219
+
220
+ let result = await ! ( repo. latest( & channel, & self_validator_id, Some ( & [ & TYPE_REJECT ] ) ) )
221
+ . expect ( "Fetching latest message failed" ) ;
222
+
223
+ match result. expect ( "There was no latest message returned" ) {
224
+ Message :: RejectState ( reject_state) => assert_eq ! ( "reason" , reject_state. reason) ,
225
+ _ => panic ! ( "Filtering by type didn't return the expected RejectState message!" ) ,
226
+ }
227
+ } )
228
+ }
229
+ }
0 commit comments