| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- #include "RyanMqttTest.h"
- static pthread_spinlock_t spin;
- uint32_t destroyCount = 0;
- uint32_t randomCount = 0;
- uint32_t sendRandomCount = 0;
- uint32_t memoryRandomCount = 0;
- RyanMqttBool_e isEnableRandomNetworkFault = RyanMqttFalse;
- RyanMqttBool_e isEnableRandomMemoryFault = RyanMqttFalse;
- void enableRandomNetworkFault(void)
- {
- RyanMqttTestEnableCritical();
- isEnableRandomNetworkFault = RyanMqttTrue;
- RyanMqttTestExitCritical();
- }
- void disableRandomNetworkFault(void)
- {
- RyanMqttTestEnableCritical();
- isEnableRandomNetworkFault = RyanMqttFalse;
- RyanMqttTestExitCritical();
- }
- void toggleRandomNetworkFault(void)
- {
- RyanMqttTestEnableCritical();
- isEnableRandomNetworkFault = !isEnableRandomNetworkFault;
- RyanMqttTestExitCritical();
- }
- void enableRandomMemoryFault(void)
- {
- RyanMqttTestEnableCritical();
- isEnableRandomMemoryFault = RyanMqttTrue;
- RyanMqttTestExitCritical();
- }
- void disableRandomMemoryFault(void)
- {
- RyanMqttTestEnableCritical();
- isEnableRandomMemoryFault = RyanMqttFalse;
- RyanMqttTestExitCritical();
- }
- void toggleRandomMemoryFault(void)
- {
- RyanMqttTestEnableCritical();
- isEnableRandomMemoryFault = !isEnableRandomMemoryFault;
- RyanMqttTestExitCritical();
- }
- uint32_t RyanRand(int32_t min, int32_t max)
- {
- static uint32_t isSeed = 0;
- static uint32_t seedp = 0;
- if (isSeed > 1024 || 0 == seedp)
- {
- seedp = platformUptimeMs();
- isSeed = 0;
- }
- if (min >= max)
- {
- return min;
- }
- isSeed++;
- return (rand_r(&seedp) % (max - min + 1)) + min;
- }
- void RyanMqttTestEnableCritical(void)
- {
- pthread_spin_lock(&spin);
- }
- void RyanMqttTestExitCritical(void)
- {
- pthread_spin_unlock(&spin);
- }
- void printfArrStr(uint8_t *buf, uint32_t len, char *userData)
- {
- RyanMqttLog_raw("%s len: %d ", userData, len);
- for (uint32_t i = 0; i < len; i++)
- {
- RyanMqttLog_raw("%c", buf[i]);
- }
- RyanMqttLog_raw("\r\n");
- }
- void RyanMqttTestUtileInit(void)
- {
- pthread_spin_init(&spin, PTHREAD_PROCESS_PRIVATE);
- // 多线程测试必须设置这个,否则会导致 heap-use-after-free, 原因如下
- // 虽然也有办法解决,不过RyanMqtt目标为嵌入式场景,不想引入需要更多资源的逻辑,嵌入式场景目前想不到有这么频繁而且还是本机emqx的场景。
- // 用户线程send -> emqx回复报文 -> mqtt线程recv。
- // recv线程收到数据后,会释放用户线程send的sendbuf缓冲区。
- // 但是在本机部署的emqx并且多核心同时运行,发送的数据量非常大的情况下会出现mqtt线程recv已经收到数据,但是用户线程send函数还没有返回。
- cpu_set_t cpuset;
- CPU_ZERO(&cpuset);
- CPU_SET(0, &cpuset);
- pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
- sched_setaffinity(0, sizeof(cpu_set_t), &cpuset);
- vallocInit();
- }
- void RyanMqttTestUtileDeInit(void)
- {
- pthread_spin_destroy(&spin);
- }
|