/*
 * 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 = GetModuleHandle("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();
}
