Я пишу библиотеку с интерфейсом C (не C ++), который содержит цикл обработки событий, назовите его processEvents
.Это должно быть вызвано в цикле и вызывает определенные пользователем обратные вызовы, когда что-то происходит.«Что-то» в этом случае инициируется ответом RPC, полученным в другом потоке, и добавляется в очередь событий, которая используется processEvents
в главном потоке.
Таким образом, с точкис точки зрения пользователя моей библиотеки, использование выглядит следующим образом:
function myCallback(void *userData) {
// ...
}
int main() {
setCallback(&myCallback, NULL);
requestCallback();
while (true) {
processEvents(); /* Eventually calls myCallback, but not immediately. */
doSomeOtherStuff();
}
}
Теперь я хочу проверить, используя Google Test и Google Mock, что обратный вызов действительно называется.
Iиспользовал MockFunction<void()>
для перехвата фактического обратного вызова;это вызывается статической функцией в стиле C, которая преобразует void *userData
в MockFunction<void()> *
и вызывает его.Это работает нормально.
Проблема в том, что обратный вызов не обязательно происходит при первом вызове processEvents
;все, что я знаю, это то, что это произойдет в конечном итоге , если мы будем продолжать звонить processEvents
в цикле.
Так что я думаю, мне нужно что-то вроде этого:
while (!testing::Mock::AllExpectationsSatisfied() && !timedOut()) {
processEvents();
}
Ноэтот вымышленный AllExpectationsSatisfied
, кажется, не существует.Самое близкое, что я могу найти, это VerifyAndClearExpectations
, но оно сразу же делает тест неудачным, если ожидания не оправдываются с первой попытки (и очищает их для загрузки).
OfКонечно, я заставляю этот цикл работать в течение полной секунды или около того, что сделало бы тест зеленым, но также сделало бы его слишком медленным.
Кто-нибудь знает лучшее решение?