You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							75 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
	
	
							75 lines
						
					
					
						
							2.0 KiB
						
					
					
				#include <QEventLoop>
 | 
						|
#include <QMap>
 | 
						|
#include <QThread>
 | 
						|
 | 
						|
#include "catch2/catch.hpp"
 | 
						|
#include "selfdrive/ui/soundd/sound.h"
 | 
						|
 | 
						|
class TestSound : public Sound {
 | 
						|
public:
 | 
						|
  TestSound() : Sound() {
 | 
						|
    for (auto i = sounds.constBegin(); i != sounds.constEnd(); ++i) {
 | 
						|
      sound_stats[i.key()] = {0, 0};
 | 
						|
      QObject::connect(i.value().first, &QSoundEffect::playingChanged, [=, s = i.value().first, a = i.key()]() {
 | 
						|
        if (s->isPlaying()) {
 | 
						|
          sound_stats[a].first++;
 | 
						|
        } else {
 | 
						|
          sound_stats[a].second++;
 | 
						|
        }
 | 
						|
      });
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  QMap<AudibleAlert, std::pair<int, int>> sound_stats;
 | 
						|
};
 | 
						|
 | 
						|
void controls_thread(int loop_cnt) {
 | 
						|
  PubMaster pm({"controlsState", "deviceState"});
 | 
						|
  MessageBuilder deviceStateMsg;
 | 
						|
  auto deviceState = deviceStateMsg.initEvent().initDeviceState();
 | 
						|
  deviceState.setStarted(true);
 | 
						|
 | 
						|
  const int DT_CTRL = 10;  // ms
 | 
						|
  for (int i = 0; i < loop_cnt; ++i) {
 | 
						|
    for (auto &[alert, fn, loops] : sound_list) {
 | 
						|
      printf("testing %s\n", qPrintable(fn));
 | 
						|
      for (int j = 0; j < 1000 / DT_CTRL; ++j) {
 | 
						|
        MessageBuilder msg;
 | 
						|
        auto cs = msg.initEvent().initControlsState();
 | 
						|
        cs.setAlertSound(alert);
 | 
						|
        cs.setAlertType(fn.toStdString());
 | 
						|
        pm.send("controlsState", msg);
 | 
						|
        pm.send("deviceState", deviceStateMsg);
 | 
						|
        QThread::msleep(DT_CTRL);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  // send no alert sound
 | 
						|
  for (int j = 0; j < 1000 / DT_CTRL; ++j) {
 | 
						|
    MessageBuilder msg;
 | 
						|
    msg.initEvent().initControlsState();
 | 
						|
    pm.send("controlsState", msg);
 | 
						|
    QThread::msleep(DT_CTRL);
 | 
						|
  }
 | 
						|
 | 
						|
  QThread::currentThread()->quit();
 | 
						|
}
 | 
						|
 | 
						|
TEST_CASE("test soundd") {
 | 
						|
  QEventLoop loop;
 | 
						|
  TestSound test_sound;
 | 
						|
  const int test_loop_cnt = 2;
 | 
						|
 | 
						|
  QThread t;
 | 
						|
  QObject::connect(&t, &QThread::started, [=]() { controls_thread(test_loop_cnt); });
 | 
						|
  QObject::connect(&t, &QThread::finished, [&]() { loop.quit(); });
 | 
						|
  t.start();
 | 
						|
  loop.exec();
 | 
						|
 | 
						|
  for (const AudibleAlert alert : test_sound.sound_stats.keys()) {
 | 
						|
    auto [play, stop] = test_sound.sound_stats[alert];
 | 
						|
    REQUIRE(play == test_loop_cnt);
 | 
						|
    REQUIRE(stop == test_loop_cnt);
 | 
						|
  }
 | 
						|
}
 | 
						|
 |