Я пытаюсь написать модульный тест для программы, которая должна взаимодействовать с другим процессом по протоколу через канал cin / cout.Он хорошо работает при выделении и тестировании с клавиатуры или другой программы, отправляющей и получающей команды и ответы.
В модульном тесте мне, очевидно, потребуется заменить cin / cout другими потоками, из которых я могу отправлять и получать данные.(Через другой поток и запись во входной поток обработчика протокола)
К сожалению, я не могу найти метод для получения блокирующего метода чтения, который ожидает, пока поток не получит больше контента.
Приведенный ниже код работает нормально при использовании cin.
void Handler::loop() {
string cmd, token;
do {
cout << "HANDLER WAIT FOR COMMAND:" << endl;
// Block here waiting for input or EOF
// only blocks on cin!!
if (!getline(*pInputStream, cmd)) cmd = "quit";
// create the stream object
istringstream inStream(cmd);
inStream >> skipws >> token;
cout << "HANDLER RECEIVED: " << token << endl;
if (token == "quit") break;
// handle commands...
else if (token == "noop") /* noop */;
else cerr << "Unknown command: " << token << endl;
cout << "HANDLER COMMAND PROCESSED: " << token << endl;
} while (token != "quit");
}
При использовании
istringstream is;
вместо cin, тогда getline (* pInputStream, cmd) 'не работаетблокировать больше и немедленно возвращает -1.Я не могу найти другой mothed, который бы выполнил то, что мне нужно (если бы я провел какое-то исследование в течение некоторого времени).
В Java я реализовал это с помощью:
final BufferedReader in =
new BufferedReader(newnputStreamReader(inputStream));
while (running) {
try {
// wait until a line is ready to be read
final String readLine = in.readLine();
...
Это прекрасно работает с System.in или другими потоками.in.readline () всегда блокируется, пока содержимое не станет доступным.Идеально для модульного тестирования.
Так как конкретно это можно сделать в C ++ или, в более общем смысле, как выполнить модульное тестирование протоколов по межпроцессным каналам?
Заранее спасибо за любые идеи.