// Test that uniform_int<> can be used with std::random_shuffle // Author: Jos Hickson void test_random_shuffle() { typedef boost::uniform_int<> distribution_type; typedef boost::variate_generator<boost::mt19937 &, distribution_type> generator_type; boost::mt19937 engine1(1234); boost::mt19937 engine2(1234); rand_for_random_shuffle<boost::mt19937> referenceRand(engine1); distribution_type dist(0,10); generator_type testRand(engine2, dist); std::vector<int> referenceVec; for (int i = 0; i < 200; ++i) { referenceVec.push_back(i); } std::vector<int> testVec(referenceVec); std::random_shuffle(referenceVec.begin(), referenceVec.end(), referenceRand); std::random_shuffle(testVec.begin(), testVec.end(), testRand); typedef std::vector<int>::iterator iter_type; iter_type theEnd(referenceVec.end()); for (iter_type referenceIter(referenceVec.begin()), testIter(testVec.begin()); referenceIter != theEnd; ++referenceIter, ++testIter) { BOOST_CHECK_EQUAL(*referenceIter, *testIter); } }
virtual void SetUp() { ctrl_fd = -1; dev_fd = -1; my_uid = getuid(); my_pid = getpid(); srand48(my_pid * my_uid); // Adjust fake UIDs and tags so that multiple instances can run in parallel. fake_uid = testRand(); fake_uid2 = testRand(); valid_tag1 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32); valid_tag2 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32); valid_tag2 &= 0xffffff00ffffffffllu; // Leave some room to make counts visible. testPrintI("* start: pid=%lu uid=%lu uid1=0x%lx/%lu uid2=0x%lx/%lu" " tag1=0x%" PRIx64 "/%" PRIu64 " tag2=0x%" PRIx64 "/% " PRIu64, (unsigned long)my_pid, (unsigned long)my_uid, (unsigned long)fake_uid, (unsigned long)fake_uid, (unsigned long)fake_uid2, (unsigned long)fake_uid2, valid_tag1, valid_tag1, valid_tag2, valid_tag2); max_uint_tag = 0xffffffff00000000llu; max_uint_tag = 1llu << 63 | (((uint64_t)my_pid << 48) ^ max_uint_tag); testPrintI("kernel has qtaguid"); ctrl_fd = openCtrl(); ASSERT_GE(ctrl_fd, 0) << "qtaguid ctrl open failed"; close(ctrl_fd); dev_fd = open("/dev/xt_qtaguid", O_RDONLY); EXPECT_GE(dev_fd, 0) << "qtaguid dev open failed"; // We want to clean up any previous faulty test runs. testPrintI("delete command does not fail"); EXPECT_GE(doCtrlCommand("d 0 %u", fake_uid), 0) << "Failed to delete fake_uid"; EXPECT_GE(doCtrlCommand("d 0 %u", fake_uid2), 0) << "Failed to delete fake_uid2"; EXPECT_GE(doCtrlCommand("d 0 %u", my_uid), 0) << "Failed to delete my_uid"; testPrintI("setup sock0 and addr via tag"); ASSERT_FALSE(sock0.setup(valid_tag1)) << "socket0 setup failed"; testPrintI("setup sock1 and addr via tag"); ASSERT_FALSE(sock1.setup(valid_tag1)) << "socket1 setup failed"; }
int main() { testRand(); testRays(); }
int testTagData(void) { SockInfo sock0; SockInfo sock1; int res; int total_errors = 0; int ctrl_fd = -1; int dev_fd = -1; const uint64_t invalid_tag1 = 0x0000000100000001llu; uint64_t valid_tag1; uint64_t valid_tag2; uint64_t max_uint_tag = 0xffffffff00000000llu; uid_t fake_uid; uid_t fake_uid2; const char *test_name; uid_t my_uid = getuid(); pid_t my_pid = getpid(); const int max_tags = 5; srand48(my_pid * my_uid); /* Adjust fake UIDs and tags so that multiple instances can run in parallel. */ fake_uid = testRand(); fake_uid2 = testRand(); valid_tag1 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32); valid_tag2 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32); valid_tag2 &= 0xffffff00ffffffffllu; // Leave some room to make counts visible. testSetLogCatTag(LOG_TAG); testPrintI("** %s ** ============================", __FUNCTION__); testPrintI("* start: pid=%lu uid=%lu uid1=0x%lx/%lu uid2=0x%lx/%lu" " tag1=0x%llx/%llu tag2=0x%llx/%llu", my_pid, my_uid, fake_uid, fake_uid, fake_uid2, fake_uid2, valid_tag1, valid_tag1, valid_tag2, valid_tag2); // --------------- test_name = "kernel has qtaguid"; testPrintI("* test: %s ", test_name); ctrl_fd = openCtrl(); if (ctrl_fd < 0) { testPrintE("qtaguid ctrl open failed: %s", strerror(errno)); return 1; } close(ctrl_fd); dev_fd = open("/dev/xt_qtaguid", O_RDONLY); if (dev_fd < 0) { testPrintE("! %s: qtaguid dev open failed: %s", test_name, strerror(errno)); total_errors++; } // --------------- test_name = "delete command doesn't fail"; testPrintI("* test: %s", test_name); res = doCtrlCommand("d 0 %u", fake_uid); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } res = doCtrlCommand("d 0 %u", fake_uid2); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } res = doCtrlCommand("d 0 %u", my_uid); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } // --------------- test_name = "setup sock0 and addr via tag"; testPrintI("* test: %s", test_name); if (sock0.setup(valid_tag1)) { testPrintE("socket setup failed: %s", strerror(errno)); return 1; } // --------------- test_name = "setup sock1 and addr via tag"; testPrintI("* test: %s", test_name); if (sock1.setup(valid_tag1)) { testPrintE("socket setup failed: %s", strerror(errno)); return 1; } // --------------- test_name = "setup tag limit"; testPrintI("* test: %s ", test_name); char *max_tags_str; asprintf(&max_tags_str, "%d", max_tags); res = writeModuleParam("max_sock_tags", max_tags_str); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); free(max_tags_str); return 1; } // --------------- test_name = "tag quota reach limit"; testPrintI("* test: %s", test_name); for (int cnt = 0; cnt < max_tags; cnt++ ) { uint64_t new_tag = valid_tag2 + ((uint64_t)cnt << 32); res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (!sock0.checkTag(new_tag, fake_uid2)) { testPrintE("! %s: Unexpected results: tag not found", test_name); total_errors++; } } test_name = "tag quota go over limit"; testPrintI("* test: %s", test_name); { uint64_t new_tag = valid_tag2 + ((uint64_t)max_tags << 32); res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2); if (res > 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (!sock0.checkTag(valid_tag2 + (((uint64_t)max_tags - 1) << 32), fake_uid2)) { testPrintE("! %s: Unexpected results: tag not found", test_name); total_errors++; } } // --------------- test_name = "valid untag"; testPrintI("* test: %s", test_name); res = doCtrlCommand("u %d", sock0.fd); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (sock0.checkTag(valid_tag2 + (((uint64_t)max_tags - 1) << 32), fake_uid2)) { testPrintE("! %s: Unexpected results: tag should not be there", test_name); total_errors++; } // --------------- test_name = "tag after untag shouldn't free up max tags"; testPrintI("* test: %s", test_name); { uint64_t new_tag = valid_tag2 + ((uint64_t)max_tags << 32); res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2); if (res > 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (sock0.checkTag(valid_tag2 + ((uint64_t)max_tags << 32), fake_uid2)) { testPrintE("! %s: Unexpected results: tag should not be there", test_name); total_errors++; } } // --------------- test_name = "delete one tag"; testPrintI("* test: %s", test_name); { uint64_t new_tag = valid_tag2 + (((uint64_t)max_tags / 2) << 32); res = doCtrlCommand("d %llu %u", new_tag, fake_uid2); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } } // --------------- test_name = "2 tags after 1 delete pass/fail"; testPrintI("* test: %s", test_name); { uint64_t new_tag; new_tag = valid_tag2 + (((uint64_t)max_tags + 1 ) << 32); res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (!sock0.checkTag(valid_tag2 + (((uint64_t)max_tags + 1) << 32), fake_uid2)) { testPrintE("! %s: Unexpected results: tag not found", test_name); total_errors++; } new_tag = valid_tag2 + (((uint64_t)max_tags + 2 ) << 32); res = doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2); if (res > 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (sock0.checkTag(valid_tag2 + (((uint64_t)max_tags + 2) << 32), fake_uid2)) { testPrintE("! %s: Unexpected results: tag should not be there", test_name); total_errors++; } } /* TODO(jpa): test tagging two different sockets with same tags and * check refcounts the tag_node should be +2 */ // --------------- if (total_errors) { testPrintE("! Errors found"); } else { testPrintI("No Errors found"); } done: if (dev_fd >= 0) { close(dev_fd); } if (ctrl_fd >= 0) { close(ctrl_fd); } return total_errors; }
/*----------------------------------------------------------------*/ int testSocketTagging(void) { SockInfo sock0; SockInfo sock1; int res; int total_errors = 0; int ctrl_fd = -1; int dev_fd = -1; const uint64_t invalid_tag1 = 0x0000000100000001llu; uint64_t valid_tag1; uint64_t valid_tag2; uint64_t max_uint_tag = 0xffffffff00000000llu; uid_t fake_uid; uid_t fake_uid2; const char *test_name; uid_t my_uid = getuid(); pid_t my_pid = getpid(); srand48(my_pid * my_uid); /* Adjust fake UIDs and tags so that multiple instances can run in parallel. */ fake_uid = testRand(); fake_uid2 = testRand(); valid_tag1 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32); valid_tag2 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32); max_uint_tag = 1llu << 63 | (((uint64_t)my_pid << 48) ^ max_uint_tag); testSetLogCatTag(LOG_TAG); testPrintI("** %s ** ============================", __FUNCTION__); testPrintI("* start: pid=%lu uid=%lu uid1=0x%lx/%lu uid2=0x%lx/%lu" " tag1=0x%llx/%llu tag2=0x%llx/%llu", my_pid, my_uid, fake_uid, fake_uid, fake_uid2, fake_uid2, valid_tag1, valid_tag1, valid_tag2, valid_tag2); // --------------- test_name = "kernel has qtaguid"; testPrintI("* test: %s ", test_name); ctrl_fd = openCtrl(); if (ctrl_fd < 0) { testPrintE("qtaguid ctrl open failed: %s", strerror(errno)); total_errors++; goto done; } close(ctrl_fd); dev_fd = open("/dev/xt_qtaguid", O_RDONLY); if (dev_fd < 0) { testPrintE("qtaguid dev open failed: %s", strerror(errno)); total_errors++; } // --------------- test_name = "delete command doesn't fail"; testPrintI("* test: %s", test_name); res = doCtrlCommand("d 0 %u", fake_uid); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } res = doCtrlCommand("d 0 %u", fake_uid2); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } res = doCtrlCommand("d 0 %u", my_uid); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } // --------------- test_name = "setup sock0 and addr via tag"; testPrintI("* test: %s", test_name); if (sock0.setup(valid_tag1) < 0) { testPrintE("socket setup failed: %s", strerror(errno)); total_errors++; goto done; } // --------------- test_name = "setup sock1 and addr via tag"; testPrintI("* test: %s", test_name); if (sock1.setup(valid_tag1) < 0) { testPrintE("socket setup failed: %s", strerror(errno)); total_errors++; goto done; } // --------------- test_name = "insufficient args. Expected failure"; testPrintI("* test: %s", test_name); res = doCtrlCommand("t"); if (res > 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } // --------------- test_name = "bad command. Expected failure"; testPrintI("* test: %s", test_name); res = doCtrlCommand("?"); if (res > 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } // --------------- test_name = "no tag, no uid"; testPrintI("* test: %s", test_name); res = doCtrlCommand("t %d", sock0.fd); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (!sock0.checkTag(0, my_uid)) { testPrintE("! %s: Unexpected results: tag not found", test_name); total_errors++; } // --------------- test_name = "invalid tag. Expected failure"; testPrintI("* test: %s", test_name); res = doCtrlCommand("t %d %llu", sock0.fd, invalid_tag1); if (res > 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (sock0.checkTag(invalid_tag1, my_uid)) { testPrintE("! %s: Unexpected results: tag should not be there", test_name); total_errors++; } // --------------- test_name = "valid tag with no uid"; testPrintI("* test: %s", test_name); res = doCtrlCommand("t %d %llu", sock0.fd, valid_tag1); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (!sock0.checkTag(valid_tag1, my_uid)) { testPrintE("! %s: Unexpected results: tag not found", test_name); total_errors++; } // --------------- test_name = "valid untag"; testPrintI("* test: %s", test_name); res = doCtrlCommand("u %d", sock0.fd); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (sock0.checkTag(valid_tag1, my_uid)) { testPrintE("! %s: Unexpected results: tag not removed", test_name); total_errors++; } // --------------- test_name = "valid 1st tag"; testPrintI("* test: %s", test_name); res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (!sock0.checkTag(valid_tag2, fake_uid)) { testPrintE("! %s: Unexpected results: tag not found", test_name); total_errors++; } // --------------- test_name = "valid re-tag"; testPrintI("* test: %s", test_name); res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (!sock0.checkTag(valid_tag2, fake_uid)) { testPrintE("! %s: Unexpected results: tag not found", test_name); total_errors++; } // --------------- test_name = "valid re-tag with acct_tag change"; testPrintI("* test: %s", test_name); res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag1, fake_uid); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (!sock0.checkTag(valid_tag1, fake_uid)) { testPrintE("! %s: Unexpected results: tag not found", test_name); total_errors++; } // --------------- test_name = "re-tag with uid change"; testPrintI("* test: %s", test_name); res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid2); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (!sock0.checkTag(valid_tag2, fake_uid2)) { testPrintE("! %s: Unexpected results: tag not found", test_name); total_errors++; } // --------------- test_name = "valid 64bit acct tag"; testPrintI("* test: %s", test_name); res = doCtrlCommand("t %d %llu", sock0.fd, max_uint_tag); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (!sock0.checkTag(max_uint_tag, my_uid)) { testPrintE("! %s: Unexpected results: tag not found", test_name); total_errors++; } // --------------- test_name = "tag another socket"; testPrintI("* test: %s", test_name); res = doCtrlCommand("t %d %llu %u", sock1.fd, valid_tag1, fake_uid2); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (!sock1.checkTag(valid_tag1, fake_uid2)) { testPrintE("! %s: Unexpected results: tag not found", test_name); total_errors++; } // --------------- test_name = "valid untag"; testPrintI("* test: %s", test_name); res = doCtrlCommand("u %d", sock0.fd); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (sock0.checkTag(max_uint_tag, fake_uid)) { testPrintE("! %s: Unexpected results: tag should not be there", test_name); total_errors++; } if (!sock1.checkTag(valid_tag1, fake_uid2)) { testPrintE("! %s: Unexpected results: tag not found", test_name); total_errors++; } res = doCtrlCommand("u %d", sock1.fd); if (res < 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (sock1.checkTag(valid_tag1, fake_uid2)) { testPrintE("! %s: Unexpected results: tag should not be there", test_name); total_errors++; } // --------------- test_name = "invalid sock0.fd. Expected failure"; testPrintI("* test: %s", test_name); close(sock0.fd); res = doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag1, my_uid); if (res > 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (sock0.checkTag(valid_tag1, my_uid)) { testPrintE("! %s: Unexpected results: tag should not be there", test_name); total_errors++; } // --------------- test_name = "invalid untag. Expected failure"; testPrintI("* test: %s", test_name); close(sock1.fd); res = doCtrlCommand("u %d", sock1.fd); if (res > 0) { testPrintE("! %s: Unexpected results", test_name); total_errors++; } if (total_errors) { testPrintE("! Errors found"); } else { testPrintI("No Errors found"); } done: if (dev_fd >= 0) { close(dev_fd); } if (ctrl_fd >= 0) { close(ctrl_fd); } return total_errors; }
void testRandNumber(void) { testRand(); }