int cBSPTree::PreProcessNodes( std::vector<cTriangle>& tris, std::vector<cTriNodeIndexPair>& in_progress, int parent_node ) { int best_index = 0; int best_split_count = static_cast<int>(in_progress.size()); int best_diff = best_split_count; for (int i = 0 ; i < static_cast<int>(in_progress.size()); ++i) { if(in_progress.at(i).mParentNode!=parent_node){ continue; } int split_count = 0; int in_count = 0; int out_count = 0; int opposing_coplanar_count = 0; cBSPNode test_node(tris.at(in_progress.at(i).mTriIndex),-1, 0); for (cTriNodeIndexPair ipair: in_progress) { if(ipair.mParentNode != parent_node){ continue; } cBSPNode::eClassification in_out = test_node.ClassifyTriangle(tris.at(ipair.mTriIndex)); if(in_out == cBSPNode::BSP_SPLIT){ split_count++; } else if(in_out == cBSPNode::BSP_FRONT){ in_count++; } else if(in_out == cBSPNode::BSP_BACK){ out_count++; } else if(in_out == cBSPNode::BSP_COPLANAR){ // if( tris.at(ipair.mTriIndex).GetNormal().dot(test_node.GetNormal()) <= 0.0){ // opposing_coplanar_count ++; // } } } in_progress.at(i).mSplits = split_count; //in_progress.at(i).mBadCoplanar = opposing_coplanar_count; in_progress.at(i).mInOutDiff = in_count - out_count; if(split_count < best_split_count){ best_split_count = split_count; best_diff = in_count - out_count; best_index = i; } else if(split_count == best_split_count &&(best_diff > in_count - out_count)){ best_diff = in_count - out_count; best_index = i; } } return best_index; }
static bool test_doctype_wf(const char_t* decl) { xml_document doc; // standalone if (!load_concat(doc, decl) || !doc.first_child().empty()) return false; // pcdata pre/postfix if (!load_concat(doc, STR("a"), decl) || !test_node(doc, STR("a"), STR(""), format_raw)) return false; if (!load_concat(doc, decl, STR("b")) || !test_node(doc, STR("b"), STR(""), format_raw)) return false; if (!load_concat(doc, STR("a"), decl, STR("b")) || !test_node(doc, STR("ab"), STR(""), format_raw)) return false; // node pre/postfix if (!load_concat(doc, STR("<nodea/>"), decl) || !test_node(doc, STR("<nodea />"), STR(""), format_raw)) return false; if (!load_concat(doc, decl, STR("<nodeb/>")) || !test_node(doc, STR("<nodeb />"), STR(""), format_raw)) return false; if (!load_concat(doc, STR("<nodea/>"), decl, STR("<nodeb/>")) || !test_node(doc, STR("<nodea /><nodeb />"), STR(""), format_raw)) return false; // check load-store contents preservation CHECK(doc.load(decl, parse_doctype | parse_fragment)); CHECK_NODE(doc, decl); return true; }
static void test_transaction(void) { _c_cleanup_(b1_peer_unrefp) B1Peer *src = NULL, *dst = NULL; _c_cleanup_(b1_node_freep) B1Node *node = NULL; _c_cleanup_(b1_handle_unrefp) B1Handle *handle = NULL; _c_cleanup_(b1_message_unrefp) B1Message *message = NULL; const char *payload = "WOOF"; struct iovec vec = { .iov_base = (void*)payload, .iov_len = strlen(payload) + 1, }; struct iovec *vec_out; size_t n_vec; int r, fd; r = b1_peer_new(&src); assert(r >= 0); r = b1_peer_new(&dst); assert(r >= 0); r = b1_node_new(dst, &node); assert(r >= 0); r = b1_handle_transfer(b1_node_get_handle(node), src, &handle); assert(r >= 0); r = b1_message_new(src, &message); assert(r >= 0); r = b1_message_set_payload(message, &vec, 1); assert(r >= 0); r = b1_message_set_handles(message, &handle, 1); assert(r >= 0); fd = eventfd(0, 0); assert(fd >= 0); r = b1_message_set_fds(message, &fd, 1); assert(r >= 0); assert(close(fd) >= 0); r = b1_message_send(message, &handle, 1); assert(r >= 0); message = b1_message_unref(message); assert(!message); handle = b1_handle_unref(handle); assert(!handle); r = b1_peer_recv(dst, &message); assert(r >= 0); assert(message); assert(b1_message_get_type(message) == BUS1_MSG_DATA); assert(b1_message_get_destination_node(message) == node); assert(b1_message_get_uid(message) == getuid()); assert(b1_message_get_gid(message) == getgid()); assert(b1_message_get_pid(message) == getpid()); assert(b1_message_get_tid(message) == c_syscall_gettid()); r = b1_message_get_payload(message, &vec_out, &n_vec); assert(r >= 0); assert(vec_out); assert(n_vec == 1); assert(vec_out->iov_len == strlen("WOOF") + 1); assert(strcmp(vec_out->iov_base, "WOOF") == 0); r = b1_message_get_handle(message, 0, &handle); assert(r >= 0); assert(handle == b1_node_get_handle(node)); handle = NULL; r = b1_message_get_fd(message, 0, &fd); assert(r >= 0); assert(fd >= 0); message = b1_message_unref(message); r = b1_peer_recv(dst, &message); assert(r >= 0); assert(message); assert(b1_message_get_type(message) == BUS1_MSG_NODE_RELEASE); assert(b1_message_get_destination_node(message) == node); assert(b1_message_get_uid(message) == (uid_t)-1); assert(b1_message_get_gid(message) == (gid_t)-1); assert(b1_message_get_pid(message) == 0); assert(b1_message_get_tid(message) == 0); message = b1_message_unref(message); r = b1_node_destroy(node); assert(r >= 0); r = b1_peer_recv(dst, &message); assert(r >= 0); assert(message); assert(b1_message_get_type(message) == BUS1_MSG_NODE_DESTROY); assert(b1_message_get_destination_node(message)); assert(b1_message_get_destination_node(message) == node); assert(b1_message_get_uid(message) == (uid_t)-1); assert(b1_message_get_gid(message) == (gid_t)-1); assert(b1_message_get_pid(message) == 0); assert(b1_message_get_tid(message) == 0); message = b1_message_unref(message); r = b1_peer_recv(dst, &message); assert(r == -EAGAIN); r = b1_peer_recv(src, &message); assert(r == -EAGAIN); } static void test_multicast(void) { _c_cleanup_(b1_peer_unrefp) B1Peer *src = NULL, *dst1 = NULL, *dst2 = NULL; _c_cleanup_(b1_node_freep) B1Node *node1 = NULL, *node2 = NULL; _c_cleanup_(b1_message_unrefp) B1Message *message = NULL; const char *payload = "WOOF"; struct iovec vec = { .iov_base = (void*)payload, .iov_len = strlen(payload) + 1, }; struct iovec *vec_out; size_t n_vec; B1Handle *handles[2], *handle; int r, fd; r = b1_peer_new(&src); assert(r >= 0); r = b1_peer_new(&dst1); assert(r >= 0); r = b1_peer_new(&dst2); assert(r >= 0); r = b1_node_new(dst1, &node1); assert(r >= 0); r = b1_node_new(dst2, &node2); assert(r >= 0); r = b1_handle_transfer(b1_node_get_handle(node1), src, &handles[0]); assert(r >= 0); r = b1_handle_transfer(b1_node_get_handle(node2), src, &handles[1]); assert(r >= 0); r = b1_message_new(src, &message); assert(r >= 0); r = b1_message_set_payload(message, &vec, 1); assert(r >= 0); r = b1_message_set_handles(message, handles, 2); assert(r >= 0); fd = eventfd(0, 0); assert(fd >= 0); r = b1_message_set_fds(message, &fd, 1); assert(r >= 0); assert(close(fd) >= 0); r = b1_message_send(message, handles, 2); assert(r >= 0); message = b1_message_unref(message); assert(!message); handles[0] = b1_handle_unref(handles[0]); assert(!handles[0]); handles[1] = b1_handle_unref(handles[1]); assert(!handles[1]); r = b1_peer_recv(dst1, &message); assert(r >= 0); assert(message); assert(b1_message_get_type(message) == BUS1_MSG_DATA); assert(b1_message_get_destination_node(message) == node1); assert(b1_message_get_uid(message) == getuid()); assert(b1_message_get_gid(message) == getgid()); assert(b1_message_get_pid(message) == getpid()); assert(b1_message_get_tid(message) == c_syscall_gettid()); r = b1_message_get_payload(message, &vec_out, &n_vec); assert(r >= 0); assert(vec_out); assert(n_vec == 1); assert(vec_out->iov_len == strlen("WOOF") + 1); assert(strcmp(vec_out->iov_base, "WOOF") == 0); r = b1_message_get_handle(message, 0, &handle); assert(r >= 0); assert(handle == b1_node_get_handle(node1)); r = b1_message_get_handle(message, 1, &handle); assert(r >= 0); assert(handle); assert(handle != b1_node_get_handle(node1)); r = b1_message_get_fd(message, 0, &fd); assert(r >= 0); assert(fd >= 0); message = b1_message_unref(message); r = b1_peer_recv(dst2, &message); assert(r >= 0); assert(message); assert(b1_message_get_type(message) == BUS1_MSG_DATA); assert(b1_message_get_destination_node(message) == node2); assert(b1_message_get_uid(message) == getuid()); assert(b1_message_get_gid(message) == getgid()); assert(b1_message_get_pid(message) == getpid()); assert(b1_message_get_tid(message) == c_syscall_gettid()); r = b1_message_get_payload(message, &vec_out, &n_vec); assert(r >= 0); assert(vec_out); assert(n_vec == 1); assert(vec_out->iov_len == strlen("WOOF") + 1); assert(strcmp(vec_out->iov_base, "WOOF") == 0); r = b1_message_get_handle(message, 0, &handle); assert(r >= 0); assert(handle); assert(handle != b1_node_get_handle(node2)); r = b1_message_get_handle(message, 1, &handle); assert(r >= 0); assert(handle); assert(handle == b1_node_get_handle(node2)); r = b1_message_get_fd(message, 0, &fd); assert(r >= 0); assert(fd >= 0); message = b1_message_unref(message); r = b1_peer_recv(dst1, &message); assert(r >= 0); assert(message); assert(b1_message_get_type(message) == BUS1_MSG_NODE_RELEASE); assert(b1_message_get_destination_node(message) == node1); assert(b1_message_get_uid(message) == (uid_t)-1); assert(b1_message_get_gid(message) == (gid_t)-1); assert(b1_message_get_pid(message) == 0); assert(b1_message_get_tid(message) == 0); message = b1_message_unref(message); r = b1_peer_recv(dst2, &message); assert(r >= 0); assert(message); assert(b1_message_get_type(message) == BUS1_MSG_NODE_RELEASE); assert(b1_message_get_destination_node(message) == node2); assert(b1_message_get_uid(message) == (uid_t)-1); assert(b1_message_get_gid(message) == (gid_t)-1); assert(b1_message_get_pid(message) == 0); assert(b1_message_get_tid(message) == 0); message = b1_message_unref(message); r = b1_node_destroy(node1); assert(r >= 0); r = b1_peer_recv(dst1, &message); assert(r >= 0); assert(message); assert(b1_message_get_type(message) == BUS1_MSG_NODE_DESTROY); assert(b1_message_get_destination_node(message) == node1); assert(b1_message_get_uid(message) == (uid_t)-1); assert(b1_message_get_gid(message) == (gid_t)-1); assert(b1_message_get_pid(message) == 0); assert(b1_message_get_tid(message) == 0); message = b1_message_unref(message); r = b1_node_destroy(node2); assert(r >= 0); r = b1_peer_recv(dst2, &message); assert(r >= 0); assert(message); assert(b1_message_get_type(message) == BUS1_MSG_NODE_DESTROY); assert(b1_message_get_destination_node(message) == node2); assert(b1_message_get_uid(message) == (uid_t)-1); assert(b1_message_get_gid(message) == (gid_t)-1); assert(b1_message_get_pid(message) == 0); assert(b1_message_get_tid(message) == 0); message = b1_message_unref(message); r = b1_peer_recv(dst1, &message); assert(r == -EAGAIN); r = b1_peer_recv(dst2, &message); assert(r == -EAGAIN); r = b1_peer_recv(src, &message); assert(r == -EAGAIN); } int main(int argc, char **argv) { if (access("/dev/bus1", F_OK) < 0 && errno == ENOENT) return 77; test_peer(); test_node(); test_handle(); test_message(); test_transaction(); test_multicast(); return 0; }
// This test tickled a bug (now fixed) which caused the server to get stuck in // an infinite loop. Kept here to prevent regressions. void test_run_two_tests_node() { test_node(TEST_S2C | TEST_C2S); }
void test_node_meta_test() { test_node(TEST_META); }
void test_run_all_tests_node() { test_node(TEST_S2C | TEST_C2S | TEST_META); }