/*
 * Web Services on Devices
 * Memory tests
 *
 * Copyright 2017 Owen Rudge for CodeWeavers
 *
 * 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
 */

#define COBJMACROS

#include <windows.h>

#include "wine/test.h"
#include "wsdapi.h"

#define ALIGNMENT                (2 * sizeof(void*))
#define NUM_ITERATIONS           100

static void AllocateLinkedMemory_tests(void)
{
    void *alloc1;
    void *alloc2;
    void *alloc_ptrs[NUM_ITERATIONS];
    int i;

    /* Test a parentless allocation */
    alloc1 = WSDAllocateLinkedMemory(NULL, 1024);
    ok(alloc1 != NULL, "WSDAllocateLinkedMemory with null parent failed\n");

    WSDFreeLinkedMemory(alloc1);

    /* Test a parented allocation */
    alloc1 = WSDAllocateLinkedMemory(NULL, 1024);
    ok(alloc1 != NULL, "WSDAllocateLinkedMemory with null parent failed\n");

    alloc2 = WSDAllocateLinkedMemory(alloc1, 1024);
    ok(alloc2 != NULL, "WSDAllocateLinkedMemory with parent failed\n");

    WSDFreeLinkedMemory(alloc1);

    /* Try allocating against the freed parent */
    alloc2 = WSDAllocateLinkedMemory(alloc1, 1024);
    ok(alloc2 != NULL, "WSDAllocateLinkedMemory with parent failed\n");

    /* Test that the returned pointers are aligned as expected */
    for (i = 0; i < NUM_ITERATIONS; i++)
    {
        alloc_ptrs[i] = WSDAllocateLinkedMemory(NULL, i);
        ok(((UINT_PTR)alloc_ptrs[i] % ALIGNMENT) == 0, "WSDAllocateLinkedMemory returned pointer not aligned (size = %d).\n", i);
    }

    for (i = 0; i < NUM_ITERATIONS; i++)
    {
        WSDFreeLinkedMemory(alloc_ptrs[i]);
    }
}

START_TEST(memory)
{
    AllocateLinkedMemory_tests();
}
