/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */
#include "qpid/broker/Message.h"
#include "qpid/framing/AMQP_HighestVersion.h"
#include "qpid/framing/AMQFrame.h"
#include "qpid/framing/MessageTransferBody.h"
#include "qpid/framing/FieldValue.h"
#include "qpid/framing/Uuid.h"
#include "MessageUtils.h"

#include "unit_test.h"

#include <iostream>

using namespace qpid::broker;
using namespace qpid::framing;

using std::string;

namespace qpid {
namespace tests {

QPID_AUTO_TEST_SUITE(MessageTestSuite)

QPID_AUTO_TEST_CASE(testEncodeDecode)
{
    string exchange = "MyExchange";
    string routingKey = "MyRoutingKey";
    uint64_t ttl(60);
    Uuid messageId(true);
    string data("abcdefghijklmn");

    qpid::types::Variant::Map properties;
    properties["routing-key"] = routingKey;
    properties["ttl"] = ttl;
    properties["durable"] = true;
    properties["message-id"] = qpid::types::Uuid(messageId.data());
    properties["abc"] = "xyz";
    Message msg = MessageUtils::createMessage(properties, data);

    std::string buffer;
    encode(msg, buffer);
    msg = Message();
    decode(buffer, msg);

    BOOST_CHECK_EQUAL(routingKey, msg.getRoutingKey());
    BOOST_CHECK_EQUAL((uint64_t) data.size(), msg.getContentSize());
    BOOST_CHECK_EQUAL(data, msg.getContent());
    //BOOST_CHECK_EQUAL(messageId, msg->getProperties<MessageProperties>()->getMessageId());
    BOOST_CHECK_EQUAL(string("xyz"), msg.getPropertyAsString("abc"));
    BOOST_CHECK(msg.isPersistent());
}

QPID_AUTO_TEST_SUITE_END()

}} // namespace qpid::tests
