Add bounded desktop live media bridge and source lifecycle tests
This commit is contained in:
1 parent
e3d9ac9d31
commit
d9821fa89c
3 files changed
+258
-4
No files matched your search
@@ -7,6 +7,9 @@
|
||||
#include "../lib/mem.h"
|
||||
#include "../lib/sqlite3.h"
|
||||
#include "../src/chat/chat_core.h"
|
||||
#include "../src/chat/chat_event.h"
|
||||
#include "../src/stream/stream.h"
|
||||
#include "../src/stream/stream_member.h"
|
||||
#include "../src/utun_instance.h"
|
||||
#include "../tools/chatgui-android/libutun_lite/stream_bridge.h"
|
||||
#include "../src/stream/stream_proto.h"
|
||||
@@ -16,6 +19,18 @@
|
||||
static uint8_t video[9000];
|
||||
static struct UASYNC *ua;
|
||||
static int producer_started, producer_stop;
|
||||
static unsigned source_events;
|
||||
static uint64_t source_group;
|
||||
static char *source_snapshot;
|
||||
|
||||
static void chat_event(struct UTUN_INSTANCE *inst, int type, const uint8_t *data, int length) {
|
||||
(void)inst;
|
||||
if (type != CHAT_EVT_STREAM_SOURCES) return;
|
||||
CHECK(length >= 11 && data[8] == 1);
|
||||
source_group = stream_read_be(data, 8); source_events++;
|
||||
u_free(source_snapshot); source_snapshot = u_malloc((uint32_t)(length - 8)); CHECK(source_snapshot);
|
||||
memcpy(source_snapshot, data + 9, (size_t)(length - 9)); source_snapshot[length - 9] = '\0';
|
||||
}
|
||||
|
||||
static uint8_t *wait_event(uint64_t id, int kind, size_t *size) {
|
||||
for (unsigned i = 0; i < 1000; i++) {
|
||||
@@ -48,11 +63,22 @@ int main(void) {
|
||||
CHECK(sqlite3_step(statement) == SQLITE_ROW);
|
||||
uint64_t group = strtoull((const char *)sqlite3_column_text(statement, 0), NULL, 10); sqlite3_finalize(statement); CHECK(group);
|
||||
uasync_mark_running(ua); android_stream_attach(inst);
|
||||
CHECK(android_stream_open(1, group, 0, 1280, 720, 90, 1) == 0);
|
||||
chat_event_set_handler(inst, chat_event);
|
||||
CHECK(android_stream_watch(group) == 0); test_clock_poll(ua, 100);
|
||||
CHECK(source_events == 1 && source_group == group && !strcmp(source_snapshot, "[]"));
|
||||
CHECK(!stream_service_needs_activity(inst));
|
||||
CHECK(android_stream_open(1, group, 0, 1280, 720, 90, 1, 0) == 0);
|
||||
size_t size = 0; u_free(wait_event(1, 4, &size));
|
||||
char *sources = android_stream_sources(group); u_free(sources); test_clock_poll(ua, 100);
|
||||
sources = android_stream_sources(group); CHECK(strstr(sources, "epoch") && strstr(sources, "name")); u_free(sources);
|
||||
CHECK(android_stream_open(2, group, inst->node_id, 0, 0, 0, 1) == 0); u_free(wait_event(2, 4, &size));
|
||||
CHECK(source_events == 2 && strstr(source_snapshot, "epoch"));
|
||||
struct stream_member_state member;
|
||||
CHECK(stream_member_load(inst, group, inst->node_id, &member, NULL) == STREAM_OK && member.published);
|
||||
CHECK(android_stream_open(5, group, inst->node_id, 0, 0, 0, 1, member.source.source_epoch ^ 1) == 0);
|
||||
uint8_t *error = wait_event(5, 6, &size); CHECK(error[1] == STREAM_CLOSE_SOURCE_CHANGED); u_free(error);
|
||||
CHECK(android_stream_open(2, group, inst->node_id, 0, 0, 0, 1, member.source.source_epoch) == 0);
|
||||
u_free(wait_event(2, 4, &size));
|
||||
CHECK(source_events == 2); /* Подписка не меняет каталог публикаций. */
|
||||
for (unsigned i = 0; i < sizeof(video); i++) video[i] = (uint8_t)i;
|
||||
CHECK(android_stream_feed(1, 1, 100000, 0, video, sizeof(video)) == 0);
|
||||
CHECK(android_stream_feed(1, 1, 100000, 1, video, sizeof(video)) == 1);
|
||||
@@ -69,7 +95,8 @@ int main(void) {
|
||||
CHECK(video_seen == 1 && audio_seen == 1);
|
||||
android_stream_stop(1); u_free(wait_event(2, 5, &size)); android_stream_stop(2); u_free(wait_event(1, 5, &size));
|
||||
while ((output = android_stream_pull(2, &size))) u_free(output);
|
||||
CHECK(android_stream_open(3, group, 0, 1280, 720, 0, 0) == 0); u_free(wait_event(3, 4, &size));
|
||||
CHECK(!strcmp(source_snapshot, "[]"));
|
||||
CHECK(android_stream_open(3, group, 0, 1280, 720, 0, 0, 0) == 0); u_free(wait_event(3, 4, &size));
|
||||
pthread_t thread; CHECK(pthread_create(&thread, NULL, producer, NULL) == 0);
|
||||
while (!__atomic_load_n(&producer_started, __ATOMIC_ACQUIRE)) {}
|
||||
android_stream_detach(inst);
|
||||
@@ -77,9 +104,10 @@ int main(void) {
|
||||
CHECK(android_stream_feed(3, 1, 900000, 1, video, sizeof(video)) == -1);
|
||||
while ((output = android_stream_pull(3, &size))) u_free(output);
|
||||
android_stream_attach(inst);
|
||||
CHECK(android_stream_open(4, group, 0, 1280, 720, 0, 0) == 0); android_stream_stop(4);
|
||||
CHECK(android_stream_open(4, group, 0, 1280, 720, 0, 0, 0) == 0); android_stream_stop(4);
|
||||
u_free(wait_event(4, 5, &size));
|
||||
android_stream_detach(inst); uasync_mark_stopped(ua); utun_instance_destroy(inst); uasync_destroy(ua, 0);
|
||||
u_free(source_snapshot);
|
||||
CHECK(u_get_allocated_count() == before);
|
||||
test_clock_finish();
|
||||
DEBUG_INFO(DEBUG_CATEGORY_STREAM, "PASS Android stream: preview, source snapshot, FIN, cancellation, concurrent detach and no leaks");
|
||||
|
||||
Reference in new issue
Block a user