aboutsummaryrefslogtreecommitdiff
path: root/tests/unit/unit1305.c
blob: bcf7c43ffcde50c466abee9609d3b8b44579c71d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*****************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 */

#include "test.h"

#ifdef HAVE_SYS_SOCKET_H
#  include <sys/socket.h>
#endif
#ifdef HAVE_NETINET_IN_H
#  include <netinet/in.h>
#endif
#ifdef HAVE_NETDB_H
#  include <netdb.h>
#endif
#ifdef HAVE_ARPA_INET_H
#  include <arpa/inet.h>
#endif

#define ENABLE_CURLX_PRINTF
#include "curlx.h"

#include "hash.h"
#include "hostip.h"
#include "curlcheck.h"

#include "curl_memory.h"
#include "memdebug.h" /* LAST include file */

static struct SessionHandle *data;
static struct curl_hash *hp;
static char *data_key;
static struct Curl_dns_entry *data_node;

static CURLcode unit_setup( void )
{
  data = curl_easy_init();
  if (!data)
    return CURLE_OUT_OF_MEMORY;

  hp = Curl_mk_dnscache();
  if(!hp) {
    curl_easy_cleanup(data);
    curl_global_cleanup();
    return CURLE_OUT_OF_MEMORY;
  }
  return CURLE_OK;
}

static void unit_stop( void )
{
  if (data_node) {
    Curl_freeaddrinfo(data_node->addr);
    free(data_node);
  }
  if (data_key)
    free(data_key);

  Curl_hash_destroy(hp);

  curl_easy_cleanup(data);
  curl_global_cleanup();
}

static Curl_addrinfo *fake_ai(void)
{
    static Curl_addrinfo *ai;
    int ss_size;

    ss_size = sizeof (struct sockaddr_in);

    if((ai = calloc(1, sizeof(Curl_addrinfo))) == NULL)
        return NULL;

    if((ai->ai_canonname = strdup("dummy")) == NULL) {
        free(ai);
        return NULL;
    }

    if((ai->ai_addr = calloc(1, ss_size)) == NULL) {
        free(ai->ai_canonname);
        free(ai);
        return NULL;
    }

    ai->ai_family = AF_INET;
    ai->ai_addrlen = ss_size;

    return ai;
}

static CURLcode create_node(void)
{
    data_key = aprintf("%s:%d", "dummy", 0);
    if (!data_key)
        return CURLE_OUT_OF_MEMORY;

    data_node = calloc(1, sizeof(struct Curl_dns_entry));
    if (!data_node)
        return CURLE_OUT_OF_MEMORY;

    data_node->addr = fake_ai();
    if (!data_node->addr)
        return CURLE_OUT_OF_MEMORY;

    return CURLE_OK;
}


UNITTEST_START

    struct Curl_dns_entry *nodep;
    size_t key_len;

    CURLcode rc = create_node();
    abort_unless(rc == CURLE_OK, "data node creation failed");
    key_len = strlen(data_key);

    nodep = Curl_hash_add(hp, data_key, key_len+1, data_node);
    abort_unless(nodep, "insertion into hash failed");
    /* Freeing will now be done by Curl_hash_destroy */
    data_node = NULL;

    /* To do: test retrieval, deletion, edge conditions */

UNITTEST_STOP