1a38107941725211e7c3f051f7a8f5e12199f03acmaeder/*
aa0ca44e856c87db27e61687cbb630f270976da1Felix Gabriel Mance Authors:
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens Elkner Jakub Hrozek <jhrozek@redhat.com>
aa0ca44e856c87db27e61687cbb630f270976da1Felix Gabriel Mance
aa0ca44e856c87db27e61687cbb630f270976da1Felix Gabriel Mance Copyright (C) 2014 Red Hat
aa0ca44e856c87db27e61687cbb630f270976da1Felix Gabriel Mance
aa0ca44e856c87db27e61687cbb630f270976da1Felix Gabriel Mance SSSD tests: Resolver tests using a fake resolver library
aa0ca44e856c87db27e61687cbb630f270976da1Felix Gabriel Mance
aa0ca44e856c87db27e61687cbb630f270976da1Felix Gabriel Mance This program is free software; you can redistribute it and/or modify
aa0ca44e856c87db27e61687cbb630f270976da1Felix Gabriel Mance it under the terms of the GNU General Public License as published by
1aba43480a797666f400a595193d95ce08b2a059Felix Gabriel Mance the Free Software Foundation; either version 3 of the License, or
aa64389ee694577d9e665cf57331129000072a79Felix Gabriel Mance (at your option) any later version.
aa64389ee694577d9e665cf57331129000072a79Felix Gabriel Mance
aa0ca44e856c87db27e61687cbb630f270976da1Felix Gabriel Mance This program is distributed in the hope that it will be useful,
ad31b4bf8b1394d8ed091857b0dc1027ed1eaa1eFelix Gabriel Mance but WITHOUT ANY WARRANTY; without even the implied warranty of
ad31b4bf8b1394d8ed091857b0dc1027ed1eaa1eFelix Gabriel Mance MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ad31b4bf8b1394d8ed091857b0dc1027ed1eaa1eFelix Gabriel Mance GNU General Public License for more details.
68de80eb2800338cbd16512106fcadab79325d8bChristian Maeder
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski You should have received a copy of the GNU General Public License
dc8c83e9922e4746c192916565f3522418534f3aFelix Gabriel Mance along with this program. If not, see <http://www.gnu.org/licenses/>.
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder*/
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder
ad31b4bf8b1394d8ed091857b0dc1027ed1eaa1eFelix Gabriel Mance#include <talloc.h>
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder#include <tevent.h>
ad31b4bf8b1394d8ed091857b0dc1027ed1eaa1eFelix Gabriel Mance#include <errno.h>
f0af8c7b9b5c576bbfdd54ecb507b904519d9a2aChristian Maeder#include <popt.h>
8601c6f4a4c5486e18cdf9810f832630985989f5Christian Maeder#include <arpa/inet.h>
8601c6f4a4c5486e18cdf9810f832630985989f5Christian Maeder#include <netinet/in.h>
f0af8c7b9b5c576bbfdd54ecb507b904519d9a2aChristian Maeder#include <sys/types.h>
f20c085644aa49702488405bc2d4245cf0e5a713Felix Gabriel Mance#include <stdarg.h>
f20c085644aa49702488405bc2d4245cf0e5a713Felix Gabriel Mance#include <stdlib.h>
5e8db9d910a9fa441c3d4701899841fc8889e011Felix Gabriel Mance
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance#include <resolv.h>
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance
f20c085644aa49702488405bc2d4245cf0e5a713Felix Gabriel Mance#include "resolv/async_resolv.h"
936f8abcf18a6de6f58e8ebbee35c51e1e020c4bChristian Maeder#include "tests/cmocka/common_mock.h"
936f8abcf18a6de6f58e8ebbee35c51e1e020c4bChristian Maeder#include "tests/cmocka/common_mock_resp.h"
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder
ad31b4bf8b1394d8ed091857b0dc1027ed1eaa1eFelix Gabriel Mance#define TEST_BUFSIZE 1024
5e8db9d910a9fa441c3d4701899841fc8889e011Felix Gabriel Mance#define TEST_DEFAULT_TIMEOUT 5
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance#define TEST_SRV_QUERY "_ldap._tcp.sssd.com"
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance
a604cbad8e2202147b5c6bb9f2e06ae61162d654Felix Gabriel Mancestatic TALLOC_CTX *global_mock_context = NULL;
a604cbad8e2202147b5c6bb9f2e06ae61162d654Felix Gabriel Mance
a604cbad8e2202147b5c6bb9f2e06ae61162d654Felix Gabriel Mancestruct srv_rrdata {
a604cbad8e2202147b5c6bb9f2e06ae61162d654Felix Gabriel Mance uint16_t port;
ad31b4bf8b1394d8ed091857b0dc1027ed1eaa1eFelix Gabriel Mance uint16_t prio;
06ccc384615ae5c183262544959ba2a894a0dc80Felix Gabriel Mance uint16_t weight;
ad31b4bf8b1394d8ed091857b0dc1027ed1eaa1eFelix Gabriel Mance uint32_t ttl;
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder const char *hostname;
f853560cb2b56c631af268adec9dd0c1f518ffd8Felix Gabriel Mance};
fb59be47d4ce4feb5398be4f6e77cad3c37c673bChristian Maeder
1a38107941725211e7c3f051f7a8f5e12199f03acmaederstatic ssize_t dns_header(unsigned char **buf, size_t ancount)
d9afc6f8ffafb5297b4cdf5d3c97efba3d24b7faFelix Gabriel Mance{
5e8db9d910a9fa441c3d4701899841fc8889e011Felix Gabriel Mance uint8_t *hb;
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance HEADER h;
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance
a604cbad8e2202147b5c6bb9f2e06ae61162d654Felix Gabriel Mance hb = *buf;
a604cbad8e2202147b5c6bb9f2e06ae61162d654Felix Gabriel Mance memset(hb, 0, NS_HFIXEDSZ);
a604cbad8e2202147b5c6bb9f2e06ae61162d654Felix Gabriel Mance memset(&h, 0, sizeof(h));
22a0bc45b22397199459c4b56e0e770f44a0f34aFelix Gabriel Mance
a604cbad8e2202147b5c6bb9f2e06ae61162d654Felix Gabriel Mance h.id = res_randomid(); /* random query ID */
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder h.qr = 1; /* response flag */
ad31b4bf8b1394d8ed091857b0dc1027ed1eaa1eFelix Gabriel Mance h.rd = 1; /* recursion desired */
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance h.ra = 1; /* resursion available */
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance
06ccc384615ae5c183262544959ba2a894a0dc80Felix Gabriel Mance h.qdcount = htons(1); /* no. of questions */
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder h.ancount = htons(ancount); /* no. of answers */
ad31b4bf8b1394d8ed091857b0dc1027ed1eaa1eFelix Gabriel Mance h.arcount = htons(0); /* no. of add'tl records */
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance memcpy(hb, &h, sizeof(h));
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance
0b4abe255a45398b8451bf5df821277c3cbbfc01Felix Gabriel Mance hb += NS_HFIXEDSZ; /* move past the header */
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder *buf = hb;
0b4abe255a45398b8451bf5df821277c3cbbfc01Felix Gabriel Mance
0b4abe255a45398b8451bf5df821277c3cbbfc01Felix Gabriel Mance return NS_HFIXEDSZ;
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder}
0b4abe255a45398b8451bf5df821277c3cbbfc01Felix Gabriel Mance
cb1375e6805fbe42b931c54dcc37674193443267Christian Maederstatic ssize_t dns_question(const char *question,
e40758c36e3e5312669558ad189b24b3eaf10c59Mihai Codescu uint16_t type,
e40758c36e3e5312669558ad189b24b3eaf10c59Mihai Codescu uint8_t **question_ptr,
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder size_t remaining)
0b4abe255a45398b8451bf5df821277c3cbbfc01Felix Gabriel Mance{
e40758c36e3e5312669558ad189b24b3eaf10c59Mihai Codescu unsigned char *qb = *question_ptr;
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder int n;
e40758c36e3e5312669558ad189b24b3eaf10c59Mihai Codescu
e40758c36e3e5312669558ad189b24b3eaf10c59Mihai Codescu n = ns_name_compress(question, qb, remaining, NULL, NULL);
e40758c36e3e5312669558ad189b24b3eaf10c59Mihai Codescu assert_true(n > 0);
e40758c36e3e5312669558ad189b24b3eaf10c59Mihai Codescu
e40758c36e3e5312669558ad189b24b3eaf10c59Mihai Codescu qb += n;
b8638f32115f48a8871eb6f3042a540d2526cd0aChristian Maeder remaining -= n;
7852de3551fc797566ee71165bafe05b6d81728cnotanartist
b8638f32115f48a8871eb6f3042a540d2526cd0aChristian Maeder NS_PUT16(type, qb);
b8638f32115f48a8871eb6f3042a540d2526cd0aChristian Maeder NS_PUT16(ns_c_in, qb);
b8638f32115f48a8871eb6f3042a540d2526cd0aChristian Maeder
b8638f32115f48a8871eb6f3042a540d2526cd0aChristian Maeder *question_ptr = qb;
0b4abe255a45398b8451bf5df821277c3cbbfc01Felix Gabriel Mance return n + 2 * sizeof(uint16_t);
0b4abe255a45398b8451bf5df821277c3cbbfc01Felix Gabriel Mance}
0b4abe255a45398b8451bf5df821277c3cbbfc01Felix Gabriel Mance
668c9c725a11c0f77057152148570af853a1bc0dFelix Gabriel Mancestatic ssize_t add_rr_common(uint16_t type,
668c9c725a11c0f77057152148570af853a1bc0dFelix Gabriel Mance uint32_t ttl,
668c9c725a11c0f77057152148570af853a1bc0dFelix Gabriel Mance size_t rdata_size,
68de80eb2800338cbd16512106fcadab79325d8bChristian Maeder const char *key,
68de80eb2800338cbd16512106fcadab79325d8bChristian Maeder size_t remaining,
0b4abe255a45398b8451bf5df821277c3cbbfc01Felix Gabriel Mance uint8_t **rdata_ptr)
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance{
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance uint8_t *rd = *rdata_ptr;
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance ssize_t written = 0;
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance written = ns_name_compress(key, rd, remaining, NULL, NULL);
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder assert_int_not_equal(written, -1);
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance rd += written;
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance remaining -= written;
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance assert_true(remaining > 3 * sizeof(uint16_t) + sizeof(uint32_t));
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder NS_PUT16(type, rd);
61c1a9c658ddc79ef33b01c14ee8cf5039430dd8Felix Gabriel Mance NS_PUT16(ns_c_in, rd);
61c1a9c658ddc79ef33b01c14ee8cf5039430dd8Felix Gabriel Mance NS_PUT32(ttl, rd);
61c1a9c658ddc79ef33b01c14ee8cf5039430dd8Felix Gabriel Mance NS_PUT16(rdata_size, rd);
232612893bf5b1832ab4ef6dd120714b0a29d131Christian Maeder
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski assert_true(remaining > rdata_size);
0b4abe255a45398b8451bf5df821277c3cbbfc01Felix Gabriel Mance *rdata_ptr = rd;
06ccc384615ae5c183262544959ba2a894a0dc80Felix Gabriel Mance return written + 3 * sizeof(uint16_t) + sizeof(uint32_t) + rdata_size;
232612893bf5b1832ab4ef6dd120714b0a29d131Christian Maeder}
06ccc384615ae5c183262544959ba2a894a0dc80Felix Gabriel Mance
81ec673ac5ab1493568d9ef7798b752ab8ee0e61Felix Gabriel Mancestatic ssize_t add_srv_rr(struct srv_rrdata *rr,
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowski const char *question,
544989bc1f6ed4bc0813334ffd934db0fb0010eaFelix Gabriel Mance uint8_t *answer,
06ccc384615ae5c183262544959ba2a894a0dc80Felix Gabriel Mance size_t anslen)
06ccc384615ae5c183262544959ba2a894a0dc80Felix Gabriel Mance{
06ccc384615ae5c183262544959ba2a894a0dc80Felix Gabriel Mance uint8_t *a = answer;
c41f2d65ecbf5ad9d3233a21f406a7698338a04bFelix Gabriel Mance ssize_t resp_size;
ad31b4bf8b1394d8ed091857b0dc1027ed1eaa1eFelix Gabriel Mance size_t rdata_size;
f008d37d7fd3b2394a717ac3561f5f1982bb0b28Felix Gabriel Mance unsigned char hostname_compressed[MAXDNAME];
f008d37d7fd3b2394a717ac3561f5f1982bb0b28Felix Gabriel Mance ssize_t compressed_len;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder rdata_size = 3 * sizeof(uint16_t);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder /* Prepare the data to write */
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder compressed_len = ns_name_compress(rr->hostname,
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder hostname_compressed, MAXDNAME,
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder NULL, NULL);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder assert_int_not_equal(compressed_len, -1);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder rdata_size += compressed_len;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder resp_size = add_rr_common(ns_t_srv, rr->ttl, rdata_size,
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder question, anslen, &a);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
7852de3551fc797566ee71165bafe05b6d81728cnotanartist NS_PUT16(rr->prio, a);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder NS_PUT16(rr->weight, a);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder NS_PUT16(rr->port, a);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder memcpy(a, hostname_compressed, compressed_len);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartist return resp_size;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder}
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartistunsigned char *create_srv_buffer(TALLOC_CTX *mem_ctx,
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder const char *question,
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder struct srv_rrdata *rrs,
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartist size_t n_rrs,
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder size_t *_buflen)
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder{
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder unsigned char *buf;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder unsigned char *buf_head;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder ssize_t len;
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartist ssize_t i;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder ssize_t total = 0;
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartist
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartist buf = talloc_zero_array(mem_ctx, unsigned char, TEST_BUFSIZE);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder assert_non_null(buf);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder buf_head = buf;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder len = dns_header(&buf, n_rrs);
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartist assert_true(len > 0);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder total += len;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder len = dns_question(question, ns_t_srv, &buf, TEST_BUFSIZE - total);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder assert_true(len > 0);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder total += len;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartist /* answer */
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder for (i = 0; i < n_rrs; i++) {
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder len = add_srv_rr(&rrs[i], question, buf, TEST_BUFSIZE - total);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder assert_true(len > 0);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder total += len;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder buf += len;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder }
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder *_buflen = total;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder return buf_head;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder}
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maederstruct fake_ares_query {
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder int status;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder int timeouts;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder unsigned char *abuf;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder int alen;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder};
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartist
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maedervoid mock_ares_query(int status, int timeouts, unsigned char *abuf, int alen)
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder{
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder will_return(__wrap_ares_query, status);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder will_return(__wrap_ares_query, timeouts);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder will_return(__wrap_ares_query, abuf);
7852de3551fc797566ee71165bafe05b6d81728cnotanartist will_return(__wrap_ares_query, alen);
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartist}
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maedervoid __wrap_ares_query(ares_channel channel, const char *name, int dnsclass,
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartist int type, ares_callback callback, void *arg)
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder{
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartist struct fake_ares_query query;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder query.status = sss_mock_type(int);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder query.timeouts = sss_mock_type(int);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder query.abuf = sss_mock_ptr_type(unsigned char *);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder query.alen = sss_mock_type(int);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartist callback(arg, query.status, query.timeouts, query.abuf, query.alen);
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder}
47589c2d80dabefc0cd8e2ee5e7331e3db677c68notanartist
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder/* The unit test */
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maederstruct resolv_fake_ctx {
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder struct resolv_ctx *resolv;
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder struct sss_test_ctx *ctx;
};
static int test_resolv_fake_setup(void **state)
{
struct resolv_fake_ctx *test_ctx;
int ret;
assert_true(leak_check_setup());
global_mock_context = talloc_new(global_talloc_context);
assert_non_null(global_mock_context);
test_ctx = talloc_zero(global_mock_context,
struct resolv_fake_ctx);
assert_non_null(test_ctx);
test_ctx->ctx = create_ev_test_ctx(test_ctx);
assert_non_null(test_ctx->ctx);
ret = resolv_init(test_ctx, test_ctx->ctx->ev,
TEST_DEFAULT_TIMEOUT, &test_ctx->resolv);
assert_int_equal(ret, EOK);
*state = test_ctx;
return 0;
}
static int test_resolv_fake_teardown(void **state)
{
struct resolv_fake_ctx *test_ctx =
talloc_get_type(*state, struct resolv_fake_ctx);
talloc_free(test_ctx);
talloc_free(global_mock_context);
assert_true(leak_check_teardown());
return 0;
}
void test_resolv_fake_srv_done(struct tevent_req *req)
{
errno_t ret;
TALLOC_CTX *tmp_ctx;
int status;
uint32_t ttl;
struct ares_srv_reply *srv_replies = NULL;
struct resolv_fake_ctx *test_ctx =
tevent_req_callback_data(req, struct resolv_fake_ctx);
tmp_ctx = talloc_new(test_ctx);
assert_non_null(tmp_ctx);
ret = resolv_getsrv_recv(tmp_ctx, req, &status, NULL,
&srv_replies, &ttl);
assert_int_equal(ret, EOK);
assert_non_null(srv_replies);
assert_int_equal(srv_replies->priority, 1);
assert_int_equal(srv_replies->weight, 40);
assert_int_equal(srv_replies->port, 389);
assert_string_equal(srv_replies->host, "ldap.sssd.com");
srv_replies = srv_replies->next;
assert_non_null(srv_replies);
assert_int_equal(srv_replies->priority, 1);
assert_int_equal(srv_replies->weight, 60);
assert_int_equal(srv_replies->port, 389);
assert_string_equal(srv_replies->host, "ldap2.sssd.com");
srv_replies = srv_replies->next;
assert_null(srv_replies);
assert_int_equal(ttl, 500);
talloc_free(tmp_ctx);
test_ev_done(test_ctx->ctx, EOK);
}
void test_resolv_fake_srv(void **state)
{
int ret;
struct tevent_req *req;
struct resolv_fake_ctx *test_ctx =
talloc_get_type(*state, struct resolv_fake_ctx);
unsigned char *buf;
size_t buflen;
struct srv_rrdata rr[2];
rr[0].prio = 1;
rr[0].port = 389;
rr[0].weight = 40;
rr[0].ttl = 600;
rr[0].hostname = "ldap.sssd.com";
rr[1].prio = 1;
rr[1].port = 389;
rr[1].weight = 60;
rr[1].ttl = 500;
rr[1].hostname = "ldap2.sssd.com";
buf = create_srv_buffer(test_ctx, TEST_SRV_QUERY, rr, 2, &buflen);
assert_non_null(buf);
mock_ares_query(0, 0, buf, buflen);
req = resolv_getsrv_send(test_ctx, test_ctx->ctx->ev,
test_ctx->resolv, TEST_SRV_QUERY);
assert_non_null(req);
tevent_req_set_callback(req, test_resolv_fake_srv_done, test_ctx);
ret = test_ev_loop(test_ctx->ctx);
assert_int_equal(ret, ERR_OK);
}
void test_resolv_is_address(void **state)
{
bool ret;
ret = resolv_is_address("10.192.211.37");
assert_true(ret);
ret = resolv_is_address("127.0.0.1");
assert_true(ret);
ret = resolv_is_address("2001:0db8:85a3:0000:0000:8a2e:0370:7334");
assert_true(ret);
ret = resolv_is_address("sssd.ldap.com");
assert_false(ret);
ret = resolv_is_address("testhostname");
assert_false(ret);
ret = resolv_is_address("localhost");
assert_false(ret);
}
int main(int argc, const char *argv[])
{
int rv;
poptContext pc;
int opt;
struct poptOption long_options[] = {
POPT_AUTOHELP
SSSD_DEBUG_OPTS
POPT_TABLEEND
};
const struct CMUnitTest tests[] = {
cmocka_unit_test_setup_teardown(test_resolv_fake_srv,
test_resolv_fake_setup,
test_resolv_fake_teardown),
cmocka_unit_test(test_resolv_is_address),
};
/* Set debug level to invalid value so we can deside if -d 0 was used. */
debug_level = SSSDBG_INVALID;
pc = poptGetContext(argv[0], argc, argv, long_options, 0);
while((opt = poptGetNextOpt(pc)) != -1) {
switch(opt) {
default:
fprintf(stderr, "\nInvalid option %s: %s\n\n",
poptBadOption(pc, 0), poptStrerror(opt));
poptPrintUsage(pc, stderr, 0);
return 1;
}
}
poptFreeContext(pc);
DEBUG_CLI_INIT(debug_level);
/* Even though normally the tests should clean up after themselves
* they might not after a failed run. Remove the old db to be sure */
tests_set_cwd();
rv = cmocka_run_group_tests(tests, NULL, NULL);
return rv;
}