package org.apache.directmemory.server.commons;
/*
 * 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.
 */


import org.apache.directmemory.serialization.Serializer;
import org.apache.directmemory.serialization.SerializerFactory;
import org.apache.directmemory.test.Wine;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayInputStream;

import static org.junit.Assert.*;


/**
 * @author Olivier Lamy
 */
public class DirectMemoryWriterTest
{
    private Logger log = LoggerFactory.getLogger( getClass() );

    @Test
    public void writeRequestWithString()
        throws Exception
    {
        DirectMemoryRequest dmRq =
            new DirectMemoryRequest().setKey( "101" ).setUpdate( true ).setExpiresIn( 123 ).setCacheContent(
                "foo bar".getBytes() );
        String rq = DirectMemoryWriter.instance().generateJsonRequest( dmRq );

        dmRq = DirectMemoryParser.instance().buildRequest( new ByteArrayInputStream( rq.getBytes() ) );
        assertNotNull( dmRq );

        assertEquals( "101", dmRq.getKey() );
        assertTrue( dmRq.isUpdate() );
        assertEquals( 123, dmRq.getExpiresIn() );
        assertEquals( "foo bar", new String( dmRq.getCacheContent() ) );
    }

    @Test
    public void writeRequestWithObject()
        throws Exception
    {
        Wine wine = new Wine();
        wine.setName( "Bordeaux" );

        Serializer serializer = SerializerFactory.createNewSerializer();

        DirectMemoryRequest dmRq =
            new DirectMemoryRequest().setKey( "101" ).setUpdate( true ).setExpiresIn( 123 ).setObject(
                wine ).setSerializer( serializer );
        String rq = DirectMemoryWriter.instance().generateJsonRequest( dmRq );
        log.info( "rq:" + rq );

        dmRq = DirectMemoryParser.instance().buildRequest( new ByteArrayInputStream( rq.getBytes() ) );
        assertNotNull( dmRq );

        assertEquals( "101", dmRq.getKey() );
        assertTrue( dmRq.isUpdate() );
        assertEquals( 123, dmRq.getExpiresIn() );

        wine = serializer.deserialize( dmRq.getCacheContent(), Wine.class );
        assertEquals( "Bordeaux", wine.getName() );

    }

    @Test
    public void writeResponseWithString()
        throws Exception
    {
        DirectMemoryResponse rs =
            new DirectMemoryResponse().setKey( "101" ).setFound( true ).setStored( false ).setCacheContent(
                "foo bar".getBytes() );
        String jsonRs = DirectMemoryWriter.instance().generateJsonResponse( rs );

        rs = DirectMemoryParser.instance().buildResponse( new ByteArrayInputStream( jsonRs.getBytes() ) );
        assertNotNull( rs );

        log.info( "jsonRs:" + jsonRs );

        assertEquals( "101", rs.getKey() );
        assertTrue( rs.isFound() );
        assertFalse( rs.isStored() );
        assertEquals( "foo bar", new String( rs.getCacheContent() ) );
    }
}
