blob: 3a465124ed9ce4bba2a5964961d5a593e316adbc [file] [log] [blame]
/*
* 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.wiki.attachment;
import net.sf.ehcache.CacheManager;
import org.apache.wiki.TestEngine;
import org.apache.wiki.WikiContext;
import org.apache.wiki.api.core.Attachment;
import org.apache.wiki.api.exceptions.ProviderException;
import org.apache.wiki.api.exceptions.WikiException;
import org.apache.wiki.api.spi.Wiki;
import org.apache.wiki.pages.PageManager;
import org.apache.wiki.util.FileUtil;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;
public class AttachmentManagerTest {
public static final String NAME1 = "TestPage";
public static final String NAMEU = "TestPage\u00e6";
TestEngine m_engine;
AttachmentManager m_manager;
static String c_fileContents = "ABCDEFGHIJKLMNOPQRSTUVWxyz";
@BeforeEach
public void setUp() throws Exception {
m_engine = TestEngine.build();
m_manager = m_engine.getManager( AttachmentManager.class );
m_engine.saveText( NAME1, "Foobar" );
m_engine.saveText( NAMEU, "Foobar" );
}
private File makeAttachmentFile() throws Exception {
final File tmpFile = File.createTempFile("test","txt");
tmpFile.deleteOnExit();
try( final FileWriter out = new FileWriter( tmpFile ) ) {
FileUtil.copyContents( new StringReader( c_fileContents ), out );
}
return tmpFile;
}
@AfterEach
public void tearDown() {
m_engine.deleteTestPage( NAME1 );
m_engine.deleteTestPage( NAMEU );
TestEngine.deleteAttachments(NAME1);
TestEngine.deleteAttachments(NAMEU);
TestEngine.emptyWorkDir();
final CacheManager m_cacheManager = CacheManager.getInstance();
m_cacheManager.clearAll();
m_cacheManager.removeAllCaches();
}
@Test
public void testEnabled()
{
Assertions.assertTrue( m_manager.attachmentsEnabled(), "not enabled" );
}
@Test
public void testSimpleStore()
throws Exception
{
final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.txt" );
att.setAuthor( "FirstPost" );
m_manager.storeAttachment( att, makeAttachmentFile() );
final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine, Wiki.contents().page(m_engine, NAME1)), "test1.txt" );
Assertions.assertNotNull( att2, "attachment disappeared" );
Assertions.assertEquals( att.getName(), att2.getName(), "name" );
Assertions.assertEquals( att.getAuthor(), att2.getAuthor(), "author" );
Assertions.assertEquals( c_fileContents.length(), att2.getSize(), "size" );
final InputStream in = m_manager.getAttachmentStream( att2 );
Assertions.assertNotNull( in, "stream" );
final StringWriter sout = new StringWriter();
FileUtil.copyContents( new InputStreamReader(in), sout );
in.close();
sout.close();
Assertions.assertEquals( c_fileContents, sout.toString(), "contents" );
}
@Test
public void testSimpleStoreSpace()
throws Exception
{
final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test file.txt" );
att.setAuthor( "FirstPost" );
m_manager.storeAttachment( att, makeAttachmentFile() );
final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine, Wiki.contents().page(m_engine, NAME1)),"test file.txt" );
Assertions.assertNotNull( att2, "attachment disappeared" );
Assertions.assertEquals( att.getName(), att2.getName(), "name" );
Assertions.assertEquals( att.getAuthor(), att2.getAuthor(), "author" );
Assertions.assertEquals( c_fileContents.length(), att2.getSize(), "size" );
final InputStream in = m_manager.getAttachmentStream( att2 );
Assertions.assertNotNull( in, "stream" );
final StringWriter sout = new StringWriter();
FileUtil.copyContents( new InputStreamReader(in), sout );
in.close();
sout.close();
Assertions.assertEquals( c_fileContents, sout.toString(), "contents" );
}
@Test
public void testSimpleStoreByVersion()
throws Exception
{
final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.txt" );
att.setAuthor( "FirstPost" );
m_manager.storeAttachment( att, makeAttachmentFile() );
final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine, Wiki.contents().page(m_engine, NAME1)), "test1.txt", 1 );
Assertions.assertNotNull( att2, "attachment disappeared" );
Assertions.assertEquals( 1, att2.getVersion(), "version" );
Assertions.assertEquals( att.getName(), att2.getName(), "name" );
Assertions.assertEquals( att.getAuthor(), att2.getAuthor(), "author" );
Assertions.assertEquals( c_fileContents.length(), att2.getSize(), "size" );
final InputStream in = m_manager.getAttachmentStream( att2 );
Assertions.assertNotNull( in, "stream" );
final StringWriter sout = new StringWriter();
FileUtil.copyContents( new InputStreamReader(in), sout );
in.close();
sout.close();
Assertions.assertEquals( c_fileContents, sout.toString(), "contents" );
}
@Test
public void testMultipleStore()
throws Exception
{
final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.txt" );
att.setAuthor( "FirstPost" );
m_manager.storeAttachment( att, makeAttachmentFile() );
att.setAuthor( "FooBar" );
m_manager.storeAttachment( att, makeAttachmentFile() );
final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine, Wiki.contents().page(m_engine, NAME1)), "test1.txt" );
Assertions.assertNotNull( att2, "attachment disappeared" );
Assertions.assertEquals( att.getName(), att2.getName(), "name" );
Assertions.assertEquals( att.getAuthor(), att2.getAuthor(), "author" );
Assertions.assertEquals( 2, att2.getVersion(), "version" );
final InputStream in = m_manager.getAttachmentStream( att2 );
Assertions.assertNotNull( in, "stream" );
final StringWriter sout = new StringWriter();
FileUtil.copyContents( new InputStreamReader(in), sout );
in.close();
sout.close();
Assertions.assertEquals( c_fileContents, sout.toString(), "contents" );
//
// Check that first author did not disappear
//
final Attachment att3 = m_manager.getAttachmentInfo( new WikiContext(m_engine, Wiki.contents().page(m_engine, NAME1)), "test1.txt", 1 );
Assertions.assertEquals( 1, att3.getVersion(), "version of v1" );
Assertions.assertEquals( "FirstPost", att3.getAuthor(), "name of v1" );
}
@Test
public void testListAttachments()
throws Exception
{
final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.txt" );
att.setAuthor( "FirstPost" );
m_manager.storeAttachment( att, makeAttachmentFile() );
final List< Attachment > c = m_manager.listAttachments( Wiki.contents().page(m_engine, NAME1) );
Assertions.assertEquals( 1, c.size(), "Length" );
final Attachment att2 = (Attachment) c.toArray()[0];
Assertions.assertEquals( att.getName(), att2.getName(), "name" );
Assertions.assertEquals( att.getAuthor(), att2.getAuthor(), "author" );
}
@Test
public void testSimpleStoreWithoutExt() throws Exception
{
final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1" );
att.setAuthor( "FirstPost" );
m_manager.storeAttachment( att, makeAttachmentFile() );
final Attachment att2 = m_manager.getAttachmentInfo( new WikiContext(m_engine,
Wiki.contents().page(m_engine, NAME1)),
"test1" );
Assertions.assertNotNull( att2, "attachment disappeared" );
Assertions.assertEquals( att.getName(), att2.getName(), "name" );
Assertions.assertEquals( att.getAuthor(), att2.getAuthor(), "author" );
Assertions.assertEquals( c_fileContents.length(), att2.getSize(), "size" );
Assertions.assertEquals( 1, att2.getVersion(), "version" );
final InputStream in = m_manager.getAttachmentStream( att2 );
Assertions.assertNotNull( in, "stream" );
final StringWriter sout = new StringWriter();
FileUtil.copyContents( new InputStreamReader(in), sout );
in.close();
sout.close();
Assertions.assertEquals( c_fileContents, sout.toString(), "contents" );
}
@Test
public void testExists() throws Exception
{
final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1" );
att.setAuthor( "FirstPost" );
m_manager.storeAttachment( att, makeAttachmentFile() );
Assertions.assertTrue( m_engine.getManager( PageManager.class ).wikiPageExists( NAME1+"/test1" ), "attachment disappeared" );
}
@Test
public void testExists2() throws Exception
{
final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test1.bin" );
att.setAuthor( "FirstPost" );
m_manager.storeAttachment( att, makeAttachmentFile() );
Assertions.assertTrue( m_engine.getManager( PageManager.class ).wikiPageExists( att.getName() ), "attachment disappeared" );
}
@Test
public void testExistsSpace() throws Exception
{
final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test file.bin" );
att.setAuthor( "FirstPost" );
m_manager.storeAttachment( att, makeAttachmentFile() );
Assertions.assertTrue( m_engine.getManager( PageManager.class ).wikiPageExists( NAME1+"/test file.bin" ), "attachment disappeared" );
}
@Test
public void testExistsUTF1() throws Exception
{
final Attachment att = Wiki.contents().attachment( m_engine, NAME1, "test\u00e4.bin" );
att.setAuthor( "FirstPost" );
m_manager.storeAttachment( att, makeAttachmentFile() );
Assertions.assertTrue( m_engine.getManager( PageManager.class ).wikiPageExists( att.getName() ), "attachment disappeared" );
}
@Test
public void testExistsUTF2() throws Exception
{
final Attachment att = Wiki.contents().attachment( m_engine, NAMEU, "test\u00e4.bin" );
att.setAuthor( "FirstPost" );
m_manager.storeAttachment( att, makeAttachmentFile() );
Assertions.assertTrue( m_engine.getManager( PageManager.class ).wikiPageExists( att.getName() ), "attachment disappeared" );
}
@Test
public void testNonexistentPage() throws Exception
{
try
{
m_engine.saveText( "TestPage", "xx" );
final Attachment att = Wiki.contents().attachment( m_engine, "TestPages", "foo.bin" );
att.setAuthor("MonicaBellucci");
m_manager.storeAttachment( att, makeAttachmentFile() );
Assertions.fail("Attachment was stored even when the page does not exist");
}
catch( final ProviderException ex )
{
// This is the intended exception
}
finally
{
m_engine.getManager( PageManager.class ).deletePage("TestPage");
}
}
@Test
public void testValidateFileName() throws Exception
{
Assertions.assertEquals( "foo.jpg", AttachmentManager.validateFileName( "foo.jpg" ), "foo.jpg" );
Assertions.assertEquals( "test.jpg", AttachmentManager.validateFileName( "C:\\Windows\\test.jpg" ), "C:\\Windows\\test.jpg" );
final WikiException thrown1 =
Assertions.assertThrows( WikiException.class, () -> {
AttachmentManager.validateFileName( "C:\\Windows\\test.jsp" );
});
Assertions.assertTrue(thrown1.getMessage().contains("attach.unwanted.file"), thrown1.getMessage());
final WikiException thrown2 =
Assertions.assertThrows( WikiException.class, () -> {
AttachmentManager.validateFileName( "C:\\Windows\\test.jsp\\" );
});
Assertions.assertTrue(thrown2.getMessage().contains("attach.unwanted.file"), thrown2.getMessage());
Assertions.assertEquals( "test__test.jpg", AttachmentManager.validateFileName( "C:\\Windows\\test#?test.jpg" ), "test#?test.jpg" );
}
}