TEST(logcat, blocking_clear) { FILE *fp; unsigned long long v = 0xDEADBEEFA55C0000ULL; pid_t pid = getpid(); v += pid & 0xFFFF; // This test is racey; an event occurs between clear and dump. // We accept that we will get a false positive, but never a false negative. ASSERT_TRUE(NULL != (fp = popen( "( trap exit HUP QUIT INT PIPE KILL ; sleep 6; echo DONE )&" " logcat -b events -c 2>&1 ;" " logcat -v brief -b events 2>&1", "r"))); char buffer[5120]; int count = 0; int signals = 0; signal(SIGALRM, caught_blocking_clear); alarm(2); while (fgets(buffer, sizeof(buffer), fp)) { if (!strncmp(buffer, "clearLog: ", 10)) { fprintf(stderr, "WARNING: Test lacks permission to run :-(\n"); count = signals = 1; break; } if (!strncmp(buffer, "DONE", 4)) { break; } ++count; int p; unsigned long long l; if ((2 != sscanf(buffer, "I/[0] ( %u): %lld", &p, &l)) || (p != pid)) { continue; } if (l == v) { if (count > 1) { fprintf(stderr, "WARNING: Possible false positive\n"); } ++signals; break; } } alarm(0); signal(SIGALRM, SIG_DFL); // Generate SIGPIPE fclose(fp); caught_blocking_clear(0); pclose(fp); EXPECT_LE(1, count); EXPECT_EQ(1, signals); }
TEST(logcat, blocking_clear) { FILE *fp; unsigned long long v = 0xDEADBEEFA55C0000ULL; pid_t pid = getpid(); v += pid & 0xFFFF; // This test is racey; an event occurs between clear and dump. // We accept that we will get a false positive, but never a false negative. ASSERT_TRUE(NULL != (fp = popen( "( trap exit HUP QUIT INT PIPE KILL ; sleep 6; echo DONE )&" " logcat -b events -c 2>&1 ;" " logcat -b events -g 2>&1 ;" " logcat -v brief -b events 2>&1", "r"))); char buffer[BIG_BUFFER]; int count = 0; int minus_g = 0; int signals = 0; signal(SIGALRM, caught_blocking_clear); alarm(2); while (fgets(buffer, sizeof(buffer), fp)) { if (!strncmp(buffer, "clearLog: ", 10)) { fprintf(stderr, "WARNING: Test lacks permission to run :-(\n"); count = signals = 1; break; } if (!strncmp(buffer, "DONE", 4)) { break; } int size, consumed, max, payload; char size_mult[3], consumed_mult[3]; size = consumed = max = payload = 0; if (6 == sscanf(buffer, "events: ring buffer is %d%2s (%d%2s consumed)," " max entry is %db, max payload is %db", &size, size_mult, &consumed, consumed_mult, &max, &payload)) { long full_size = size, full_consumed = consumed; switch(size_mult[0]) { case 'G': full_size *= 1024; /* FALLTHRU */ case 'M': full_size *= 1024; /* FALLTHRU */ case 'K': full_size *= 1024; /* FALLTHRU */ case 'b': break; } switch(consumed_mult[0]) { case 'G': full_consumed *= 1024; /* FALLTHRU */ case 'M': full_consumed *= 1024; /* FALLTHRU */ case 'K': full_consumed *= 1024; /* FALLTHRU */ case 'b': break; } EXPECT_GT(full_size, full_consumed); EXPECT_GT(full_size, max); EXPECT_GT(max, payload); EXPECT_GT(max, full_consumed); ++minus_g; continue; } ++count; int p; unsigned long long l; if ((2 != sscanf(buffer, "I/[0] ( %u): %lld", &p, &l)) || (p != pid)) { continue; } if (l == v) { if (count > 1) { fprintf(stderr, "WARNING: Possible false positive\n"); } ++signals; break; } } alarm(0); signal(SIGALRM, SIG_DFL); // Generate SIGPIPE fclose(fp); caught_blocking_clear(0); pclose(fp); EXPECT_LE(1, count); EXPECT_EQ(1, minus_g); EXPECT_EQ(1, signals); }