void XITServerTest::TearDown() {
    alarm(0);
    if (server.Pid() != -1) {
        if (!server.Terminate(3000))
            server.Kill(3000);
        EXPECT_EQ(server.GetState(), xorg::testing::Process::FINISHED_SUCCESS) << "Unclean server shutdown";
        failed = failed || (server.GetState() != xorg::testing::Process::FINISHED_SUCCESS);

        std::ifstream logfile(server.GetLogFilePath().c_str());
        std::string line;
        std::string bug_warn("BUG");
        if (logfile.is_open()) {
            while(getline(logfile, line)) {
                size_t found = line.find(bug_warn);
                bool error = (found != std::string::npos);
                EXPECT_FALSE(error) << "BUG warning found in log" << std::endl << line << std::endl;
                failed = failed || error;
                break;
            }
        }
    }

    if (!Failed()) {
        config.RemoveConfig();
        server.RemoveLogFile();
    }

    testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
    listeners.Release(this);
}
Exemple #2
0
static struct listen_stats *stats_for(st_table *table, struct inet_diag_msg *r)
{
	char *key, *port, *old_key;
	size_t alloca_len;
	struct listen_stats *stats;
	size_t keylen;
	size_t portlen = sizeof("65535");
	union any_addr sa;
	socklen_t len = sizeof(struct sockaddr_storage);
	int rc;
	int flags = NI_NUMERICHOST | NI_NUMERICSERV;

	switch ((sa.ss.ss_family = r->idiag_family)) {
	case AF_INET: {
		sa.in.sin_port = r->id.idiag_sport;
		sa.in.sin_addr.s_addr = r->id.idiag_src[0];
		keylen = INET_ADDRSTRLEN;
		alloca_len = keylen + 1 + portlen;
		key = alloca(alloca_len);
		key[keylen] = 0; /* will be ':' later */
		port = key + keylen + 1;
		rc = getnameinfo(&sa.sa, len,
				 key, keylen, port, portlen, flags);
		break;
		}
	case AF_INET6: {
		sa.in6.sin6_port = r->id.idiag_sport;
		memcpy(&sa.in6.sin6_addr, &r->id.idiag_src, sizeof(__be32[4]));
		keylen = INET6_ADDRSTRLEN;
		          /* [            ] */
		alloca_len = 1 + keylen + 1 + 1 + portlen;
		key = alloca(alloca_len);
		*key = '[';
		key[1 + keylen + 1] = 0; /* will be ':' later */
		port = 1 + key + keylen + 1 + 1;
		rc = getnameinfo(&sa.sa, len,
				 key + 1, keylen, port, portlen, flags);
		break;
		}
	default:
		assert(0 && "unsupported address family, could that be IPv7?!");
	}
	if (rc != 0) {
		fprintf(stderr, "BUG: getnameinfo: %s\n", gai_strerror(rc));
		bug_warn();
		*key = 0;
	}

	keylen = strlen(key);
	portlen = strlen(port);

	switch (sa.ss.ss_family) {
	case AF_INET:
		key[keylen] = ':';
		memmove(key + keylen + 1, port, portlen + 1);
		break;
	case AF_INET6:
		key[keylen] = ']';
		key[keylen + 1] = ':';
		memmove(key + keylen + 2, port, portlen + 1);
		keylen++;
		break;
	default:
		assert(0 && "unsupported address family, could that be IPv7?!");
	}

	if (st_lookup(table, (st_data_t)key, (st_data_t *)&stats))
		return stats;

	old_key = key;

	if (r->idiag_state == TCP_ESTABLISHED) {
		int n = snprintf(key, alloca_len, "%s:%u",
				 addr_any(sa.ss.ss_family),
				 ntohs(r->id.idiag_sport));
		if (n <= 0) {
			fprintf(stderr, "BUG: snprintf: %d\n", n);
			bug_warn();
		}
		if (st_lookup(table, (st_data_t)key, (st_data_t *)&stats))
			return stats;
		if (n <= 0) {
			key = xmalloc(1);
			*key = '\0';
		} else {
			old_key = key;
			key = xmalloc(n + 1);
			memcpy(key, old_key, n + 1);
		}
	} else {
		key = xmalloc(keylen + 1 + portlen + 1);
		memcpy(key, old_key, keylen + 1 + portlen + 1);
	}
	stats = xcalloc(1, sizeof(struct listen_stats));
	st_insert(table, (st_data_t)key, (st_data_t)stats);
	return stats;
}