/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 *    Copyright 2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
 */

#include <open62541/types.h>
#include <open62541/types_generated_handling.h>
#include "ua_types_encoding_json.h"

/* Decode a message, then encode, decode, encode.
 * The two encodings must be bit-equal. */
extern "C" int
LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {
    UA_ByteString buf;
    buf.data = (UA_Byte*)data;
    buf.length = size;

    UA_Variant value;
    UA_Variant_init(&value);

    UA_StatusCode retval = UA_decodeJson(&buf, &value, &UA_TYPES[UA_TYPES_VARIANT]);
    if(retval != UA_STATUSCODE_GOOD)
        return 0;

    size_t jsonSize = UA_calcSizeJson(&value, &UA_TYPES[UA_TYPES_VARIANT],
                                      NULL, 0, NULL, 0, true);

    UA_ByteString buf2 = UA_BYTESTRING_NULL;
    retval = UA_ByteString_allocBuffer(&buf2, jsonSize);
    if(retval != UA_STATUSCODE_GOOD) {
        UA_Variant_deleteMembers(&value);
        return 0;
    }

    uint8_t *bufPos = buf2.data;
    const uint8_t *bufEnd = &buf2.data[buf2.length];
    retval = UA_encodeJson(&value, &UA_TYPES[UA_TYPES_VARIANT],
                           &bufPos, &bufEnd, NULL, 0, NULL, 0, true);
	UA_Variant_deleteMembers(&value);
	if(retval != UA_STATUSCODE_GOOD || bufPos != bufEnd) {
		return 0;
	}

    UA_Variant value2;
    UA_Variant_init(&value2);

    retval = UA_decodeJson(&buf2, &value2, &UA_TYPES[UA_TYPES_VARIANT]);
    if(retval != UA_STATUSCODE_GOOD) {
		return 0;
	}

    UA_ByteString buf3 = UA_BYTESTRING_NULL;
    retval = UA_ByteString_allocBuffer(&buf3, jsonSize);
    if(retval != UA_STATUSCODE_GOOD) {
        UA_Variant_deleteMembers(&value2);
        UA_ByteString_deleteMembers(&buf2);
        return 0;
    }

    bufPos = buf3.data;
    bufEnd = &buf3.data[buf3.length];
    retval = UA_encodeJson(&value2, &UA_TYPES[UA_TYPES_VARIANT],
                           &bufPos, &bufEnd, NULL, 0, NULL, 0, true);
	UA_Variant_deleteMembers(&value2);
	if(retval != UA_STATUSCODE_GOOD) {
		UA_ByteString_deleteMembers(&buf2);
		UA_ByteString_deleteMembers(&buf3);
		return 0;
	}

    UA_assert(buf2.length == buf3.length);
    UA_assert(memcmp(buf2.data, buf3.data, buf2.length) == 0);
    UA_ByteString_deleteMembers(&buf2);
    UA_ByteString_deleteMembers(&buf3);
    return 0;
}
