@@ -143,8 +143,8 @@ mod tests {
143
143
use std:: { sync:: Arc , time:: Duration } ;
144
144
145
145
use anyhow:: Result ;
146
- use chrono:: Local ;
147
- use tokio:: time;
146
+ use chrono:: { DateTime , Local } ;
147
+ use tokio:: { sync :: Mutex , time} ;
148
148
149
149
use super :: super :: super :: {
150
150
ports:: {
@@ -160,7 +160,7 @@ mod tests {
160
160
async fn check_required_duration ( ) -> Result < ( ) > {
161
161
const CASE_PERMITS_NUM : usize = 2 ;
162
162
const CASES_NUM : usize = 3 ;
163
- const PAGES_NUM : usize = 2 ;
163
+ const PAGES_NUM : usize = 4 ;
164
164
const PAGE_LOAD_DURATION : usize = 1000 ;
165
165
const PAGE_NEWS_NUM : usize = 6 ;
166
166
const NEWS_LOAD_DURATION : usize = 2000 ;
@@ -170,7 +170,11 @@ mod tests {
170
170
assert ! ( CASES_NUM > CASE_PERMITS_NUM ) ;
171
171
assert ! ( PAGES_NUM * PAGE_NEWS_NUM > TASK_PERMITS_NUM ) ;
172
172
assert ! ( NEWS_LOAD_DURATION > PAGE_LOAD_DURATION ) ;
173
- async fn fetch_news ( handler : FetchNewsHandler ) -> Vec < FetchNewsOutput > {
173
+ assert ! ( PAGES_NUM * NEWS_LOAD_DURATION > PAGE_LOAD_DURATION + NEWS_LOAD_DURATION ) ;
174
+ async fn fetch_news (
175
+ finish_fetch_time : Arc < Mutex < Option < DateTime < Local > > > > ,
176
+ handler : FetchNewsHandler ,
177
+ ) -> Vec < FetchNewsOutput > {
174
178
let mut outputs = vec ! [ ] ;
175
179
for _ in 0 ..PAGES_NUM {
176
180
time:: sleep ( Duration :: from_millis ( PAGE_LOAD_DURATION as u64 ) ) . await ;
@@ -187,16 +191,33 @@ mod tests {
187
191
} ) ) ;
188
192
}
189
193
}
194
+ // Time when the first case finishes fetching news
195
+ let mut finish_fetch_time = finish_fetch_time. lock ( ) . await ;
196
+ if finish_fetch_time. is_none ( ) {
197
+ * finish_fetch_time = Some ( Local :: now ( ) ) ;
198
+ }
190
199
outputs
191
200
}
192
201
async fn get ( ) -> Result < Vec < u8 > > {
193
202
time:: sleep ( Duration :: from_millis ( NEWS_LOAD_DURATION as u64 ) ) . await ;
194
203
Ok ( vec ! [ ] )
195
204
}
205
+ async fn insert_news ( start_insert_time : Arc < Mutex < Option < DateTime < Local > > > > ) -> Result < Vec < i32 > > {
206
+ // Time when the first case starts inserting news
207
+ let mut start_insert_time = start_insert_time. lock ( ) . await ;
208
+ if start_insert_time. is_none ( ) {
209
+ * start_insert_time = Some ( Local :: now ( ) ) ;
210
+ }
211
+ Ok ( vec ! [ ] )
212
+ }
213
+ let finish_fetch_time = Arc :: new ( Mutex :: new ( None ) ) ;
196
214
let mut mock_news_fetcher = MockNewsFetcher :: new ( ) ;
197
- mock_news_fetcher
198
- . expect_fetch_news ( )
199
- . returning ( |h| Box :: pin ( fetch_news ( h) ) ) ;
215
+ {
216
+ let finish_fetch_time = Arc :: clone ( & finish_fetch_time) ;
217
+ mock_news_fetcher
218
+ . expect_fetch_news ( )
219
+ . returning ( move |h| Box :: pin ( fetch_news ( Arc :: clone ( & finish_fetch_time) , h) ) ) ;
220
+ }
200
221
let mut mock_http_helper = MockHttpHelper :: new ( ) ;
201
222
mock_http_helper
202
223
. expect_get ( )
@@ -207,11 +228,15 @@ mod tests {
207
228
. expect_upload_file ( )
208
229
. times ( CASES_NUM * PAGES_NUM * PAGE_NEWS_NUM )
209
230
. returning ( |_| Ok ( "" . to_string ( ) ) ) ;
231
+ let start_insert_time = Arc :: new ( Mutex :: new ( None ) ) ;
210
232
let mut mock_repository = MockRepository :: new ( ) ;
211
- mock_repository
212
- . expect_insert_news ( )
213
- . times ( CASES_NUM * ( ( PAGES_NUM * PAGE_NEWS_NUM ) as f64 / INSERT_BATCH_SIZE as f64 ) . ceil ( ) as usize )
214
- . returning ( |_| Ok ( vec ! [ ] ) ) ;
233
+ {
234
+ let start_insert_time = Arc :: clone ( & start_insert_time) ;
235
+ mock_repository
236
+ . expect_insert_news ( )
237
+ . times ( CASES_NUM * ( ( PAGES_NUM * PAGE_NEWS_NUM ) as f64 / INSERT_BATCH_SIZE as f64 ) . ceil ( ) as usize )
238
+ . returning ( move |_| Box :: pin ( insert_news ( Arc :: clone ( & start_insert_time) ) ) ) ;
239
+ }
215
240
let workshop = Workshop :: new (
216
241
vec ! [ Arc :: new( mock_news_fetcher) ] ,
217
242
Arc :: new ( mock_http_helper) ,
@@ -227,6 +252,11 @@ mod tests {
227
252
cases. push ( workshop. execute_collect_news_case ( TASK_PERMITS_NUM , INSERT_BATCH_SIZE ) ) ;
228
253
}
229
254
futures:: future:: join_all ( cases) . await ;
255
+ let finish_fetch_time = finish_fetch_time. lock ( ) . await ;
256
+ let start_insert_time = start_insert_time. lock ( ) . await ;
257
+ assert ! ( finish_fetch_time. is_some( ) ) ;
258
+ assert ! ( start_insert_time. is_some( ) ) ;
259
+ assert ! ( finish_fetch_time. unwrap( ) > start_insert_time. unwrap( ) ) ;
230
260
let measured_duration = ( Local :: now ( ) - start_time) . num_milliseconds ( ) as usize ;
231
261
let estimated_duration = ( PAGE_LOAD_DURATION
232
262
+ ( ( PAGES_NUM * PAGE_NEWS_NUM ) as f64 / TASK_PERMITS_NUM as f64 ) . ceil ( ) as usize * NEWS_LOAD_DURATION )
0 commit comments