blob: f647aa65247cd5fe482ccf46c9af0085e1c23ba6 [file] [log] [blame]
/*
* 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.sling.mailarchiveserver.impl;
import static org.apache.sling.mailarchiveserver.impl.MessageStoreImplRepositoryTestUtil.assertValueMap;
import static org.apache.sling.mailarchiveserver.impl.MessageStoreImplRepositoryTestUtil.getResourcePath;
import static org.apache.sling.mailarchiveserver.impl.MessageStoreImplRepositoryTestUtil.readTextFile;
import static org.apache.sling.mailarchiveserver.impl.MessageStoreImplRepositoryTestUtil.specialPathFromFilePath;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.james.mime4j.MimeException;
import org.apache.james.mime4j.dom.Message;
import org.apache.james.mime4j.dom.MessageBuilder;
import org.apache.james.mime4j.message.DefaultMessageBuilder;
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.discovery.impl.setup.MockedResourceResolver;
import org.apache.sling.mailarchiveserver.api.MboxParser;
import org.apache.sling.mailarchiveserver.util.MailArchiveServerConstants;
import org.apache.sling.mailarchiveserver.util.TU;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class MessageStoreImplRepositoryTest {
private ResourceResolver resolver;
private Resource testRoot;
private MessageStoreImpl store;
static final String TEST_RT_KEY = "sling_resourceType";
private static final String BODY_SUFFIX = "_body";
private static final String HEADERS_SUFFIX = "_headers";
private static final String SINGLEPART_FILE = "singlepart.txt";
private static final String MULTIPART_FILE = "multipart.txt";
private static final String WRONGBODY_FILE = "wrongbody.txt";
private static final String MBOX_FILE = "three_messages.mbox";
/**
* Some code is taken from http://svn.apache.org/repos/asf/sling/trunk/launchpad/test-services/src/main/java/org/apache/sling/launchpad/testservices/serversidetests/WriteableResourcesTest.java
*/
@Before
public void setup() throws Exception {
resolver = new MockedResourceResolver();
assertNotNull("Expecting non-null ResourceResolver", resolver);
final Resource root = resolver.getResource("/");
assertNotNull("Expecting non-null root Resource", root);
final String path = getClass().getSimpleName() + "_" + System.currentTimeMillis();
testRoot = resolver.create(root, path, null);
resolver.commit();
store = new MessageStoreImpl() {
protected ResourceResolver getResourceResolver() {
return resolver;
}
};
store.threadKeyGen = new ThreadKeyGeneratorImpl();
store.archivePath = testRoot.getPath() + "/";
store.resourceTypeKey = TEST_RT_KEY;
}
@After
public void cleanup() throws Exception {
resolver.close();
resolver = null;
testRoot = null;
store = null;
}
@Test
public void testSaveMessage() throws FileNotFoundException, MimeException, IOException {
assertSaveMessage(SINGLEPART_FILE);
assertSaveMessage(MULTIPART_FILE);
assertSaveMessage(WRONGBODY_FILE);
}
@Test
public void testStructure() throws IOException {
MboxParser parser = new Mime4jMboxParserImpl();
final File file = new File(TU.TEST_FOLDER, MBOX_FILE);
store.saveAll(parser.parse(new FileInputStream(file)));
assertStructure();
}
private void assertSaveMessage(String messageFile) throws MimeException, IOException, FileNotFoundException {
MessageBuilder builder = new DefaultMessageBuilder();
Message msg = builder.parseMessage(new FileInputStream(new File(TU.TEST_FOLDER, messageFile)));
store.save(msg);
final Resource r = resolver.getResource(getResourcePath(msg, store));
assertNotNull("Expecting non-null Resource", r);
final ModifiableValueMap m = r.adaptTo(ModifiableValueMap.class);
File bodyFile = new File(TU.TEST_FOLDER, specialPathFromFilePath(messageFile, BODY_SUFFIX));
if (bodyFile.exists()) {
String expectedBody = readTextFile(bodyFile);
assertValueMap(m, "Body", expectedBody);
}
File headersFile = new File(TU.TEST_FOLDER, specialPathFromFilePath(messageFile, HEADERS_SUFFIX));
if (headersFile.exists()) {
MessageStoreImplRepositoryTestUtil.assertHeaders(headersFile, m);
}
assertTrue(headersFile.exists() || bodyFile.exists()); // test at least something
}
private void assertStructure() {
List<String> types = new ArrayList<String>();
types.add(MailArchiveServerConstants.DOMAIN_RT);
types.add(MailArchiveServerConstants.LIST_RT);
types.add(null);
types.add(null);
types.add(MailArchiveServerConstants.THREAD_RT);
types.add(MailArchiveServerConstants.MESSAGE_RT);
MessageStoreImplRepositoryTestUtil.assertLayer(testRoot, types, 0);
}
}