Author: rdonkin Date: Tue Jul 31 01:40:44 2007 New Revision: 561266 URL: http://svn.apache.org/viewvc?view=rev&rev=561266 Log: Factor out dependency on IMAP implementation.
Added: james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/HostSystem.java Removed: james/server/sandbox/imap-functional/src/main/java/ james/server/sandbox/imap-functional/src/test/java/org/apache/james/imapserver/CommandParserTest.java james/server/sandbox/imap-functional/src/test/java/org/apache/james/imapserver/ImapHostTest.java james/server/sandbox/imap-functional/src/test/java/org/apache/james/imapserver/ImapMailboxTest.java james/server/sandbox/imap-functional/src/test/java/org/apache/james/imapserver/ImapStoreTest.java james/server/sandbox/imap-functional/src/test/java/org/apache/james/imapserver/InitialMail.java Modified: james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/AbstractProtocolTest.java james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/ProtocolSession.java james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/SimpleFileProtocolTest.java Modified: james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/AbstractProtocolTest.java URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/AbstractProtocolTest.java?view=diff&rev=561266&r1=561265&r2=561266 ============================================================================== --- james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/AbstractProtocolTest.java (original) +++ james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/AbstractProtocolTest.java Tue Jul 31 01:40:44 2007 @@ -19,32 +19,12 @@ package org.apache.james.test; -import junit.framework.TestCase; -import org.apache.james.imapserver.ImapHandler; -import org.apache.james.imapserver.ImapHost; -import org.apache.james.imapserver.ImapRequestHandler; -import org.apache.james.imapserver.ImapResponse; -import org.apache.james.imapserver.ImapSession; -import org.apache.james.imapserver.ImapSessionImpl; -import org.apache.james.imapserver.ImapTest; -import org.apache.james.imapserver.JamesImapHost; -import org.apache.james.imapserver.ProtocolException; -import org.apache.james.imapserver.store.MailboxException; -import org.apache.james.userrepository.AbstractUsersRepository; -import org.apache.james.userrepository.DefaultUser; -import org.apache.mailet.User; -import org.apache.mailet.UsersRepository; - import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PipedInputStream; -import java.io.PipedOutputStream; import java.io.PrintWriter; -import java.net.Socket; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; + +import junit.framework.TestCase; + +import org.apache.james.imapserver.ImapTest; /** * Abstract Protocol Test is the root of all of the James Imap Server test @@ -73,14 +53,12 @@ /** The timeout to set on the socket for socket-based testing. */ protected int timeout = TIMEOUT; - /** A UsersRepository which all tests share. */ - private static UsersRepository users; - /** An ImapHost instance which all tests share. */ - private static ImapHost imapHost; - - public AbstractProtocolTest( String s ) + private final HostSystem hostSystem; + + public AbstractProtocolTest( String name, HostSystem hostSystem ) { - super( s ); + super(name); + this.hostSystem = hostSystem; } protected void setUp() throws Exception @@ -89,68 +67,6 @@ setUpEnvironment(); } - /** - * Uses a system property to determine whether to run tests locally, or against - * a remote server. - */ - protected void runSessions() throws Exception - { - String runLocal = System.getProperty( "runTestsLocal", "true" ); - boolean local = Boolean.valueOf( runLocal ).booleanValue(); - if ( local ) { - runLocalProtocolSessions(); - } - else { - runSocketProtocolSessions(); - } - } - - /** - * Runs the pre,test and post protocol sessions against a running instance of James, - * by communicating via a socket connection. After a request is sent, the server response - * is parsed to determine if the actual response matches that expected. - */ - private void runSocketProtocolSessions() - throws Exception { - Socket[] socket = new Socket[testElements.getSessionCount()]; - PrintWriter[] out = new PrintWriter[socket.length]; - BufferedReader[] in = new BufferedReader[socket.length]; - - for (int i = 0; i < socket.length; i++) { - socket[i] = new Socket(host, port); - socket[i].setSoTimeout(timeout); - out[i] = new PrintWriter(socket[i].getOutputStream()); - in[i] = new BufferedReader(new InputStreamReader(socket[i].getInputStream())); - } - - Exception failure = null; - try { - preElements.runLiveSession(out, in); - testElements.runLiveSession(out, in); - } catch (ProtocolSession.InvalidServerResponseException e) { - failure = e; - } finally { - // Try our best to do cleanup. - try { - postElements.runLiveSession(out, in); - } catch (ProtocolSession.InvalidServerResponseException e) { - // Don't overwrite real error with error on cleanup. - if (failure == null) { - failure = e; - } - } - } - - if (failure != null) { - fail(failure.getMessage()); - } - - for (int i = 0; i < socket.length; i++) { - out[i].close(); - in[i].close(); - socket[i].close(); - } - } /** * Runs the pre,test and post protocol sessions against a local copy of the ImapServer. @@ -162,191 +78,65 @@ * is required per protocol session/connection. These share the same underlying * Mailboxes, because of the way [EMAIL PROTECTED] MockImapServer#getImapSession()} works. */ - private void runLocalProtocolSessions() throws Exception + protected void runSessions() throws Exception { - MockImapServer[] socket = new MockImapServer[testElements.getSessionCount()]; + HostSystem.Session[] socket = new HostSystem.Session[testElements.getSessionCount()]; PrintWriter[] out = new PrintWriter[socket.length]; BufferedReader[] in = new BufferedReader[socket.length]; for (int i = 0; i < socket.length; i++) { - socket[i] = new MockImapServer(); - out[i] = socket[i].getWriter(); - in[i] = socket[i].getReader(); + socket[i] = hostSystem.newSession(); + out[i] = new PrintWriter(socket[i].getWriter()); + in[i] = new BufferedReader(socket[i].getReader()); socket[i].start(); } - - Exception failure = null; - try { - preElements.runLiveSession( out, in ); - testElements.runLiveSession( out, in ); - } catch (ProtocolSession.InvalidServerResponseException e) { - failure = e; - // Try our best to do cleanup. - for (int i = 0; i < in.length; i++) { - BufferedReader reader = in[i]; - while (reader.ready()) { - reader.read(); - } - } - } finally { - try { - postElements.runLiveSession(out, in); - } catch (ProtocolSession.InvalidServerResponseException e) { - // Don't overwrite real error with error on cleanup. - if (failure == null) { - failure = e; - } - } - } - - if (failure != null) { - fail(failure.getMessage()); - } - - - for (int i = 0; i < socket.length; i++) { - out[i].close(); - in[i].close(); - socket[i].stopServer(); - } - - } - - /** - * Initialises the UsersRepository and ImapHost on first call. - * TODO enable logging, set up components properly. - */ - private void setUpEnvironment() throws MailboxException - { - if ( users == null || imapHost == null ) { - users = new InMemoryUsersRepository(); - DefaultUser user = new DefaultUser( USER, "SHA" ); - user.setPassword( PASSWORD ); - users.addUser( user ); - - imapHost = new JamesImapHost(); - imapHost.createPrivateMailAccount( user ); - } - } - - /** - * A simple, dummy implementation of UsersRepository to use for testing, - * which stored all users in memory. - */ - private class InMemoryUsersRepository extends AbstractUsersRepository - { - private Map users = new HashMap(); - - protected Iterator listAllUsers() - { - return users.values().iterator(); - } - - protected void doAddUser( User user ) - { - users.put( user.getUserName(), user ); - } - - protected void doRemoveUser( User user ) + try { - users.remove( user.getUserName()); - } - - protected void doUpdateUser( User user ) - { - users.put( user.getUserName(), user ); - } - } - - /** - * A simple test utility which allows testing of Imap commands without - * deployment of the full server. Piped input and output streams are used - * to provide the equivilant of a socket interface. - */ - private class MockImapServer extends Thread { - private ImapRequestHandler handler = new ImapRequestHandler(); - - private PipedInputStream requestInputStream; - private PipedOutputStream requestOutputStream; - - private PipedInputStream responseInputStream; - private PipedOutputStream responseOutputStream; - - private ImapSession session; - private ProtocolException exception; - - private boolean running; - - /** - * Creates a MockImapServer, with a handler for the session provided. - */ - public MockImapServer() throws IOException { - this.session = getImapSession(); - requestOutputStream = new PipedOutputStream(); - requestInputStream = new PipedInputStream(requestOutputStream); - - responseInputStream = new PipedInputStream(); - responseOutputStream = new PipedOutputStream(responseInputStream); - - } - - /** - * Core loop where Imap commands are handled - */ - public void run() { - running = true; + Exception failure = null; try { - responseOutputStream.write( "* OK IMAP4rev1 Server XXX ready".getBytes() ); - responseOutputStream.write( '\r' ); - responseOutputStream.write( '\n' ); - } catch (IOException e) { - throw new RuntimeException("Couldn't write welcome message", e); - } - - while (running) { + preElements.runLiveSession( out, in ); + testElements.runLiveSession( out, in ); + } catch (ProtocolSession.InvalidServerResponseException e) { + failure = e; + // Try our best to do cleanup. + for (int i = 0; i < in.length; i++) { + BufferedReader reader = in[i]; + while (reader.ready()) { + reader.read(); + } + } + } finally { try { - handler.handleRequest(requestInputStream, responseOutputStream, session); - } catch (ProtocolException e) { - exception = e; - break; + postElements.runLiveSession(out, in); + } catch (ProtocolSession.InvalidServerResponseException e) { + // Don't overwrite real error with error on cleanup. + if (failure == null) { + failure = e; + } } } - } - - /** - * @return A writer which is used to send commands to the mock server. - */ - public PrintWriter getWriter() { - return new PrintWriter(requestOutputStream); - } - /** - * @return A reader which is used to read responses from the mock server. - */ - public BufferedReader getReader() { - return new BufferedReader(new InputStreamReader(responseInputStream)); - } + if (failure != null) { + fail(failure.getMessage()); + } - /** stop the running server thread.*/ - public void stopServer() { - running = false; } - - /** - * Provides an ImapSession to use for this test. An ImapSession is accosiated - * with a single client connection. - */ - private ImapSession getImapSession() + finally { - ImapSession session = new ImapSessionImpl( imapHost, users, new MockImapHandler(), null, null ); - return session; - } - - private final class MockImapHandler extends ImapHandler { - public void forceConnectionClose(String message) { - ImapResponse response = new ImapResponse(responseOutputStream); - response.byeResponse(message); + for (int i = 0; i < socket.length; i++) { + out[i].close(); + in[i].close(); + socket[i].stop(); } } + } + + /** + * Initialises the UsersRepository and ImapHost on first call. + */ + private void setUpEnvironment() throws Exception + { + hostSystem.reset(); + hostSystem.addUser( USER, PASSWORD ); } } Added: james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/HostSystem.java URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/HostSystem.java?view=auto&rev=561266 ============================================================================== --- james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/HostSystem.java (added) +++ james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/HostSystem.java Tue Jul 31 01:40:44 2007 @@ -0,0 +1,60 @@ +/**************************************************************** + * 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. * + ****************************************************************/ + + +package org.apache.james.test; + +import java.io.Reader; +import java.io.Writer; + +/** + * Host system under test. + * + */ +public interface HostSystem { + + /** + * Resets host system to initial state. + * @throws Exception + */ + public void reset() throws Exception; + + /** + * Add a user for testing. + * @param user user name + * @param password user password + * @throws Exception + */ + public void addUser(String user, String password) throws Exception; + + /** + * Creates a new session for functional testing. + * @return <code>Session</code>, not null + * @throws Exception + */ + public Session newSession() throws Exception; + + public interface Session + { + public Reader getReader() throws Exception; + public Writer getWriter() throws Exception; + public void start() throws Exception; + public void stop() throws Exception; + } +} Modified: james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/ProtocolSession.java URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/ProtocolSession.java?view=diff&rev=561266&r1=561265&r2=561266 ============================================================================== --- james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/ProtocolSession.java (original) +++ james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/ProtocolSession.java Tue Jul 31 01:40:44 2007 @@ -20,14 +20,13 @@ package org.apache.james.test; -import org.apache.oro.text.perl.Perl5Util; - import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.regex.Pattern; /** * A protocol session which can be run against a reader and writer, which checks @@ -42,7 +41,6 @@ { private int maxSessionNumber; protected List testElements = new ArrayList(); - private static final Perl5Util perl = new Perl5Util(); /** * Returns the number of sessions required to run this ProtocolSession. @@ -254,9 +252,9 @@ * @return <code>true</code> if the actual matches the expected. */ protected boolean match( String expected, String actual ) - { - String pattern = "m/" + expected + "/"; - return perl.match( pattern, actual ); + { + final boolean result = Pattern.matches( expected, actual ); + return result; } /** Modified: james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/SimpleFileProtocolTest.java URL: http://svn.apache.org/viewvc/james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/SimpleFileProtocolTest.java?view=diff&rev=561266&r1=561265&r2=561266 ============================================================================== --- james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/SimpleFileProtocolTest.java (original) +++ james/server/sandbox/imap-functional/src/test/java/org/apache/james/test/SimpleFileProtocolTest.java Tue Jul 31 01:40:44 2007 @@ -41,9 +41,9 @@ * in the same location as this test class. * @param fileName The name of the file to read protocol elements from. */ - public SimpleFileProtocolTest( String fileName ) + public SimpleFileProtocolTest( String fileName, HostSystem hostSystem ) { - super( fileName ); + super( fileName, hostSystem ); } /** --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]