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);
 | |
|   }
 | |
| }
 | |
| 
 |