/* * Copyright 2016 Anno van Vliet * * 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.jivesoftware.openfire.plugin; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.logging.Logger; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.dom.DOMElement; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import org.jivesoftware.openfire.OfflineMessage; import org.jivesoftware.openfire.OfflineMessageStore; import org.jivesoftware.openfire.PrivateStorage; import org.jivesoftware.openfire.roster.DefaultRosterItemProvider; import org.jivesoftware.openfire.roster.RosterItem; import org.jivesoftware.openfire.roster.RosterItemProvider; import org.jivesoftware.openfire.user.User; import org.jivesoftware.openfire.user.UserAlreadyExistsException; import org.jivesoftware.openfire.user.UserManager; import org.jivesoftware.openfire.vcard.VCardManager; import org.jivesoftware.util.JiveGlobals; import org.junit.Before; import org.junit.Test; import org.xmpp.packet.JID; import org.xmpp.packet.Message; /** * XEPP-0227 compliant import and export. * * @author Anno van Vliet * */ public class Xep227ExporterTest { public class TestVCardManager extends VCardManager { /* (non-Javadoc) * @see org.jivesoftware.openfire.vcard.VCardManager#getVCard(java.lang.String) */ @Override public Element getVCard(String username) { logger.finest("getVCard"); return new DOMElement("VCARD"); } } public class TestOfflineMessageStore extends OfflineMessageStore { //private Collection<OfflineMessage> offMsgs = Collections.emptyList(); /* (non-Javadoc) * @see org.jivesoftware.openfire.OfflineMessageStore#getMessages(java.lang.String, boolean) */ @Override public Collection<OfflineMessage> getMessages(String username, boolean delete) { logger.finest("getMessages"); Collection<OfflineMessage> offMsgs = new ArrayList<OfflineMessage>(); Element element = new DOMElement("message"); Date creationDate = new Date(); OfflineMessage offmsg = new OfflineMessage(creationDate, element); offmsg.setFrom(new JID("of@server.id")); offmsg.setTo(new JID("of@server.id")); offmsg.setBody("text"); offMsgs.add(offmsg); return offMsgs; } /* (non-Javadoc) * @see org.jivesoftware.openfire.OfflineMessageStore#addMessage(org.xmpp.packet.Message) */ @Override public void addMessage(Message message) { logger.finest("addMessage:" + message); assertNotNull(message); } } public class TestRosterItemProvider extends DefaultRosterItemProvider implements RosterItemProvider { /* (non-Javadoc) * @see org.jivesoftware.openfire.roster.DefaultRosterItemProvider#createItem(java.lang.String, org.jivesoftware.openfire.roster.RosterItem) */ @Override public RosterItem createItem(String username, RosterItem item) throws UserAlreadyExistsException { logger.finest("createItem:" + username + " - " + item); return item; } } private static Logger logger = Logger.getLogger(Xep227ExporterTest.class.getName()); private OfflineMessageStore offlineMessagesStore; private VCardManager vCardManager; private PrivateStorage privateStorage; private UserManager userManager; private RosterItemProvider rosterItemProvider; /** * @throws java.lang.Exception */ @Before public void setUp() throws Exception { URL url = this.getClass().getResource("test-openfire.xml"); File f = new File(url.getFile()); JiveGlobals.setConfigName(f.getName()); JiveGlobals.setHomeDirectory(f.getParent()); JiveGlobals.setProperty("provider.user.className", "org.jivesoftware.openfire.plugin.TestUserProvider"); offlineMessagesStore = new TestOfflineMessageStore(); vCardManager = new TestVCardManager(); privateStorage = null; userManager = UserManager.getInstance(); rosterItemProvider = new TestRosterItemProvider(); //Empty users List<User> l = new ArrayList<>(userManager.getUsers()); for (User user : l ) { userManager.deleteUser(user); } } /** * Test method for {@link org.jivesoftware.openfire.plugin.OpenfireExporter#exportUsers(org.jivesoftware.openfire.user.UserManager)}. * @throws UserAlreadyExistsException * @throws IOException */ @Test public void testExportUsers() throws UserAlreadyExistsException, IOException { InExporter testobject = new Xep227Exporter("serverName", offlineMessagesStore, vCardManager, privateStorage, userManager, null); for (int i = 0; i < 10; i++) { userManager.createUser("username" + i,"pw" , "name" + i, "email" + i); } Document result = testobject.exportUsers(); assertNotNull(result); assertEquals(1, result.nodeCount()); assertNotNull(result.node(0)); Element elem = ((Element)result.node(0)); assertEquals(1, elem.nodeCount()); assertNotNull(elem.node(0)); elem = ((Element)elem.node(0)); assertEquals(10, elem.nodeCount()); assertNotNull(elem.node(0)); elem = ((Element)elem.node(0)); assertEquals(3, elem.nodeCount()); assertEquals(2, elem.attributeCount()); ByteArrayOutputStream out = new ByteArrayOutputStream(); XMLWriter writer = new XMLWriter(out, OutputFormat.createPrettyPrint()); writer.write(result); logger.fine(out.toString() ); assertTrue("Invalid input", testobject.validate(new ByteArrayInputStream(out.toByteArray()))); } /** * @throws IOException * @throws DocumentException * */ @Test public void testValidateUser() throws DocumentException, IOException { logger.finest("testImportUser"); InExporter testobject = new Xep227Exporter("serverName", offlineMessagesStore, vCardManager, privateStorage, userManager, rosterItemProvider); InputStream stream = this.getClass().getResourceAsStream("test-xepp227-import.xml"); assertTrue("Invalid input", testobject.validate(stream)); stream.close(); } /** * @throws IOException * @throws DocumentException * */ @Test public void testImportUser() throws DocumentException, IOException { logger.finest("testImportUser"); InExporter testobject = new Xep227Exporter("serverName", offlineMessagesStore, vCardManager, privateStorage, userManager, rosterItemProvider); InputStream stream = this.getClass().getResourceAsStream("test-xepp227-import.xml"); String previousDomain = null; boolean isUserProviderReadOnly = false; List<String> res = testobject.importUsers(stream, previousDomain, isUserProviderReadOnly); assertNotNull(res); assertEquals(0, res.size()); stream.close(); Collection<User> users = userManager.getUsers(); assertEquals(4, users.size()); } /** * Test if XInclude is working * * @throws IOException * @throws DocumentException * */ @Test public void testImportXInclude() throws DocumentException, IOException { logger.finest("testImportIncludeUser"); InExporter testobject = new Xep227Exporter("serverName", offlineMessagesStore, vCardManager, privateStorage, userManager, rosterItemProvider); String IMPORT_FILE_NAME = "/test-export-xinclude/xep227.xml"; URL streamurl = this.getClass().getResource(IMPORT_FILE_NAME); assertNotNull(streamurl); logger.fine("testImportIncludeUser:"+ streamurl.getFile()); InputStream stream = new FileInputStream(streamurl.getFile()); assertTrue("Invalid input", testobject.validate(stream)); stream.close(); String previousDomain = null; boolean isUserProviderReadOnly = false; stream = this.getClass().getResourceAsStream(IMPORT_FILE_NAME); List<String> res = testobject.importUsers(stream, previousDomain, isUserProviderReadOnly); assertNotNull(res); assertEquals(0, res.size()); stream.close(); Collection<User> users = userManager.getUsers(); assertEquals(2, users.size()); } }