You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ba...@apache.org on 2006/05/12 19:38:01 UTC

svn commit: r405805 - in /james/server/trunk/src/test/org/apache/james: smtpserver/SMTPServerTest.java test/mock/james/InMemorySpoolRepository.java test/mock/mailet/MockMailContext.java

Author: bago
Date: Fri May 12 10:38:01 2006
New Revision: 405805

URL: http://svn.apache.org/viewcvs?rev=405805&view=rev
Log:
Tests fixes for the dnsServer change thing, added to SMTPServerTest example code to test 7bit/8bit mime stuff (unfortunately still bugged in javamail 1.4)

Added:
    james/server/trunk/src/test/org/apache/james/test/mock/james/InMemorySpoolRepository.java   (with props)
Modified:
    james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java
    james/server/trunk/src/test/org/apache/james/test/mock/mailet/MockMailContext.java

Modified: james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java
URL: http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java?rev=405805&r1=405804&r2=405805&view=diff
==============================================================================
--- james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java (original)
+++ james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java Fri May 12 10:38:01 2006
@@ -17,8 +17,11 @@
 package org.apache.james.smtpserver;
 
 import org.apache.avalon.cornerstone.services.sockets.SocketManager;
+import org.apache.avalon.cornerstone.services.store.Store;
 import org.apache.avalon.cornerstone.services.threads.ThreadManager;
 import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.james.Constants;
+import org.apache.james.core.MailImpl;
 import org.apache.james.services.DNSServer;
 import org.apache.james.services.JamesConnectionManager;
 import org.apache.james.services.MailServer;
@@ -26,10 +29,14 @@
 import org.apache.james.test.mock.avalon.MockLogger;
 import org.apache.james.test.mock.avalon.MockServiceManager;
 import org.apache.james.test.mock.avalon.MockSocketManager;
+import org.apache.james.test.mock.avalon.MockStore;
 import org.apache.james.test.mock.avalon.MockThreadManager;
+import org.apache.james.test.mock.james.InMemorySpoolRepository;
 import org.apache.james.test.mock.james.MockMailServer;
 import org.apache.james.test.mock.mailet.MockMailContext;
+import org.apache.james.test.mock.mailet.MockMailetConfig;
 import org.apache.james.test.util.Util;
+import org.apache.james.transport.mailets.RemoteDelivery;
 import org.apache.james.userrepository.MockUsersRepository;
 import org.apache.james.util.Base64;
 import org.apache.james.util.connection.SimpleConnectionManager;
@@ -45,10 +52,13 @@
 import org.columba.ristretto.smtp.SMTPProtocol;
 import org.columba.ristretto.smtp.SMTPResponse;
 
+import javax.mail.MessagingException;
+import javax.mail.Session;
 import javax.mail.internet.MimeMessage;
-import javax.mail.internet.ParseException;
 import javax.mail.util.SharedByteArrayInputStream;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.InetAddress;
@@ -58,6 +68,7 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Properties;
 
 import junit.framework.TestCase;
 
@@ -75,7 +86,7 @@
         super("SMTPServerTest");
     }
 
-    public void verifyLastMail(String sender, String recipient, MimeMessage msg) throws ParseException {
+    public void verifyLastMail(String sender, String recipient, MimeMessage msg) throws IOException, MessagingException {
         Object[] mailData = m_mailServer.getLastMail();
         assertNotNull("mail received by mail server", mailData);
 
@@ -83,13 +94,21 @@
 
         if (sender != null) assertEquals("sender verfication", sender, ((MailAddress)mailData[0]).toString());
         if (recipient != null) assertTrue("recipient verfication", ((Collection) mailData[1]).contains(new MailAddress(recipient)));
-        if (msg != null) assertEquals("message verification", msg, ((MimeMessage) mailData[2]));
+        if (msg != null) {
+            ByteArrayOutputStream bo1 = new ByteArrayOutputStream();
+            msg.writeTo(bo1);
+            ByteArrayOutputStream bo2 = new ByteArrayOutputStream();
+            ((MimeMessage) mailData[2]).writeTo(bo2);
+            assertEquals(bo1.toString(),bo2.toString());
+            assertEquals("message verification", msg, ((MimeMessage) mailData[2]));
+        }
     }
     
     protected void setUp() throws Exception {
         m_smtpServer = new SMTPServer();
         ContainerUtil.enableLogging(m_smtpServer,new MockLogger());
-        ContainerUtil.service(m_smtpServer, setUpServiceManager());
+        m_serviceManager = setUpServiceManager();
+        ContainerUtil.service(m_smtpServer, m_serviceManager);
         m_testConfiguration = new SMTPTestConfiguration(m_smtpListenerPort);
     }
 
@@ -101,16 +120,16 @@
     }
 
     private MockServiceManager setUpServiceManager() throws Exception {
-        MockServiceManager serviceManager = new MockServiceManager();
+        m_serviceManager = new MockServiceManager();
         SimpleConnectionManager connectionManager = new SimpleConnectionManager();
         ContainerUtil.enableLogging(connectionManager, new MockLogger());
-        serviceManager.put(JamesConnectionManager.ROLE, connectionManager);
-        serviceManager.put("org.apache.mailet.MailetContext", new MockMailContext());
+        m_serviceManager.put(JamesConnectionManager.ROLE, connectionManager);
+        m_serviceManager.put("org.apache.mailet.MailetContext", new MockMailContext());
         m_mailServer = new MockMailServer();
-        serviceManager.put(MailServer.ROLE, m_mailServer);
-        serviceManager.put(UsersRepository.ROLE, m_usersRepository);
-        serviceManager.put(SocketManager.ROLE, new MockSocketManager(m_smtpListenerPort));
-        serviceManager.put(ThreadManager.ROLE, new MockThreadManager());
+        m_serviceManager.put(MailServer.ROLE, m_mailServer);
+        m_serviceManager.put(UsersRepository.ROLE, m_usersRepository);
+        m_serviceManager.put(SocketManager.ROLE, new MockSocketManager(m_smtpListenerPort));
+        m_serviceManager.put(ThreadManager.ROLE, new MockThreadManager());
         // Mock DNS Server
         DNSServer dns = new DNSServer() {
 
@@ -132,20 +151,21 @@
 
             public InetAddress[] getAllByName(String host) throws UnknownHostException
             {
-                // TODO Add the right values
-                return null;
+                return new InetAddress[] {getByName(host)};
+//                throw new UnsupportedOperationException("getByName not implemented in mock for host: "+host);
             }
 
 
             public InetAddress getByName(String host) throws UnknownHostException
             {
-                // TODO Add the right values
-                return null;
+                return InetAddress.getByName(host);
+//                throw new UnsupportedOperationException("getByName not implemented in mock for host: "+host);
             }
             
         };
-        serviceManager.put(DNSServer.ROLE, dns);
-        return serviceManager;
+        m_serviceManager.put(DNSServer.ROLE, dns);
+        m_serviceManager.put(Store.ROLE, new MockStore());
+        return m_serviceManager;
     }
 
     private LocalMimePart createMail() {
@@ -872,6 +892,69 @@
 
         smtpProtocol2.openPort();
         assertEquals("second connection not taken", SMTPProtocol.NOT_CONNECTED, smtpProtocol2.getState());
+    }
+    
+    // RemoteDelivery tests.
+    
+    InMemorySpoolRepository outgoingSpool;
+    private MockServiceManager m_serviceManager;
+    
+    private Properties getStandardParameters() {
+        Properties parameters = new Properties();
+        parameters.put("delayTime", "500 msec, 500 msec, 500 msec"); // msec, sec, minute, hour
+        parameters.put("maxRetries", "3");
+        parameters.put("deliveryThreads", "1");
+        parameters.put("debug", "true");
+        parameters.put("sendpartial", "false");
+        parameters.put("bounceProcessor", "bounce");
+        parameters.put("outgoing", "mocked://outgoing/");
+        return parameters;
+    }
+    
+
+    
+    /**
+     * This is useful code to run tests on javamail bugs 
+     * http://issues.apache.org/jira/browse/JAMES-52
+     * 
+     * This 
+     * @throws Exception
+     */
+    public void test8bitmimeFromStream() throws Exception {
+        finishSetUp(m_testConfiguration);
+        outgoingSpool = new InMemorySpoolRepository();
+        ((MockStore) m_serviceManager.lookup(Store.ROLE)).add("outgoing", outgoingSpool);
+        
+        RemoteDelivery rd = new RemoteDelivery();
+        
+        MockMailContext mmc = new MockMailContext();
+        mmc.setAttribute(Constants.AVALON_COMPONENT_MANAGER,m_serviceManager);
+        mmc.setAttribute(Constants.HELLO_NAME,"localhost");
+        MockMailetConfig mci = new MockMailetConfig("Test",mmc,getStandardParameters());
+        mci.setProperty("gateway","127.0.0.1");
+        mci.setProperty("gatewayPort",""+m_smtpListenerPort);
+        rd.init(mci);
+        
+        String sources = "Content-Type: text/plain;\r\nContent-Transfer-Encoding: quoted-printable\r\nSubject: test\r\n\r\nBody=80\r\n";
+        //String sources = "Content-Type: text/plain; charset=iso-8859-15\r\nContent-Transfer-Encoding: quoted-printable\r\nSubject: test\r\n\r\nBody=80\r\n";
+        //String sources = "Content-Type: text/plain; charset=iso-8859-15\r\nContent-Transfer-Encoding: 8bit\r\nSubject: test\r\n\r\nBody\u20AC\r\n";
+        String sender = "test@localhost";
+        String recipient = "test@localhost";
+        MimeMessage mm = new MimeMessage(Session.getDefaultInstance(new Properties()),new ByteArrayInputStream(sources.getBytes()));
+        MailImpl mail = new MailImpl("name",new MailAddress(sender),Arrays.asList(new MailAddress[] {new MailAddress(recipient)}),mm);
+        
+        rd.service(mail);
+        
+        while (outgoingSpool.size() > 0) {
+            Thread.sleep(1000);
+        }
+
+        // verifyLastMail(sender, recipient, mm);
+        verifyLastMail(sender, recipient, null);
+        
+        // THIS WOULD FAIL BECAUSE OF THE JAVAMAIL BUG
+        // assertEquals(mm.getContent(),((MimeMessage) m_mailServer.getLastMail()[2]).getContent());
+
     }
     
     

Added: james/server/trunk/src/test/org/apache/james/test/mock/james/InMemorySpoolRepository.java
URL: http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/test/mock/james/InMemorySpoolRepository.java?rev=405805&view=auto
==============================================================================
--- james/server/trunk/src/test/org/apache/james/test/mock/james/InMemorySpoolRepository.java (added)
+++ james/server/trunk/src/test/org/apache/james/test/mock/james/InMemorySpoolRepository.java Fri May 12 10:38:01 2006
@@ -0,0 +1,418 @@
+/***********************************************************************
+ * Copyright (c) 2006 The Apache Software Foundation.                  *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.mock.james;
+
+import org.apache.james.services.SpoolRepository;
+import org.apache.james.test.mock.avalon.MockLogger;
+import org.apache.james.util.Lock;
+import org.apache.mailet.Mail;
+
+import javax.mail.MessagingException;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.ConcurrentModificationException;
+import java.util.Hashtable;
+import java.util.Iterator;
+
+/**
+ * Implementation of a MailRepository on a FileSystem.
+ *
+ * Requires a configuration element in the .conf.xml file of the form:
+ *  <repository destinationURL="file://path-to-root-dir-for-repository"
+ *              type="MAIL"
+ *              model="SYNCHRONOUS"/>
+ * Requires a logger called MailRepository.
+ *
+ * @version 1.0.0, 24/04/1999
+ */
+public class InMemorySpoolRepository
+    implements SpoolRepository {
+
+    /**
+     * Whether 'deep debugging' is turned on.
+     */
+    protected final static boolean DEEP_DEBUG = true;
+    private Lock lock;
+    private MockLogger logger;
+    private Hashtable spool;
+
+    private MockLogger getLogger() {
+        if (logger == null) {
+            logger = new MockLogger();
+        }
+        return logger;
+    }
+
+    /**
+     * Releases a lock on a message identified by a key
+     *
+     * @param key the key of the message to be unlocked
+     *
+     * @return true if successfully released the lock, false otherwise
+     */
+    public boolean unlock(String key) {
+        if (lock.unlock(key)) {
+            if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+                StringBuffer debugBuffer =
+                    new StringBuffer(256)
+                            .append("Unlocked ")
+                            .append(key)
+                            .append(" for ")
+                            .append(Thread.currentThread().getName())
+                            .append(" @ ")
+                            .append(new java.util.Date(System.currentTimeMillis()));
+                getLogger().debug(debugBuffer.toString());
+            }
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Obtains a lock on a message identified by a key
+     *
+     * @param key the key of the message to be locked
+     *
+     * @return true if successfully obtained the lock, false otherwise
+     */
+    public boolean lock(String key) {
+        if (lock.lock(key)) {
+            if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+                StringBuffer debugBuffer =
+                    new StringBuffer(256)
+                            .append("Locked ")
+                            .append(key)
+                            .append(" for ")
+                            .append(Thread.currentThread().getName())
+                            .append(" @ ")
+                            .append(new java.util.Date(System.currentTimeMillis()));
+                getLogger().debug(debugBuffer.toString());
+            }
+//            synchronized (this) {
+//                notifyAll();
+//            }
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Stores a message in this repository. Shouldn't this return the key
+     * under which it is stored?
+     *
+     * @param mc the mail message to store
+     */
+    public void store(Mail mc) throws MessagingException {
+        try {
+            String key = mc.getName();
+            //Remember whether this key was locked
+            boolean wasLocked = true;
+            synchronized (this) {
+                wasLocked = lock.isLocked(key);
+    
+                if (!wasLocked) {
+                    //If it wasn't locked, we want a lock during the store
+                    lock(key);
+                }
+            }
+            try {
+                spool.put(key,mc);
+            } finally {
+                if (!wasLocked) {
+                    // If it wasn't locked, we need to unlock now
+                    unlock(key);
+                    synchronized (this) {
+                        notify();
+                    }
+                }
+            }
+
+            if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+                StringBuffer logBuffer =
+                    new StringBuffer(64)
+                            .append("Mail ")
+                            .append(key)
+                            .append(" stored.");
+                getLogger().debug(logBuffer.toString());
+            }
+
+        } catch (Exception e) {
+            getLogger().error("Exception storing mail: " + e);
+            throw new MessagingException("Exception caught while storing Message Container: ",e);
+        }
+    }
+
+    /**
+     * Retrieves a message given a key. At the moment, keys can be obtained
+     * from list() in superinterface Store.Repository
+     *
+     * @param key the key of the message to retrieve
+     * @return the mail corresponding to this key, null if none exists
+     */
+    public Mail retrieve(String key) throws MessagingException {
+        if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+            getLogger().debug("Retrieving mail: " + key);
+        }
+        try {
+            Mail mc = null;
+            try {
+                mc = (Mail) spool.get(key);
+            } 
+            catch (RuntimeException re){
+                StringBuffer exceptionBuffer = new StringBuffer(128);
+                if(re.getCause() instanceof Error){
+                    exceptionBuffer.append("Error when retrieving mail, not deleting: ")
+                            .append(re.toString());
+                }else{
+                    exceptionBuffer.append("Exception retrieving mail: ")
+                            .append(re.toString())
+                            .append(", so we're deleting it.");
+                    remove(key);
+                }
+                getLogger().warn(exceptionBuffer.toString());
+                return null;
+            }
+            return mc;
+        } catch (Exception me) {
+            getLogger().error("Exception retrieving mail: " + me);
+            throw new MessagingException("Exception while retrieving mail: " + me.getMessage());
+        }
+    }
+
+    /**
+     * Removes a specified message
+     *
+     * @param mail the message to be removed from the repository
+     */
+    public void remove(Mail mail) throws MessagingException {
+        remove(mail.getName());
+    }
+
+
+    /**
+     * Removes a Collection of mails from the repository
+     * @param mails The Collection of <code>MailImpl</code>'s to delete
+     * @throws MessagingException
+     * @since 2.2.0
+     */
+    public void remove(Collection mails) throws MessagingException {
+        Iterator delList = mails.iterator();
+        while (delList.hasNext()) {
+            remove((Mail)delList.next());
+        }
+    }
+
+    /**
+     * Removes a message identified by key.
+     *
+     * @param key the key of the message to be removed from the repository
+     */
+    public void remove(String key) throws MessagingException {
+        if (lock(key)) {
+            try {
+                if (spool != null) spool.remove(key);
+            } finally {
+                unlock(key);
+            }
+        } else {
+            StringBuffer exceptionBuffer =
+                new StringBuffer(64)
+                        .append("Cannot lock ")
+                        .append(key)
+                        .append(" to remove it");
+            throw new MessagingException(exceptionBuffer.toString());
+        }
+    }
+
+    /**
+     * List string keys of messages in repository.
+     *
+     * @return an <code>Iterator</code> over the list of keys in the repository
+     *
+     */
+    public Iterator list() {
+        // Fix ConcurrentModificationException by cloning 
+        // the keyset before getting an iterator
+        final ArrayList clone;
+        synchronized(spool) {
+            clone = new ArrayList(spool.keySet());
+        }
+        return clone.iterator();
+    }
+
+    
+    /**
+     * <p>Returns an arbitrarily selected mail deposited in this Repository.
+     * Usage: SpoolManager calls accept() to see if there are any unprocessed 
+     * mails in the spool repository.</p>
+     *
+     * <p>Synchronized to ensure thread safe access to the underlying spool.</p>
+     *
+     * @return the mail
+     */
+    public synchronized Mail accept() throws InterruptedException {
+        if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+            getLogger().debug("Method accept() called");
+        }
+        return accept(new SpoolRepository.AcceptFilter () {
+            public boolean accept (String _, String __, long ___, String ____) {
+                return true;
+            }
+
+            public long getWaitTime () {
+                return 0;
+            }
+        });
+    }
+
+    /**
+     * <p>Returns an arbitrarily selected mail deposited in this Repository that
+     * is either ready immediately for delivery, or is younger than it's last_updated plus
+     * the number of failed attempts times the delay time.
+     * Usage: RemoteDeliverySpool calls accept() with some delay and should block until an
+     * unprocessed mail is available.</p>
+     *
+     * <p>Synchronized to ensure thread safe access to the underlying spool.</p>
+     *
+     * @return the mail
+     */
+    public synchronized Mail accept(final long delay) throws InterruptedException
+    {
+        if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+            getLogger().debug("Method accept(delay) called");
+        }
+        return accept(new SpoolRepository.AcceptFilter () {
+            long youngest = 0;
+                
+                public boolean accept (String key, String state, long lastUpdated, String errorMessage) {
+                    if (state.equals(Mail.ERROR)) {
+                        //Test the time...
+                        long timeToProcess = delay + lastUpdated;
+                
+                        if (System.currentTimeMillis() > timeToProcess) {
+                            //We're ready to process this again
+                            return true;
+                        } else {
+                            //We're not ready to process this.
+                            if (youngest == 0 || youngest > timeToProcess) {
+                                //Mark this as the next most likely possible mail to process
+                                youngest = timeToProcess;
+                            }
+                            return false;
+                        }
+                    } else {
+                        //This mail is good to go... return the key
+                        return true;
+                    }
+                }
+        
+                public long getWaitTime () {
+                    if (youngest == 0) {
+                        return 0;
+                    } else {
+                        long duration = youngest - System.currentTimeMillis();
+                        youngest = 0; //get ready for next round
+                        return duration <= 0 ? 1 : duration;
+                    }
+                }
+            });
+    }
+
+
+    /**
+     * Returns an arbitrarily select mail deposited in this Repository for
+     * which the supplied filter's accept method returns true.
+     * Usage: RemoteDeliverySpool calls accept(filter) with some a filter which determines
+     * based on number of retries if the mail is ready for processing.
+     * If no message is ready the method will block until one is, the amount of time to block is
+     * determined by calling the filters getWaitTime method.
+     *
+     * <p>Synchronized to ensure thread safe access to the underlying spool.</p>
+     *
+     * @return  the mail
+     */
+    public synchronized Mail accept(SpoolRepository.AcceptFilter filter) throws InterruptedException {
+        if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+            getLogger().debug("Method accept(Filter) called");
+        }
+        while (!Thread.currentThread().isInterrupted()) try {
+            for (Iterator it = list(); it.hasNext(); ) {
+                String s = it.next().toString();
+                if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+                    StringBuffer logBuffer =
+                        new StringBuffer(64)
+                                .append("Found item ")
+                                .append(s)
+                                .append(" in spool.");
+                    getLogger().debug(logBuffer.toString());
+                }
+                if (lock(s)) {
+                    if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+                        getLogger().debug("accept(Filter) has locked: " + s);
+                    }
+                    try {
+                        Mail mail = retrieve(s);
+                        // Retrieve can return null if the mail is no longer on the spool
+                        // (i.e. another thread has gotten to it first).
+                        // In this case we simply continue to the next key
+                        if (mail == null || !filter.accept (mail.getName(),
+                                                            mail.getState(),
+                                                            mail.getLastUpdated().getTime(),
+                                                            mail.getErrorMessage())) {
+                            unlock(s);
+                            continue;
+                        }
+                        return mail;
+                    } catch (javax.mail.MessagingException e) {
+                        unlock(s);
+                        getLogger().error("Exception during retrieve -- skipping item " + s, e);
+                    }
+                }
+            }
+
+            //We did not find any... let's wait for a certain amount of time
+            wait (filter.getWaitTime());
+        } catch (InterruptedException ex) {
+            throw ex;
+        } catch (ConcurrentModificationException cme) {
+            // Should never get here now that list methods clones keyset for iterator
+            getLogger().error("CME in spooler - please report to http://james.apache.org", cme);
+        }
+        throw new InterruptedException();
+    }
+
+    /**
+     * 
+     */
+    public InMemorySpoolRepository() {
+        spool = new Hashtable();
+        lock = new Lock();
+    }
+
+    public int size() {
+        return spool.size();
+    }
+
+    public void clear() {
+        spool.clear();
+    }
+    
+}

Propchange: james/server/trunk/src/test/org/apache/james/test/mock/james/InMemorySpoolRepository.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: james/server/trunk/src/test/org/apache/james/test/mock/mailet/MockMailContext.java
URL: http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/test/mock/mailet/MockMailContext.java?rev=405805&r1=405804&r2=405805&view=diff
==============================================================================
--- james/server/trunk/src/test/org/apache/james/test/mock/mailet/MockMailContext.java (original)
+++ james/server/trunk/src/test/org/apache/james/test/mock/mailet/MockMailContext.java Fri May 12 10:38:01 2006
@@ -23,9 +23,12 @@
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Iterator;
 
 public class MockMailContext implements MailetContext {
+    
+    HashMap attributes = new HashMap();
 
     public void bounce(Mail mail, String message) throws MessagingException {
         // trivial implementation
@@ -44,11 +47,11 @@
     }
 
     public Object getAttribute(String name) {
-        return null;  // trivial implementation
+        return attributes.get(name);
     }
 
     public Iterator getAttributeNames() {
-        return null;  // trivial implementation
+        return attributes.keySet().iterator();
     }
 
     public int getMajorVersion() {
@@ -60,7 +63,7 @@
     }
 
     public String getServerInfo() {
-        return null;  // trivial implementation
+        return "Mock Server";
     }
 
     public boolean isLocalServer(String serverName) {
@@ -101,7 +104,7 @@
     }
 
     public void setAttribute(String name, Object object) {
-        // trivial implementation
+        attributes.put(name,object);
     }
 
     public void storeMail(MailAddress sender, MailAddress recipient, MimeMessage msg) throws MessagingException {



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org