From 0fa945a7ed7194f2e667af723641f0441a30dcac Mon Sep 17 00:00:00 2001
From: Daryl <djr031@cs.bham.ac.uk>
Date: Fri, 7 Sep 2012 16:40:39 +0800
Subject: [PATCH] Updated gmail plugin and unit test, removed unused class.

---
 .../simplex/SimplexTransportReader.java       |   3 +-
 .../simplex/SimplexTransportWriter.java       |   3 +-
 .../sf/briar/plugins/email/GmailPlugin.java   | 212 +++++++++++-------
 .../email/GmailTransportConnectionReader.java |  33 ---
 ...PluginTester.java => GmailPluginTest.java} | 103 ++++-----
 5 files changed, 181 insertions(+), 173 deletions(-)
 delete mode 100644 components/net/sf/briar/plugins/email/GmailTransportConnectionReader.java
 rename test/net/sf/briar/plugins/email/{GmailPluginTester.java => GmailPluginTest.java} (59%)

diff --git a/api/net/sf/briar/api/plugins/simplex/SimplexTransportReader.java b/api/net/sf/briar/api/plugins/simplex/SimplexTransportReader.java
index a71b1e8f79..5ffc0635c1 100644
--- a/api/net/sf/briar/api/plugins/simplex/SimplexTransportReader.java
+++ b/api/net/sf/briar/api/plugins/simplex/SimplexTransportReader.java
@@ -18,6 +18,7 @@ public interface SimplexTransportReader {
 	 * argument indicates whether the reader is being closed because of an
 	 * exception and the second argument indicates whether the connection was
 	 * recognised, which may affect how resources are disposed of.
+	 * @throws IOException 
 	 */
-	void dispose(boolean exception, boolean recognised);
+	void dispose(boolean exception, boolean recognised) throws IOException;
 }
diff --git a/api/net/sf/briar/api/plugins/simplex/SimplexTransportWriter.java b/api/net/sf/briar/api/plugins/simplex/SimplexTransportWriter.java
index a6f55ed4c7..09e80a5cfa 100644
--- a/api/net/sf/briar/api/plugins/simplex/SimplexTransportWriter.java
+++ b/api/net/sf/briar/api/plugins/simplex/SimplexTransportWriter.java
@@ -25,6 +25,7 @@ public interface SimplexTransportWriter {
 	 * Closes the writer and disposes of any associated resources. The
 	 * argument indicates whether the writer is being closed because of an
 	 * exception, which may affect how resources are disposed of.
+	 * @throws IOException 
 	 */
-	void dispose(boolean exception);
+	void dispose(boolean exception) throws IOException;
 }
diff --git a/components/net/sf/briar/plugins/email/GmailPlugin.java b/components/net/sf/briar/plugins/email/GmailPlugin.java
index 718b66bd74..323afd885d 100644
--- a/components/net/sf/briar/plugins/email/GmailPlugin.java
+++ b/components/net/sf/briar/plugins/email/GmailPlugin.java
@@ -1,5 +1,6 @@
 package net.sf.briar.plugins.email;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -8,6 +9,11 @@ import java.util.Collection;
 import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.Executor;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 import javax.mail.Folder;
@@ -19,8 +25,11 @@ import javax.mail.Session;
 import javax.mail.Store;
 import javax.mail.Transport;
 import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
 import javax.mail.search.FlagTerm;
+import javax.mail.util.ByteArrayDataSource;
 import javax.microedition.io.StreamConnection;
 
 import net.sf.briar.api.ContactId;
@@ -44,7 +53,9 @@ public class GmailPlugin implements SimplexPlugin {
 	private static final TransportId ID = new TransportId(TRANSPORT_ID);
 	private final Executor pluginExecutor;
 	private final SimplexPluginCallback callback;
-	// private static GmailTransportConnectionReader reader;
+	private static final Logger LOG = Logger.getLogger(GmailPlugin.class
+			.getName());
+
 	// private static GmailTransportConnectionWriter writer;
 
 	public GmailPlugin(Executor pluginExecutor, SimplexPluginCallback callback) {
@@ -64,118 +75,100 @@ public class GmailPlugin implements SimplexPlugin {
 		});
 	}
 
-	protected void checkUnreadEmails(Folder inbox) {
+	private void checkUnreadEmails(Folder inbox) {
 		try {
 			FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
 			Message msg[] = inbox.search(ft);
 			// System.out.println("Unread Messages: "+ msg.length);
 			for (final Message message : msg) {
-				try {
-					callback.readerCreated(new SimplexTransportReader() {
-
-						public InputStream getInputStream() throws IOException {
-							try {
-								return message.getInputStream();
-							} catch (MessagingException e) {
-								e.printStackTrace();
-							}
-							return null;
+				callback.readerCreated(new SimplexTransportReader() {
+
+					public InputStream getInputStream() throws IOException {
+						try {
+							return message.getInputStream();
+						} catch (MessagingException e) {
+							if (LOG.isLoggable(Level.WARNING))
+								LOG.warning(e.toString());
 						}
-
-						public void dispose(boolean exception,
-								boolean recognised) {
-							try {
-								message.setFlag(Flag.DELETED, recognised);
-								message.setFlag(Flag.SEEN, recognised);
-							} catch (MessagingException e) {
-								e.printStackTrace();
-							}
+						return null;
+					}
+
+					public void dispose(boolean exception, boolean recognised)
+							throws IOException {
+						try {
+							message.setFlag(Flag.DELETED, recognised);
+							message.setFlag(Flag.SEEN, recognised);
+						} catch (MessagingException e) {
+							if (LOG.isLoggable(Level.WARNING))
+								LOG.warning(e.toString());
 						}
-					});
-
-					// This part for testing purposes only
-					System.out.println("DATE: "
-							+ message.getSentDate().toString());
-					System.out.println("FROM: "
-							+ message.getFrom()[0].toString());
-					System.out.println("SUBJECT: "
-							+ message.getSubject().toString());
-					System.out.println("CONTENT: "
-							+ message.getContent().toString());
-					System.out
-							.println("=================================================");
+					}
+				});
 
-				} catch (Exception e) {
-					System.out.println("No Information");
-				}
 			}
-
 		} catch (MessagingException e) {
-			System.out.println(e.toString());
+			if (LOG.isLoggable(Level.WARNING))
+				LOG.warning(e.toString());
 		}
 	}
 
-	protected void connectIMAP() {
-		Properties props = System.getProperties();
+	private void connectIMAP() {
+		Properties props = new Properties();
 		props.setProperty("mail.store.protocol", "imaps");
 		final ArrayList<String> userPass = getAuthenticationDetails(callback
 				.getConfig());
 		if (userPass != null) {
 			try {
-				Session session = Session.getDefaultInstance(props, null);
+				Session session = Session.getInstance(props, null);
 				Store store = session.getStore("imaps");
-				synchronized (this) {
-					store.connect("imap.gmail.com", userPass.get(0),
-							userPass.get(1));
-				}
-
+				store.connect("imap.gmail.com", userPass.get(0),
+						userPass.get(1));
 				Folder inbox = store.getFolder("Inbox");
 				inbox.open(Folder.READ_ONLY);
 				checkUnreadEmails(inbox);
 			} catch (NoSuchProviderException e) {
-				System.out.println(e.toString());
-				System.exit(1);
+				if (LOG.isLoggable(Level.WARNING))
+					LOG.warning(e.toString());
 			} catch (MessagingException e) {
-				System.out.println(e.toString());
-				System.exit(2);
+				if (LOG.isLoggable(Level.WARNING))
+					LOG.warning(e.toString());
 			}
 		}
 	}
 
-	protected boolean connectSMTP(ContactId cid) {
+	public boolean connectSMTP(ContactId cid) {
 		boolean sent = false;
 		if (discoverContactEmail(cid) != null) {
-			Properties prop = new Properties();
-			prop.put("mail.smtp.host", "smtp.gmail.com");
-			prop.put("mail.smtp.socketFactory.port", "465");
-			prop.put("mail.smtp.socketFactory.class",
+			Properties props = new Properties();
+			props.put("mail.smtp.host", "smtp.gmail.com");
+			props.put("mail.smtp.socketFactory.port", "465");
+			props.put("mail.smtp.socketFactory.class",
 					"javax.net.ssl.SSLSocketFactory");
-			prop.put("mail.smtp.auth", "true");
-			prop.put("mail.smtp.port", "465");
+			props.put("mail.smtp.auth", "true");
+			props.put("mail.smtp.port", "465");
 
 			final ArrayList<String> userPass = getAuthenticationDetails(callback
 					.getConfig());
 
 			if (userPass != null) {
 				Session session;
-				synchronized (this) {
-					session = Session.getInstance(prop,
-							new javax.mail.Authenticator() {
-								protected PasswordAuthentication getPasswordAuthentication() {
-									return new PasswordAuthentication(userPass
-											.get(0), userPass.get(1));
-								}
-							});
-				}
-				// SimplexTransportWriter writer = createWriter(cid);
+				session = Session.getInstance(props,
+						new javax.mail.Authenticator() {
+							protected PasswordAuthentication getPasswordAuthentication() {
+								return new PasswordAuthentication(userPass
+										.get(0), userPass.get(1));
+							}
+						});
+
 				sent = sendMessage(session, cid);
 			}
 		}
 		return sent;
 	}
 
-	private synchronized boolean sendMessage(Session session, ContactId cid) {
+	private boolean sendMessage(Session session, ContactId cid) {
 		boolean sent = false;
+		ByteArrayOutputStream outputStream = null;
 		try {
 			Message message = new MimeMessage(session);
 			TransportProperties props = callback.getLocalProperties();
@@ -185,7 +178,41 @@ public class GmailPlugin implements SimplexPlugin {
 			message.setRecipients(Message.RecipientType.TO,
 					InternetAddress.parse(discoverContactEmail(cid)));
 			message.setSubject("Test Subject");
-			message.setText("Test content");
+
+			outputStream = new ByteArrayOutputStream();
+
+			callback.writerCreated(cid, new SimplexTransportWriter() {
+
+				public boolean shouldFlush() {
+					return false;
+				}
+
+				public OutputStream getOutputStream() throws IOException {
+					return null;
+				}
+
+				public long getCapacity() {
+					return 0;
+				}
+
+				public void dispose(boolean exception) throws IOException {
+
+				}
+			});
+
+			byte[] bytes = outputStream.toByteArray();
+			DataSource dataSource = new ByteArrayDataSource(bytes,
+					"application/octet-stream");
+
+			MimeBodyPart messageBodyPart = new MimeBodyPart();
+			messageBodyPart.setDataHandler(new DataHandler(dataSource));
+
+			MimeMultipart mimeMultipart = new MimeMultipart();
+			mimeMultipart.addBodyPart(messageBodyPart);
+
+			message.setContent(mimeMultipart);
+
+			// message.setText("Test content");
 
 			Transport.send(message);
 
@@ -193,6 +220,16 @@ public class GmailPlugin implements SimplexPlugin {
 			return sent;
 		} catch (MessagingException e) {
 			return sent;
+		} finally {
+			if (null != outputStream) {
+				try {
+					outputStream.close();
+					outputStream = null;
+				} catch (Exception e) {
+					if (LOG.isLoggable(Level.WARNING))
+						LOG.warning(e.toString());
+				}
+			}
 		}
 
 	}
@@ -207,12 +244,12 @@ public class GmailPlugin implements SimplexPlugin {
 		return false;
 	}
 
-	public long getPollingInterval() throws UnsupportedOperationException {
-		return 0;
+	public long getPollingInterval() {
+		throw new UnsupportedOperationException();
 	}
 
-	public void poll(Collection<ContactId> connected)
-			throws UnsupportedOperationException {
+	public void poll(Collection<ContactId> connected) {
+		throw new UnsupportedOperationException();
 	}
 
 	public boolean supportsInvitations() {
@@ -238,7 +275,7 @@ public class GmailPlugin implements SimplexPlugin {
 	}
 
 	/*
-	 * looks up the contact's email address given the contactID
+	 * Looks up the contact's email address given the contactID
 	 * @param ContactId
 	 * @return String email
 	 */
@@ -247,8 +284,11 @@ public class GmailPlugin implements SimplexPlugin {
 			Map<ContactId, TransportProperties> remote = callback
 					.getRemoteProperties();
 			TransportProperties tp = remote.get(cid);
-			String address = tp.get("email");
-			return address;
+			if (tp != null) {
+				String address = tp.get("email");
+				return address;
+			} else
+				return null;
 		} catch (Exception e) {
 			return null;
 		}
@@ -262,24 +302,22 @@ public class GmailPlugin implements SimplexPlugin {
 		return null;
 	}
 
-	public SimplexTransportWriter sendInvitation(PseudoRandom r, long timeout)
-			throws UnsupportedOperationException {
-		return null;
+	public SimplexTransportWriter sendInvitation(PseudoRandom r, long timeout) {
+		throw new UnsupportedOperationException();
 	}
 
-	public SimplexTransportReader acceptInvitation(PseudoRandom r, long timeout)
-			throws UnsupportedOperationException {
-		return null;
+	public SimplexTransportReader acceptInvitation(PseudoRandom r, long timeout) {
+		throw new UnsupportedOperationException();
 	}
 
 	public SimplexTransportWriter sendInvitationResponse(PseudoRandom r,
-			long timeout) throws UnsupportedOperationException {
-		return null;
+			long timeout) {
+		throw new UnsupportedOperationException();
 	}
 
 	public SimplexTransportReader acceptInvitationResponse(PseudoRandom r,
-			long timeout) throws UnsupportedOperationException {
-		return null;
+			long timeout) {
+		throw new UnsupportedOperationException();
 	}
 
 }
diff --git a/components/net/sf/briar/plugins/email/GmailTransportConnectionReader.java b/components/net/sf/briar/plugins/email/GmailTransportConnectionReader.java
deleted file mode 100644
index 954678525f..0000000000
--- a/components/net/sf/briar/plugins/email/GmailTransportConnectionReader.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package net.sf.briar.plugins.email;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.microedition.io.StreamConnection;
-
-import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
-
-public class GmailTransportConnectionReader implements SimplexTransportReader{
-
-	private static final Logger LOG = Logger.getLogger(GmailTransportConnectionReader.class.getName());
-	private final StreamConnection stream;
-
-	GmailTransportConnectionReader(StreamConnection stream) {
-			this.stream = stream;
-	}
-	
-	public InputStream getInputStream() throws IOException {
-			return stream.openInputStream();
-	}
-
-	public void dispose(boolean exception, boolean recognised) {
-		try {
-			stream.close();
-		} catch(IOException e) {
-			if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.toString());
-		}		
-	}
-
-}
diff --git a/test/net/sf/briar/plugins/email/GmailPluginTester.java b/test/net/sf/briar/plugins/email/GmailPluginTest.java
similarity index 59%
rename from test/net/sf/briar/plugins/email/GmailPluginTester.java
rename to test/net/sf/briar/plugins/email/GmailPluginTest.java
index 3db67819f8..cf5ddc8d55 100644
--- a/test/net/sf/briar/plugins/email/GmailPluginTester.java
+++ b/test/net/sf/briar/plugins/email/GmailPluginTest.java
@@ -1,13 +1,17 @@
 package net.sf.briar.plugins.email;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
 import java.util.concurrent.Executors;
 
+import net.sf.briar.BriarTestCase;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
@@ -15,6 +19,7 @@ import net.sf.briar.api.plugins.simplex.SimplexPluginCallback;
 import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
 import net.sf.briar.api.plugins.simplex.SimplexTransportWriter;
 
+import org.jmock.Mockery;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -23,104 +28,100 @@ import org.junit.Test;
  * and CONTACT1_EMAIL - (as recipient email address)
  */
 
-public class GmailPluginTester {
+public class GmailPluginTest {
+
+	SimplexPluginCallback callback;
+	TransportProperties local, props1;
+	TransportConfig config;
+	ContactId test1;
+	Map<ContactId, TransportProperties> map = new HashMap<ContactId, TransportProperties>();
 
-SimplexPluginCallback callback;	
-TransportProperties local, props1;
-TransportConfig config;
-ContactId test1;
-Map<ContactId,TransportProperties> map = new HashMap<ContactId, TransportProperties>();
-	
 	@Before
-	public void setup()
-	{
+	public void setup() {
 		local = new TransportProperties();
-		local.put("email",System.getenv("USER_GMAIL_ADDRESS"));
-		
+		local.put("email", System.getenv("USER_GMAIL_ADDRESS"));
+
 		config = new TransportConfig();
 		config.put("username", System.getenv("GMAIL_USERNAME"));
 		config.put("password", System.getenv("GMAIL_PASSWORD"));
-		
+
 		props1 = new TransportProperties();
 		props1.put("email", System.getenv("CONTACT1_EMAIL"));
 		test1 = new ContactId(12);
 		map.put(test1, props1);
-		assertEquals(1,map.size());
-		
+		assertEquals(1, map.size());
+
 		callback = new SimplexPluginCallback() {
-			
-			public void showMessage(String... message) {
-								
-			}
-			
+
+			public void showMessage(String... message) {}
+
 			public boolean showConfirmationMessage(String... message) {
 				return false;
 			}
-			
+
 			public int showChoice(String[] options, String... message) {
 				return 0;
 			}
-			
+
 			public void setLocalProperties(TransportProperties p) {
 				local = p;
 			}
-			
+
 			public void setConfig(TransportConfig c) {
 				config = c;
 			}
-						
+
 			public Map<ContactId, TransportProperties> getRemoteProperties() {
 				return map;
 			}
-			
+
 			public TransportProperties getLocalProperties() {
 				return local;
 			}
-			
+
 			public TransportConfig getConfig() {
 				return config;
 			}
-			
+
 			public void writerCreated(ContactId c, SimplexTransportWriter w) {}
-			
+
 			public void readerCreated(SimplexTransportReader r) {}
 		};
-		
-		callback.setLocalProperties(local);		
+
+		callback.setLocalProperties(local);
 		callback.setConfig(config);
 	}
-	
-	@Test
-	public void testGetID()
-	{
-		GmailPlugin pluginTest = new GmailPlugin(Executors.newSingleThreadExecutor(), callback);
-		assertArrayEquals(GmailPlugin.TRANSPORT_ID,pluginTest.getId().getBytes());
-	}
-	
+
 	@Test
-	public void testPluginFactoryCreation()
-	{
-		GmailPluginFactory plugin = new GmailPluginFactory();
-		plugin.createPlugin(Executors.newSingleThreadExecutor(), callback);
+	public void testGetID() throws IOException {
+		GmailPlugin pluginTest = new GmailPlugin(
+				Executors.newSingleThreadExecutor(), callback);
+		assertArrayEquals(GmailPlugin.TRANSPORT_ID, pluginTest.getId()
+				.getBytes());
 	}
-	
+
 	@Test
-	public void testGmailPluginIMAP()
-	{
-		GmailPlugin pluginTest = new GmailPlugin(Executors.newSingleThreadExecutor(), callback);
+	public void testGmailPluginIMAP() throws IOException {
+		GmailPlugin pluginTest = new GmailPlugin(
+				Executors.newSingleThreadExecutor(), callback);
 		try {
 			pluginTest.start();
 		} catch (IOException e) {
 			System.out.println("IO Exception got caught");
+			fail();
+		}
+		finally{
+			pluginTest.stop();
 		}
 	}
-	
+
 	@Test
-	public void testGmailSMTP()
-	{
-		GmailPlugin pluginTest = new GmailPlugin(Executors.newSingleThreadExecutor(), callback);
+	public void testGmailSMTP() throws IOException {
+		GmailPlugin pluginTest = new GmailPlugin(
+				Executors.newSingleThreadExecutor(), callback);
 		assertEquals(true, pluginTest.connectSMTP(test1));
 		assertEquals(false, pluginTest.connectSMTP(new ContactId(7)));
+		pluginTest.stop();
 	}
 
 }
-- 
GitLab