expected.add("startHeader");
        expected.add("endHeader");
        expected.add("body");
        expected.add("endMessage");
        
        MimeStreamParser parser = new MimeStreamParser();
        parser.setContentHandler(new AbstractContentHandler() {
            @Override
            public void body(BodyDescriptor bd, InputStream is) {
                assertEquals(expected.removeFirst(), "body");
            }
            
            @Override
            public void endMultipart() {
                fail("endMultipart shouldn't be called for empty stream");
            }
            @Override
            public void endBodyPart() {
                fail("endBodyPart shouldn't be called for empty stream");
            }
            @Override
            public void endHeader() {
                assertEquals(expected.removeFirst(), "endHeader");
            }
            @Override
            public void endMessage() {
                assertEquals(expected.removeFirst(), "endMessage");
            }
            @Override
            public void field(Field field) {
                fail("field shouldn't be called for empty stream");
            }
            @Override
            public void startMultipart(BodyDescriptor bd) {
                fail("startMultipart shouldn't be called for empty stream");
            }
            @Override
            public void startBodyPart() {
                fail("startBodyPart shouldn't be called for empty stream");
            }
            @Override
            public void startHeader() {
                assertEquals(expected.removeFirst(), "startHeader");
            }
            @Override
            public void startMessage() {
                assertEquals(expected.removeFirst(), "startMessage");
            }
        });
        
        parser.parse(new ByteArrayInputStream(new byte[0]));
        
        assertEquals(0, expected.size());
    }