package net.i2p.client;
/*
 * free (adj.): unencumbered; not under the control of others
 * Written by jrandom in 2003 and released into the public domain 
 * with no warranty of any kind, either expressed or implied.  
 * It probably won't make your computer catch on fire, or eat 
 * your children, but it might.  Use at your own risk.
 *
 */

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.HashSet;
import java.util.Set;

import junit.framework.TestCase;
import net.i2p.I2PAppContext;
import net.i2p.data.Destination;


/**
 *
 * @author Comwiz
 *
 */
public class I2PSessionTest extends TestCase implements I2PSessionListener{
    private Set<String> _s;
    
    
    public void setUp(){
    }
    
    protected void tearDown() {
        System.gc();
    }
    
    public void testSendClosedMessage() throws Exception{
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        Destination d = I2PClientFactory.createClient().createDestination(out);
        I2PSession session = new I2PSessionImpl2(I2PAppContext.getGlobalContext(), new ByteArrayInputStream(out.toByteArray()), null);
        
        boolean error = false;
        try{
            session.sendMessage(d, out.toByteArray());
        }catch(I2PSessionException i2pse){
            error = true;
        }
        assertTrue(error);
    }
    
    public void testSendAndRecieve() throws Exception{
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        Destination d = I2PClientFactory.createClient().createDestination(out);
        I2PSession session = new I2PSessionImpl2(I2PAppContext.getGlobalContext(), new ByteArrayInputStream(out.toByteArray()), null);
        session.connect();
        
        session.setSessionListener(this);
        
        _s = new HashSet<String>();
        _s.add("a");
        _s.add("b");
        _s.add("c");
        _s.add("d");
        
        session.sendMessage(d, "a".getBytes());
        session.sendMessage(d, "b".getBytes());
        session.sendMessage(d, "c".getBytes());
        session.sendMessage(d, "d".getBytes());
        
        for(int i = 0; (i < 20)&&(!_s.isEmpty()); i++){
            Thread.sleep(1000);
        }
        assertTrue(_s.isEmpty());
        
        
    }
    
    public void disconnected(I2PSession session){}
    public void errorOccurred(I2PSession session, java.lang.String message, java.lang.Throwable error){}
    public void messageAvailable(I2PSession session, int msgId, long size){
        try{
            String x = new String(session.receiveMessage(msgId));
            if(_s.contains(x))
                _s.remove(x);
        }catch(Exception e){
            fail();
        }
    }
    public void reportAbuse(I2PSession session, int severity){}
}