org.ccnx.ccn.io.content.SerializableObjectTest.java Source code

Java tutorial

Introduction

Here is the source code for org.ccnx.ccn.io.content.SerializableObjectTest.java

Source

/*
 * A CCNx library test.
 *
 * Copyright (C) 2008, 2009, 2011, 2013 Palo Alto Research Center, Inc.
 *
 * This work is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License version 2 as published by the
 * Free Software Foundation. 
 * This work 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 General Public License
 * for more details. You should have received a copy of the GNU General Public
 * License along with this program; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

package org.ccnx.ccn.io.content;

import static org.junit.Assert.fail;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;

import org.bouncycastle.util.Arrays;
import org.ccnx.ccn.impl.support.Log;
import org.ccnx.ccn.io.content.ContentNotReadyException;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 * Test low level (non-CCN) SerializableObject functionality, backing objects to ByteArrayOutputStreams.
 **/
public class SerializableObjectTest {

    static KeyPair kp1 = null;
    static KeyPair kp2 = null;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(512); // go for fast
        kp1 = kpg.generateKeyPair();
        kp2 = kpg.generateKeyPair();
    }

    @Test
    public void testSave() {
        Log.info(Log.FAC_TEST, "Starting testSave");

        SerializablePublicKey spk1 = new SerializablePublicKey(kp1.getPublic());
        SerializablePublicKey spk2 = new SerializablePublicKey(kp1.getPublic());
        SerializablePublicKey spk3 = new SerializablePublicKey(kp2.getPublic());

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
        ByteArrayOutputStream baos3 = new ByteArrayOutputStream();

        try {
            spk1.save(baos);
            spk2.save(baos2); // will this save? currently not, should it?
            Assert.assertArrayEquals("Serializing two versions of same content should produce same output",
                    baos.toByteArray(), baos2.toByteArray());
            spk3.save(baos3);
            boolean be = Arrays.areEqual(baos.toByteArray(), baos3.toByteArray());
            Assert.assertFalse("Two different objects shouldn't have matching output.", be);
            System.out.println("Saved two public keys, lengths " + baos.toByteArray().length + " and "
                    + baos3.toByteArray().length);
        } catch (IOException e) {
            fail("IOException! " + e.getMessage());
        }

        Log.info(Log.FAC_TEST, "Completed testSave");
    }

    @Test
    public void testUpdate() {
        Log.info(Log.FAC_TEST, "Starting testUpdate");

        boolean caught = false;
        SerializablePublicKey empty = new SerializablePublicKey();
        try {
            empty.publicKey();
        } catch (ContentNotReadyException iox) {
            // this is what we expect to happen
            caught = true;
        } catch (IOException ie) {
            Assert.fail("Unexpectd IOException!");
        }
        Assert.assertTrue("Failed to produce expected exception.", caught);

        SerializablePublicKey spk1 = new SerializablePublicKey(kp1.getPublic());
        SerializablePublicKey spk2 = new SerializablePublicKey();
        SerializablePublicKey spk3 = new SerializablePublicKey(kp2.getPublic());

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ByteArrayOutputStream baos3 = new ByteArrayOutputStream();

        try {
            spk1.save(baos);
            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            spk2.update(bais); // will this save? currently not, should it?
            Assert.assertEquals("Writing content out and back in again should give matching object.", spk1, spk2);
            spk3.save(baos3);
            boolean be = Arrays.areEqual(baos.toByteArray(), baos3.toByteArray());
            Assert.assertFalse("Two different objects shouldn't have matching output.", be);
            System.out.println("Saved two public keys, lengths " + baos.toByteArray().length + " and "
                    + baos3.toByteArray().length);
        } catch (IOException e) {
            fail("IOException! " + e.getMessage());
        }

        Log.info(Log.FAC_TEST, "Completed testUpdate");
    }
}