@@ -99,70 +99,80 @@ TEST_CASE("Segment") {
99
99
100
100
// helper class for unit tests
101
101
class TestReplay : public Replay {
102
- public:
102
+ public:
103
103
TestReplay (const QString &route) : Replay(route, {}, {}) {}
104
104
void test_seek ();
105
105
106
- protected:
107
- void testSeekTo (int seek_to, int invalid_segment = - 1 );
106
+ protected:
107
+ void testSeekTo (int seek_to, const std::set< int > &invalid_segments = {} );
108
108
};
109
109
110
- void TestReplay::testSeekTo (int seek_to, int invalid_segment ) {
110
+ void TestReplay::testSeekTo (int seek_to, const std::set< int > &invalid_segments ) {
111
111
seekTo (seek_to);
112
112
113
113
// wait for seek finish
114
- std::unique_lock lk (stream_lock_);
115
- stream_cv_.wait (lk, [=]() { return events_updated_ == true ; });
116
- events_updated_ = false ;
117
-
118
- // verify result
119
- INFO (" seek to [" << seek_to << " s segment " << seek_to / 60 << " ]" );
120
- REQUIRE (!events_->empty ());
121
- REQUIRE (is_events_ordered (*events_));
122
- REQUIRE (uint64_t (route_start_ts_ + seek_to * 1e9 ) == cur_mono_time_);
123
-
124
- Event cur_event (cereal::Event::Which::INIT_DATA, cur_mono_time_);
125
- auto eit = std::upper_bound (events_->begin (), events_->end (), &cur_event, Event::lessThan ());
126
-
127
- REQUIRE (eit != events_->end ());
128
- const int seek_to_segment = seek_to / 60 ;
129
- const int event_seconds = ((*eit)->mono_time - route_start_ts_) / 1e9 ;
130
- current_segment_ = event_seconds / 60 ;
131
- INFO (" event [" << event_seconds << " s segment " << current_segment_ << " ]" );
132
- REQUIRE (event_seconds >= seek_to);
133
- if (seek_to_segment != invalid_segment) {
134
- REQUIRE (current_segment_ == seek_to_segment); // in the same segment
135
- REQUIRE (event_seconds == seek_to); // at the same time
136
- } else {
137
- // has invalid_segment
138
- if (current_segment_ == seek_to_segment) {
139
- // seek cross-boundary. e.g. seek_to 60s(segment 1), but segment 0 end at 60.021.
140
- REQUIRE (event_seconds == seek_to);
114
+ while (true ) {
115
+ std::unique_lock lk (stream_lock_);
116
+ stream_cv_.wait (lk, [=]() { return events_updated_ == true ; });
117
+ events_updated_ = false ;
118
+
119
+ // verify result
120
+ REQUIRE (uint64_t (route_start_ts_ + seek_to * 1e9 ) == cur_mono_time_);
121
+
122
+ Event cur_event (cereal::Event::Which::INIT_DATA, cur_mono_time_);
123
+ auto eit = std::upper_bound (events_->begin (), events_->end (), &cur_event, Event::lessThan ());
124
+ if (eit == events_->end ()) {
125
+ qDebug () << " waiting for events..." ;
126
+ continue ;
127
+ }
128
+
129
+ INFO (" seek to [" << seek_to << " s segment " << seek_to / 60 << " ]" );
130
+ REQUIRE (!events_->empty ());
131
+ REQUIRE (is_events_ordered (*events_));
132
+
133
+ REQUIRE (eit != events_->end ());
134
+ const int seek_to_segment = seek_to / 60 ;
135
+ const int event_seconds = ((*eit)->mono_time - route_start_ts_) / 1e9 ;
136
+ current_segment_ = event_seconds / 60 ;
137
+ INFO (" event [" << event_seconds << " s segment " << current_segment_ << " ]" );
138
+ REQUIRE (event_seconds >= seek_to);
139
+ if (invalid_segments.find (seek_to_segment) == invalid_segments.end ()) {
140
+ REQUIRE (current_segment_ == seek_to_segment); // in the same segment
141
+ REQUIRE (event_seconds == seek_to); // at the same time
141
142
} else {
142
- REQUIRE (current_segment_ == seek_to_segment + 1 );
143
+ if (current_segment_ == seek_to_segment) {
144
+ // seek cross-boundary. e.g. seek_to 60s(segment 1), but segment 0 end at 60.021 and segemnt 1 is invalid.
145
+ REQUIRE (event_seconds == seek_to);
146
+ } else {
147
+ REQUIRE (current_segment_ > seek_to_segment);
148
+ REQUIRE (invalid_segments.find (current_segment_) == invalid_segments.end ());
149
+ }
143
150
}
151
+ break ;
144
152
}
145
153
}
146
154
147
155
void TestReplay::test_seek () {
148
156
QEventLoop loop;
149
157
150
158
std::thread thread = std::thread ([&]() {
151
- // random seek 500 times in one segment
152
- for (int i = 0 ; i < 500 ; ++i) {
159
+ const int loop_count = 100 ;
160
+ // random seek in one segment
161
+ for (int i = 0 ; i < loop_count; ++i) {
153
162
testSeekTo (random_int (0 , 60 ));
154
163
}
155
- // random seek 500 times in 3 segments (this test if fast)
156
- for (int i = 0 ; i < 500 ; ++i) {
157
- testSeekTo (random_int (0 , 60 * 3 - 1 ));
164
+ // random seek in 3 segments
165
+ for (int i = 0 ; i < loop_count ; ++i) {
166
+ testSeekTo (random_int (0 , 60 * 3 ));
158
167
}
159
-
160
- // random seek 500 times in 3 segments.segment 1 is invalid.
161
- // invalid segmen 1
162
- segments_[1 ]->valid_ = segments_[1 ]->loaded_ = false ;
163
- queueSegment ();
164
- for (int i = 0 ; i < 500 ; ++i) {
165
- testSeekTo (random_int (0 , 60 * 3 - 1 ), 1 );
168
+ // random seek in invalid segments
169
+ std::set<int > invalid_segments{5 , 6 , 7 , 9 };
170
+ for (int i : invalid_segments) {
171
+ route_->segments_ [i].rlog = route_->segments_ [i].qlog = " " ;
172
+ route_->segments_ [i].road_cam = route_->segments_ [i].qcamera = " " ;
173
+ }
174
+ for (int i = 0 ; i < loop_count; ++i) {
175
+ testSeekTo (random_int (4 * 60 , 60 * 10 ), invalid_segments);
166
176
}
167
177
loop.quit ();
168
178
});
0 commit comments