/*
 * Copyright 2007 Hans Leidekker
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include <stdio.h>

#include <wine/test.h>

#include <windef.h>
#include <snmp.h>

static INT  (WINAPI *pSnmpUtilAsnAnyCpy)(AsnAny*, AsnAny*);
static VOID (WINAPI *pSnmpUtilAsnAnyFree)(AsnAny*);
static INT  (WINAPI *pSnmpUtilOctetsCmp)(AsnOctetString*, AsnOctetString*);
static INT  (WINAPI *pSnmpUtilOctetsCpy)(AsnOctetString*, AsnOctetString*);
static VOID (WINAPI *pSnmpUtilOctetsFree)(AsnOctetString*);
static INT  (WINAPI *pSnmpUtilOctetsNCmp)(AsnOctetString*, AsnOctetString*, UINT);

static void InitFunctionPtrs(void)
{
    HMODULE hSnmpapi = GetModuleHandleA("snmpapi.dll");

#define SNMPAPI_GET_PROC(func) \
    p ## func = (void*)GetProcAddress(hSnmpapi, #func); \
    if(!p ## func) \
      trace("GetProcAddress(%s) failed\n", #func);

    SNMPAPI_GET_PROC(SnmpUtilAsnAnyCpy)
    SNMPAPI_GET_PROC(SnmpUtilAsnAnyFree)
    SNMPAPI_GET_PROC(SnmpUtilOctetsCmp)
    SNMPAPI_GET_PROC(SnmpUtilOctetsCpy)
    SNMPAPI_GET_PROC(SnmpUtilOctetsFree)
    SNMPAPI_GET_PROC(SnmpUtilOctetsNCmp)

#undef SNMPAPI_GET_PROC
}

static void test_SnmpUtilOidToA(void)
{
    LPSTR ret;
    static UINT ids1[] = { 1,3,6,1,4,1,311 };
    static UINT ids2[] = {
          1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
          1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
          1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
          1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
          1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
          1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
          1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
          1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
          1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 };
    static UINT ids3[] = { 0xffffffff };
    static AsnObjectIdentifier oid0 = { 0, ids1 };
    static AsnObjectIdentifier oid1 = { 7, ids1 };
    static AsnObjectIdentifier oid2 = { 256, ids2 };
    static AsnObjectIdentifier oid3 = { 257, ids2 };
    static AsnObjectIdentifier oid4 = { 258, ids2 };
    static AsnObjectIdentifier oid5 = { 1, ids3 };
    static const char expect0[] = "<null oid>";
    static const char expect0_alt[] = "NUL";
    static const char expect1[] = "1.3.6.1.4.1.311";
    static const char expect2[] =
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1";
    static const char expect3[] =
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1";
    static const char expect3_alt[] =
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
        "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1";
    static const char expect4[] = "-1";

    /* This crashes under win98 */
    if(0)
    {
        ret = SnmpUtilOidToA(NULL);
        ok(ret != NULL, "SnmpUtilOidToA failed\n");
        ok(!strcmp(ret, expect0), "SnmpUtilOidToA failed got\n%s\n expected\n%s\n",
           ret, expect1);
    }

    ret = SnmpUtilOidToA(&oid0);
    ok(ret != NULL, "SnmpUtilOidToA failed\n");
    ok(!strcmp(ret, expect0) ||
       broken(!strcmp(ret, expect0_alt)), /* Win98, WinMe, NT4 */
       "SnmpUtilOidToA failed got\n%s\n expected\n%s\n",
       ret, expect0);

    ret = SnmpUtilOidToA(&oid1);
    ok(ret != NULL, "SnmpUtilOidToA failed\n");
    ok(!strcmp(ret, expect1), "SnmpUtilOidToA failed got\n%s\n expected\n%s\n",
       ret, expect1);

    ret = SnmpUtilOidToA(&oid2);
    ok(ret != NULL, "SnmpUtilOidToA failed\n");
    ok(!strcmp(ret, expect2), "SnmpUtilOidToA failed got\n%s\n expected\n%s\n",
       ret, expect2);

    ret = SnmpUtilOidToA(&oid3);
    ok(ret != NULL, "SnmpUtilOidToA failed\n");
    ok(!strcmp(ret, expect3), "SnmpUtilOidToA failed got\n%s\n expected\n%s\n",
       ret, expect3);

    ret = SnmpUtilOidToA(&oid4);
    ok(ret != NULL, "SnmpUtilOidToA failed\n");
    ok(!strcmp(ret, expect3) ||
       broken(!strcmp(ret, expect3_alt)), /* Win98, WinMe, NT4 */
       "SnmpUtilOidToA failed got\n%s\n expected\n%s\n",
       ret, expect3);

    ret = SnmpUtilOidToA(&oid5);
    ok(ret != NULL, "SnmpUtilOidToA failed\n");
    ok(!strcmp(ret, expect4), "SnmpUtilOidToA failed got\n%s\n expected\n%s\n",
       ret, expect4);
}

static void test_SnmpUtilAsnAnyCpyFree(void)
{
    INT ret;
    static AsnAny dst, src = { ASN_INTEGER, { 1 } };

    if (0) { /* these crash on XP */
    ret = pSnmpUtilAsnAnyCpy(NULL, NULL);
    ok(!ret, "SnmpUtilAsnAnyCpy succeeded\n");

    ret = pSnmpUtilAsnAnyCpy(&dst, NULL);
    ok(!ret, "SnmpUtilAsnAnyCpy succeeded\n");

    ret = pSnmpUtilAsnAnyCpy(NULL, &src);
    ok(!ret, "SnmpUtilAsnAnyCpy succeeded\n");
    }

    ret = pSnmpUtilAsnAnyCpy(&dst, &src);
    ok(ret, "SnmpUtilAsnAnyCpy failed\n");
    ok(!memcmp(&src, &dst, sizeof(AsnAny)), "SnmpUtilAsnAnyCpy failed\n");

    if (0) { /* crashes on XP */
    pSnmpUtilAsnAnyFree(NULL);
    }
    pSnmpUtilAsnAnyFree(&dst);
    ok(dst.asnType == ASN_NULL, "SnmpUtilAsnAnyFree failed\n");
    ok(dst.asnValue.number == 1, "SnmpUtilAsnAnyFree failed\n");
}

static void test_SnmpUtilOctetsCpyFree(void)
{
    INT ret;
    static BYTE stream[] = { '1', '2', '3', '4' };
    static AsnOctetString dst, src = { stream, 4, TRUE };

    ret = pSnmpUtilOctetsCpy(NULL, NULL);
    ok(!ret, "SnmpUtilOctetsCpy succeeded\n");

    memset(&dst, 1, sizeof(AsnOctetString));
    ret = pSnmpUtilOctetsCpy(&dst, NULL);
    ok(ret, "SnmpUtilOctetsCpy failed\n");
    ok(dst.length == 0, "SnmpUtilOctetsCpy failed\n");
    ok(dst.stream == NULL, "SnmpUtilOctetsCpy failed\n");
    ok(dst.dynamic == FALSE, "SnmpUtilOctetsCpy failed\n");

    ret = pSnmpUtilOctetsCpy(NULL, &src);
    ok(!ret, "SnmpUtilOctetsCpy succeeded\n");

    memset(&dst, 0, sizeof(AsnOctetString));
    ret = pSnmpUtilOctetsCpy(&dst, &src);
    ok(ret, "SnmpUtilOctetsCpy failed\n");
    ok(src.length == dst.length, "SnmpUtilOctetsCpy failed\n");
    ok(!memcmp(src.stream, dst.stream, dst.length), "SnmpUtilOctetsCpy failed\n");
    ok(dst.dynamic == TRUE, "SnmpUtilOctetsCpy failed\n");

    pSnmpUtilOctetsFree(NULL);
    pSnmpUtilOctetsFree(&dst);
    ok(dst.stream == NULL, "SnmpUtilOctetsFree failed\n");
    ok(dst.length == 0, "SnmpUtilOctetsFree failed\n");
    ok(dst.dynamic == FALSE, "SnmpUtilOctetsFree failed\n");
}

static void test_SnmpUtilOidCpyFree(void)
{
    INT ret;
    static UINT ids[] = { 1, 3, 6, 1, 4, 1, 311 };
    static AsnObjectIdentifier dst, src = { sizeof(ids) / sizeof(ids[0]), ids };

    /* These crashes under win98 */
    if(0)
    {
        ret = SnmpUtilOidCpy(NULL, NULL);
        ok(!ret, "SnmpUtilOidCpy succeeded\n");

        memset(&dst, 1, sizeof(AsnObjectIdentifier));
        ret = SnmpUtilOidCpy(&dst, NULL);
        ok(ret, "SnmpUtilOidCpy failed\n");
        ok(dst.idLength == 0, "SnmpUtilOidCpy failed\n");
        ok(dst.ids == NULL, "SnmpUtilOidCpy failed\n");

        ret = SnmpUtilOidCpy(NULL, &src);
        ok(!ret, "SnmpUtilOidCpy succeeded\n");
    }

    memset(&dst, 0, sizeof(AsnObjectIdentifier));
    ret = SnmpUtilOidCpy(&dst, &src);
    ok(ret, "SnmpUtilOidCpy failed\n");
    ok(src.idLength == dst.idLength, "SnmpUtilOidCpy failed\n");
    ok(!memcmp(src.ids, dst.ids, dst.idLength * sizeof(UINT)), "SnmpUtilOidCpy failed\n");
    SnmpUtilOidFree(&dst);

    /* These crashes under win98 */
    if(0)
    {
        ret = SnmpUtilOidCpy(NULL, NULL);
        ok(!ret, "SnmpUtilOidCpy succeeded\n");

        memset(&dst, 1, sizeof(AsnObjectIdentifier));
        ret = SnmpUtilOidCpy(&dst, NULL);
        ok(ret, "SnmpUtilOidCpy failed\n");
        ok(dst.idLength == 0, "SnmpUtilOidCpy failed\n");
        ok(dst.ids == NULL, "SnmpUtilOidCpy failed\n");

        ret = SnmpUtilOidCpy(NULL, &src);
        ok(!ret, "SnmpUtilOidCpy succeeded\n");
    }

    memset(&dst, 0, sizeof(AsnObjectIdentifier));
    ret = SnmpUtilOidCpy(&dst, &src);
    ok(ret, "SnmpUtilOidCpy failed\n");
    ok(src.idLength == dst.idLength, "SnmpUtilOidCpy failed\n");
    ok(!memcmp(src.ids, dst.ids, dst.idLength * sizeof(UINT)), "SnmpUtilOidCpy failed\n");

    /* This crashes under win98 */
    if(0)
    {
        SnmpUtilOidFree(NULL);
    }
    SnmpUtilOidFree(&dst);
    ok(dst.idLength == 0, "SnmpUtilOidFree failed\n");
    ok(dst.ids == NULL, "SnmpUtilOidFree failed\n");
}

static void test_SnmpUtilOctetsNCmp(void)
{
    INT ret;
    static BYTE stream1[] = { '1', '2', '3', '4' };
    static BYTE stream2[] = { '5', '6', '7', '8' };
    static AsnOctetString octets1 = { stream1, 4, FALSE };
    static AsnOctetString octets2 = { stream2, 4, FALSE };

    ret = pSnmpUtilOctetsNCmp(NULL, NULL, 0);
    ok(!ret, "SnmpUtilOctetsNCmp succeeded\n");

    ret = pSnmpUtilOctetsNCmp(NULL, NULL, 1);
    ok(!ret, "SnmpUtilOctetsNCmp succeeded\n");

    ret = pSnmpUtilOctetsNCmp(&octets1, NULL, 0);
    ok(!ret, "SnmpUtilOctetsNCmp succeeded\n");

    ret = pSnmpUtilOctetsNCmp(&octets1, NULL, 1);
    ok(!ret, "SnmpUtilOctetsNCmp succeeded\n");

    ret = pSnmpUtilOctetsNCmp(NULL, &octets2, 0);
    ok(!ret, "SnmpUtilOctetsNCmp succeeded\n");

    ret = pSnmpUtilOctetsNCmp(NULL, &octets2, 1);
    ok(!ret, "SnmpUtilOctetsNCmp succeeded\n");

    ret = pSnmpUtilOctetsNCmp(&octets1, &octets1, 0);
    ok(!ret, "SnmpUtilOctetsNCmp failed\n");

    ret = pSnmpUtilOctetsNCmp(&octets1, &octets1, 4);
    ok(!ret, "SnmpUtilOctetsNCmp failed\n");

    ret = pSnmpUtilOctetsNCmp(&octets1, &octets2, 4);
    ok(ret == -4, "SnmpUtilOctetsNCmp failed\n");

    ret = pSnmpUtilOctetsNCmp(&octets2, &octets1, 4);
    ok(ret == 4, "SnmpUtilOctetsNCmp failed\n");
}

static void test_SnmpUtilOctetsCmp(void)
{
    INT ret;
    static BYTE stream1[] = { '1', '2', '3' };
    static BYTE stream2[] = { '1', '2', '3', '4' };
    static AsnOctetString octets1 = { stream1, 3, FALSE };
    static AsnOctetString octets2 = { stream2, 4, FALSE };

    if (0) { /* these crash on XP */
    ret = pSnmpUtilOctetsCmp(NULL, NULL);
    ok(!ret, "SnmpUtilOctetsCmp succeeded\n");

    ret = pSnmpUtilOctetsCmp(&octets1, NULL);
    ok(!ret, "SnmpUtilOctetsCmp succeeded\n");

    ret = pSnmpUtilOctetsCmp(NULL, &octets2);
    ok(!ret, "SnmpUtilOctetsCmp succeeded\n");
    }

    ret = pSnmpUtilOctetsCmp(&octets2, &octets1);
    ok(ret == 1, "SnmpUtilOctetsCmp failed\n");

    ret = pSnmpUtilOctetsCmp(&octets1, &octets2);
    ok(ret < 0, "SnmpUtilOctetsCmp failed\n");
}

static void test_SnmpUtilOidNCmp(void)
{
    INT ret;
    static UINT ids1[] = { 1, 2, 3, 4 };
    static UINT ids2[] = { 5, 6, 7, 8 };
    static AsnObjectIdentifier oid1 = { 4, ids1 };
    static AsnObjectIdentifier oid2 = { 4, ids2 };

    /* This crashes under win98 */
    if(0)
    {
        ret = SnmpUtilOidNCmp(NULL, NULL, 0);
        ok(!ret, "SnmpUtilOidNCmp succeeded\n");

        ret = SnmpUtilOidNCmp(NULL, NULL, 1);
        ok(!ret, "SnmpUtilOidNCmp succeeded\n");

        ret = SnmpUtilOidNCmp(&oid1, NULL, 0);
        ok(!ret, "SnmpUtilOidNCmp succeeded\n");

        ret = SnmpUtilOidNCmp(&oid1, NULL, 1);
        ok(!ret, "SnmpUtilOidNCmp succeeded\n");

        ret = SnmpUtilOidNCmp(NULL, &oid2, 0);
        ok(!ret, "SnmpUtilOidNCmp succeeded\n");

        ret = SnmpUtilOidNCmp(NULL, &oid2, 1);
        ok(!ret, "SnmpUtilOidNCmp succeeded\n");
    }

    ret = SnmpUtilOidNCmp(&oid1, &oid1, 0);
    ok(!ret, "SnmpUtilOidNCmp failed\n");

    ret = SnmpUtilOidNCmp(&oid1, &oid1, 4);
    ok(!ret, "SnmpUtilOidNCmp failed\n");

    ret = SnmpUtilOidNCmp(&oid1, &oid2, 4);
    ok(ret < 0, "SnmpUtilOidNCmp failed: %d\n", ret);

    ret = SnmpUtilOidNCmp(&oid2, &oid1, 4);
    ok(ret > 0, "SnmpUtilOidNCmp failed: %d\n", ret);

    oid1.idLength = 3;
    memcpy(oid1.ids, oid2.ids, sizeof(UINT) * 4);
    ret = SnmpUtilOidNCmp(&oid1, &oid1, 4);
    ok(!ret, "SnmpUtilOidNCmp failed: %d\n", ret);
    ret = SnmpUtilOidNCmp(&oid2, &oid1, 4);
    ok(ret > 0, "SnmpUtilOidNCmp failed: %d\n", ret);
    ret = SnmpUtilOidNCmp(&oid1, &oid2, 4);
    ok(ret < 0, "SnmpUtilOidNCmp failed: %d\n", ret);

    ret = SnmpUtilOidNCmp(&oid1, &oid2, 2);
    ok(!ret, "SnmpUtilOidNCmp failed: %d\n", ret);
    ret = SnmpUtilOidNCmp(&oid2, &oid1, 2);
    ok(!ret, "SnmpUtilOidNCmp failed: %d\n", ret);
}

static void test_SnmpUtilOidCmp(void)
{
    INT ret;
    static UINT ids1[] = { 1, 2, 3 };
    static UINT ids2[] = { 1, 2, 3, 4 };
    static AsnObjectIdentifier oid1 = { 3, ids1 };
    static AsnObjectIdentifier oid2 = { 4, ids2 };

    if (0) { /* these crash on XP */
    ret = SnmpUtilOidCmp(NULL, NULL);
    ok(!ret, "SnmpUtilOidCmp succeeded\n");

    ret = SnmpUtilOidCmp(&oid1, NULL);
    ok(!ret, "SnmpUtilOidCmp succeeded\n");

    ret = SnmpUtilOidCmp(NULL, &oid2);
    ok(!ret, "SnmpUtilOidCmp succeeded\n");
    }

    ret = SnmpUtilOidCmp(&oid2, &oid1);
    ok(ret > 0, "SnmpUtilOidCmp failed\n");

    ret = SnmpUtilOidCmp(&oid1, &oid2);
    ok(ret < 0, "SnmpUtilOidCmp failed\n");
}

static void test_SnmpUtilOidAppend(void)
{
    INT ret;
    UINT *ids1;
    static UINT ids2[] = { 4, 5, 6 };
    static AsnObjectIdentifier oid1;
    static AsnObjectIdentifier oid2 = { 3, ids2 };

    ids1 = SnmpUtilMemAlloc(3 * sizeof(UINT));
    ids1[0] = 1;
    ids1[1] = 2;
    ids1[2] = 3;

    oid1.idLength = 3;
    oid1.ids = ids1;

    /* This crashes under win98 */
    if(0)
    {
        ret = SnmpUtilOidAppend(NULL, NULL);
        ok(!ret, "SnmpUtilOidAppend succeeded\n");

        ret = SnmpUtilOidAppend(&oid1, NULL);
        ok(ret, "SnmpUtilOidAppend failed\n");

        ret = SnmpUtilOidAppend(NULL, &oid2);
        ok(!ret, "SnmpUtilOidAppend succeeded\n");
    }

    ret = SnmpUtilOidAppend(&oid1, &oid2);
    ok(ret, "SnmpUtilOidAppend failed\n");
    ok(oid1.idLength == 6, "SnmpUtilOidAppend failed\n");
    ok(!memcmp(&oid1.ids[3], ids2, 3 * sizeof(UINT)),
       "SnmpUtilOidAppend failed\n");

    SnmpUtilOidFree(&oid1);
}

static void test_SnmpUtilVarBindCpyFree(void)
{
    INT ret;
    static UINT ids[] = { 1, 3, 6, 1, 4, 1, 311 };
    static SnmpVarBind dst, src = { { 7, ids }, { ASN_INTEGER, { 1 } } };

    /* This crashes under win98 */
    if(0)
    {
        ret = SnmpUtilVarBindCpy(NULL, NULL);
        ok(!ret, "SnmpUtilVarBindCpy succeeded\n");

        memset(&dst, 0, sizeof(SnmpVarBind));
        ret = SnmpUtilVarBindCpy(&dst, NULL);
        ok(ret, "SnmpUtilVarBindCpy failed\n");
        ok(dst.name.idLength == 0, "SnmpUtilVarBindCpy failed\n");
        ok(dst.name.ids == NULL, "SnmpUtilVarBindCpy failed\n");
        ok(dst.value.asnType == ASN_NULL, "SnmpUtilVarBindCpy failed\n");
        ok(dst.value.asnValue.number == 0, "SnmpUtilVarBindCpy failed\n");

        ret = SnmpUtilVarBindCpy(NULL, &src);
        ok(!ret, "SnmpUtilVarBindCpy succeeded\n");
    }

    memset(&dst, 0, sizeof(SnmpVarBind));
    ret = SnmpUtilVarBindCpy(&dst, &src);
    ok(ret, "SnmpUtilVarBindCpy failed\n");
    ok(src.name.idLength == dst.name.idLength, "SnmpUtilVarBindCpy failed\n");
    ok(!memcmp(src.name.ids, dst.name.ids, dst.name.idLength * sizeof(UINT)),
       "SnmpUtilVarBindCpy failed\n");
    ok(!memcmp(&src.value, &dst.value, sizeof(AsnObjectSyntax)),
       "SnmpUtilVarBindCpy failed\n");

    /* This crashes under win98 */
    if(0)
    {
        SnmpUtilVarBindFree(NULL);
    }
    SnmpUtilVarBindFree(&dst);
    ok(dst.name.idLength == 0, "SnmpUtilVarBindFree failed\n");
    ok(dst.name.ids == NULL, "SnmpUtilVarBindFree failed\n");
    ok(dst.value.asnType == ASN_NULL, "SnmpUtilVarBindFree failed\n");
    ok(dst.value.asnValue.number == 1, "SnmpUtilVarBindFree failed\n");
}

static void test_SnmpUtilVarBindListCpyFree(void)
{
    INT ret;
    static UINT ids[] = { 1, 3, 6, 1, 4, 1, 311 };
    static SnmpVarBind src = { { 7, ids }, { ASN_INTEGER, { 1 } } };
    static SnmpVarBindList dst_list, src_list = { &src, 1 };

    if (0) { /* these crash on XP */
    ret = SnmpUtilVarBindListCpy(NULL, NULL);
    ok(!ret, "SnmpUtilVarBindCpy succeeded\n");

    ret = SnmpUtilVarBindListCpy(NULL, &src_list);
    ok(!ret, "SnmpUtilVarBindListCpy succeeded\n");
    }

    /* This crashes under win98 */
    if(0)
    {
        memset(&dst_list, 0xff, sizeof(SnmpVarBindList));
        ret = SnmpUtilVarBindListCpy(&dst_list, NULL);
        ok(ret, "SnmpUtilVarBindListCpy failed\n");
        ok(dst_list.list == NULL, "SnmpUtilVarBindListCpy failed\n");
        ok(dst_list.len == 0, "SnmpUtilVarBindListCpy failed\n");
    }

    ret = SnmpUtilVarBindListCpy(&dst_list, &src_list);
    ok(ret, "SnmpUtilVarBindListCpy failed\n");
    ok(src_list.len == dst_list.len, "SnmpUtilVarBindListCpy failed\n");
    ok(src_list.list->name.idLength == dst_list.list->name.idLength,
       "SnmpUtilVarBindListCpy failed\n");
    ok(!memcmp(src_list.list->name.ids, dst_list.list->name.ids,
               dst_list.list->name.idLength * sizeof(UINT)),
       "SnmpUtilVarBindListCpy failed\n");
    ok(!memcmp(&src_list.list->value, &dst_list.list->value, sizeof(AsnAny)),
       "SnmpUtilVarBindListCpy failed\n");

    if (0) { /* crashes on XP */
    SnmpUtilVarBindListFree(NULL);
    }
    SnmpUtilVarBindListFree(&dst_list);
    ok(dst_list.list == NULL, "SnmpUtilVarBindListFree failed\n");
    ok(dst_list.len == 0, "SnmpUtilVarBindListFree failed\n");
}

START_TEST(util)
{
    InitFunctionPtrs();

    test_SnmpUtilOidToA();

    if (!pSnmpUtilAsnAnyCpy || !pSnmpUtilAsnAnyFree)
        win_skip("SnmpUtilAsnAnyCpy and/or SnmpUtilAsnAnyFree not available\n");
    else
        test_SnmpUtilAsnAnyCpyFree();

    if (!pSnmpUtilOctetsCpy || !pSnmpUtilOctetsFree)
        win_skip("SnmpUtilOctetsCpy and/or SnmpUtilOctetsFree not available\n");
    else
        test_SnmpUtilOctetsCpyFree();

    test_SnmpUtilOidCpyFree();

    if (!pSnmpUtilOctetsNCmp)
        win_skip("SnmpUtilOctetsNCmp not available\n");
    else
        test_SnmpUtilOctetsNCmp();

    if (!pSnmpUtilOctetsCmp)
        win_skip("SnmpUtilOctetsCmp not available\n");
    else
        test_SnmpUtilOctetsCmp();

    test_SnmpUtilOidCmp();
    test_SnmpUtilOidNCmp();
    test_SnmpUtilOidAppend();
    test_SnmpUtilVarBindCpyFree();
    test_SnmpUtilVarBindListCpyFree();
}
