Annotation of embedaddon/curl/tests/unit/unit1309.c, revision 1.1
1.1 ! misho 1: /***************************************************************************
! 2: * _ _ ____ _
! 3: * Project ___| | | | _ \| |
! 4: * / __| | | | |_) | |
! 5: * | (__| |_| | _ <| |___
! 6: * \___|\___/|_| \_\_____|
! 7: *
! 8: * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
! 9: *
! 10: * This software is licensed as described in the file COPYING, which
! 11: * you should have received as part of this distribution. The terms
! 12: * are also available at https://curl.haxx.se/docs/copyright.html.
! 13: *
! 14: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
! 15: * copies of the Software, and permit persons to whom the Software is
! 16: * furnished to do so, under the terms of the COPYING file.
! 17: *
! 18: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
! 19: * KIND, either express or implied.
! 20: *
! 21: ***************************************************************************/
! 22: #include "curlcheck.h"
! 23:
! 24: #include "splay.h"
! 25: #include "warnless.h"
! 26:
! 27:
! 28: static CURLcode unit_setup(void)
! 29: {
! 30: return CURLE_OK;
! 31: }
! 32:
! 33: static void unit_stop(void)
! 34: {
! 35:
! 36: }
! 37:
! 38: static void splayprint(struct Curl_tree * t, int d, char output)
! 39: {
! 40: struct Curl_tree *node;
! 41: int i;
! 42: int count;
! 43: if(t == NULL)
! 44: return;
! 45:
! 46: splayprint(t->larger, d + 1, output);
! 47: for(i = 0; i<d; i++)
! 48: if(output)
! 49: printf(" ");
! 50:
! 51: if(output) {
! 52: printf("%ld.%ld[%d]", (long)t->key.tv_sec,
! 53: (long)t->key.tv_usec, i);
! 54: }
! 55:
! 56: for(count = 0, node = t->samen; node != t; node = node->samen, count++)
! 57: ;
! 58:
! 59: if(output) {
! 60: if(count)
! 61: printf(" [%d more]\n", count);
! 62: else
! 63: printf("\n");
! 64: }
! 65:
! 66: splayprint(t->smaller, d + 1, output);
! 67: }
! 68:
! 69: UNITTEST_START
! 70:
! 71: /* number of nodes to add to the splay tree */
! 72: #define NUM_NODES 50
! 73:
! 74: struct Curl_tree *root, *removed;
! 75: struct Curl_tree nodes[NUM_NODES*3];
! 76: size_t storage[NUM_NODES*3];
! 77: int rc;
! 78: int i, j;
! 79: struct curltime tv_now = {0, 0};
! 80: root = NULL; /* the empty tree */
! 81:
! 82: /* add nodes */
! 83: for(i = 0; i < NUM_NODES; i++) {
! 84: struct curltime key;
! 85:
! 86: key.tv_sec = 0;
! 87: key.tv_usec = (541*i)%1023;
! 88: storage[i] = key.tv_usec;
! 89: nodes[i].payload = &storage[i];
! 90: root = Curl_splayinsert(key, root, &nodes[i]);
! 91: }
! 92:
! 93: puts("Result:");
! 94: splayprint(root, 0, 1);
! 95:
! 96: for(i = 0; i < NUM_NODES; i++) {
! 97: int rem = (i + 7)%NUM_NODES;
! 98: printf("Tree look:\n");
! 99: splayprint(root, 0, 1);
! 100: printf("remove pointer %d, payload %zu\n", rem,
! 101: *(size_t *)nodes[rem].payload);
! 102: rc = Curl_splayremovebyaddr(root, &nodes[rem], &root);
! 103: if(rc) {
! 104: /* failed! */
! 105: printf("remove %d failed!\n", rem);
! 106: fail("remove");
! 107: }
! 108: }
! 109:
! 110: fail_unless(root == NULL, "tree not empty after removing all nodes");
! 111:
! 112: /* rebuild tree */
! 113: for(i = 0; i < NUM_NODES; i++) {
! 114: struct curltime key;
! 115:
! 116: key.tv_sec = 0;
! 117: key.tv_usec = (541*i)%1023;
! 118:
! 119: /* add some nodes with the same key */
! 120: for(j = 0; j <= i % 3; j++) {
! 121: storage[i * 3 + j] = key.tv_usec*10 + j;
! 122: nodes[i * 3 + j].payload = &storage[i * 3 + j];
! 123: root = Curl_splayinsert(key, root, &nodes[i * 3 + j]);
! 124: }
! 125: }
! 126:
! 127: removed = NULL;
! 128: for(i = 0; i <= 1100; i += 100) {
! 129: printf("Removing nodes not larger than %d\n", i);
! 130: tv_now.tv_usec = i;
! 131: root = Curl_splaygetbest(tv_now, root, &removed);
! 132: while(removed != NULL) {
! 133: printf("removed payload %zu[%zu]\n",
! 134: (*(size_t *)removed->payload) / 10,
! 135: (*(size_t *)removed->payload) % 10);
! 136: root = Curl_splaygetbest(tv_now, root, &removed);
! 137: }
! 138: }
! 139:
! 140: fail_unless(root == NULL, "tree not empty when it should be");
! 141:
! 142: UNITTEST_STOP
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>