Serge Knystautas wrote:
... if you can submit this to bugzilla, it will help us track that it's reviewed.

It did not occur to me to use bugzilla since the improvements, which I believe SMTPDataInputStream offers, are not necessarily fixes to bugs. The changes in behavior are arguable. I argue that the right end of data indicator to recognize is "a period alone in a line" rather than "CRLF.CRLF", but it seems that many people see it differently.


Should I use bugzilla to express my opinions about improvements needed?

> ... JUnit tests.

I did some JUnit tests, not comparing old vs. new, but only testing the new. I attach a file containing that class. Earlier I had tested the old (existing) behavior, as I reported briefly to this list in this message on June 10, <http://marc.theaimsgroup.com/?l=james-dev&m=105527214016488&w=2>.

Rich

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;

import junit.framework.TestCase;

public class TestSIS extends TestCase {
    SMTPDataInputStream sis;
    
    public TestSIS(String whooo){
        super(whooo);
    }

    static String food = 
          ".dogs\r. sp\n"
        + ".\r\n"
        + ".\r8\r\n"
        + ".\r\r\no*"
        + " \r\n.\r\n"
        + "I guess we shouldn't get here.\r\n";

    //test response to a challenging sequence of characters
    public void testFood0() throws Exception {
        sis=constructSIS(food, 25, 7);
        assertEquals((byte)sis.read(),(byte)'d');
        assertEquals((byte)sis.read(),(byte)'o');
        assertEquals((byte)sis.read(),(byte)'g');
        assertEquals((byte)sis.read(),(byte)'s');
        assertEquals((byte)sis.read(),(byte)13);
        assertEquals((byte)sis.read(),(byte)'.');
        assertEquals((byte)sis.read(),(byte)' ');
        assertEquals((byte)sis.read(),(byte)'s');
        assertEquals((byte)sis.read(),(byte)'p');
        assertEquals((byte)sis.read(),(byte)012);
        assertEquals((byte)sis.read(),(byte)'.');
        assertEquals((byte)sis.read(),(byte)13);
        assertEquals((byte)sis.read(),(byte)10);
        assertEquals((byte)sis.read(),(byte)13);
        assertEquals((byte)sis.read(),(byte)'8');
        assertEquals((byte)sis.read(),(byte)13);
        assertEquals((byte)sis.read(),(byte)10);
        assertEquals((byte)sis.read(),(byte)13);
        assertEquals((byte)sis.read(),(byte)13);
        assertEquals((byte)sis.read(),(byte)10);
        assertEquals((byte)sis.read(),(byte)'o');
        assertEquals((byte)sis.read(),(byte)'*');
        assertEquals((byte)sis.read(),(byte)' ');
        assertEquals((byte)sis.read(),(byte)13);
        assertEquals((byte)sis.read(),(byte)10);
        assertEquals((byte)sis.read(),(byte)-1);
        assertEquals((byte)sis.read(),(byte)-1);
        assertEquals((byte)sis.read(),(byte)-1);
        sis.close();        
    }

    //test attempt to read beyond maxMessageSize
    public void testFood1() throws Exception {
        sis=constructSIS(food, 6, 7);
        assertEquals((byte)sis.read(),(byte)'d');
        assertEquals((byte)sis.read(),(byte)'o');
        assertEquals((byte)sis.read(),(byte)'g');
        assertEquals((byte)sis.read(),(byte)'s');
        assertEquals((byte)sis.read(),(byte)13);
        assertEquals((byte)sis.read(),(byte)'.');
        Exception ex = null;
        try{
            sis.read();
        }catch (Exception e){
            ex = e;
        }        
        assertTrue(ex instanceof MessageSizeException);
        sis.close();        
    }
    
    //test same with different reset interval
    public void testFood2() throws Exception {
        sis=constructSIS(food, 6, 1);
        assertEquals((byte)sis.read(),(byte)'d');
        assertEquals((byte)sis.read(),(byte)'o');
        assertEquals((byte)sis.read(),(byte)'g');
        assertEquals((byte)sis.read(),(byte)'s');
        assertEquals((byte)sis.read(),(byte)13);
        assertEquals((byte)sis.read(),(byte)'.');
        Exception ex = null;
        try{
            sis.read();
        }catch (Exception e){
            ex = e;
        }        
        assertTrue(ex instanceof MessageSizeException);
        sis.close();        
    }
    
    //test same with different reset interval
    public void testFood3() throws Exception {
        sis=constructSIS(food, 6, 6);
        assertEquals((byte)sis.read(),(byte)'d');
        assertEquals((byte)sis.read(),(byte)'o');
        assertEquals((byte)sis.read(),(byte)'g');
        assertEquals((byte)sis.read(),(byte)'s');
        assertEquals((byte)sis.read(),(byte)13);
        assertEquals((byte)sis.read(),(byte)'.');
        Exception ex = null;
        try{
            sis.read();
        }catch (Exception e){
            ex = e;
        }        
        assertTrue(ex instanceof MessageSizeException);
        sis.close();        
    }

    //test same with different reset interval
    public void testFood4() throws Exception {
        sis=constructSIS(food, 6, 3);
        assertEquals((byte)sis.read(),(byte)'d');
        assertEquals((byte)sis.read(),(byte)'o');
        assertEquals((byte)sis.read(),(byte)'g');
        assertEquals((byte)sis.read(),(byte)'s');
        assertEquals((byte)sis.read(),(byte)13);
        assertEquals((byte)sis.read(),(byte)'.');
        Exception ex = null;
        try{
            sis.read();
        }catch (Exception e){
            ex = e;
        }        
        assertTrue(ex instanceof MessageSizeException);
        sis.close();        
    }

    
    //test a set of illegal arguments to the constructor
    public void testFood5() throws Exception {
        Throwable t0 = null;
        try{
            sis=new SMTPDataInputStream(null, 6, new WatchDog(), 3);
        }catch (Throwable t){
            t0=t;
        }
        assertTrue(t0 instanceof IllegalArgumentException);

        t0 = null;
        try{
            sis=constructSIS(food, -1, 8);
        }catch (Throwable t){
            t0=t;
        }
        assertTrue(t0 instanceof IllegalArgumentException);


        t0 = null;
        try{
            sis=constructSIS(food, 4, 0);
        }catch (Throwable t){
            t0=t;
        }
        assertTrue(t0 instanceof IllegalArgumentException);

        if (sis != null) sis.close();        
    }
    
    //test read(byte[])
    public void testFood6() throws Exception {
        sis=constructSIS(food, 40, 600);
        byte[] b = new byte[5];
        assertEquals(5, sis.read(b));
        assertEquals(b[0],(byte)'d');
        assertEquals(b[4],(byte)13);
        assertEquals((byte)sis.read(),(byte)'.');
        sis.close();        
    }

    //test read(byte[], int, int)
    public void testFood7() throws Exception {
        sis=constructSIS(food, 6880, 32);
        byte[] b = {
            (byte) 71,
            (byte) 72,
            (byte) 73,
            (byte) 74,
            (byte) 75,
            (byte) 76,
            (byte) 77,
            (byte) 78,
            (byte) 79,
            (byte) 80 };
            
        sis.read();
        sis.read();
        sis.read();
        sis.read();
        sis.read();
        sis.read();
        sis.read();
        sis.read();
        sis.read();
        sis.read();
        sis.read();
        sis.read();
        assertEquals(4, sis.read(b, 3, 4));
        
        assertEquals(b[0],(byte) 71);
        assertEquals(b[1],(byte) 72);
        assertEquals(b[2],(byte) 73);
        assertEquals(b[3],(byte)10);
        assertEquals(b[4],(byte)13);
        assertEquals(b[5],(byte)'8');
        assertEquals(b[6],(byte)13);
        assertEquals(b[7],(byte)78);
        assertEquals(b[8],(byte)79);
        assertEquals(b[9],(byte)80);
        assertEquals((byte)sis.read(),(byte)10);
        sis.close();
    }
    
    //test the exact-length end
    public void testExactEnd() throws Exception{
        sis=constructSIS("abcdefghij\r\n.\r\n and more too", 12, 5);
        byte[] b = new byte[3992];
        assertEquals(sis.read(b), 12);
        assertEquals(sis.read(b, 498, 500), -1);
    }

    //test a zero length inputStream
    public void testSmall() throws Exception {
        sis=constructSIS("", 6, 7);
        assertEquals((byte)sis.read(),(byte)-1);
        assertEquals((byte)sis.read(),(byte)-1);
        sis.close();        
    }
    

    
    private SMTPDataInputStream constructSIS (String food, int maxSize, 
                    int resetSize)throws Exception {
        return new SMTPDataInputStream(
            new BufferedInputStream(
            new ByteArrayInputStream
            (
                food.getBytes("ASCII"))),
                maxSize,
                new WatchDog(){
                    void reset(){
                        System.out.println("Hey, I been reset");
                    }
                  },
                resetSize
            );
    }    
}

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to