/*
* ModeShape (http://www.modeshape.org)
*
* 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.modeshape.web.jcr.webdav;
import com.googlecode.sardine.DavResource;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.modeshape.common.FixFor;
import org.modeshape.common.util.StringUtil;
import org.modeshape.webdav.WebdavStoreClientTest;
import com.googlecode.sardine.Sardine;
import com.googlecode.sardine.SardineFactory;
import com.googlecode.sardine.util.SardineException;
import java.io.ByteArrayInputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.UUID;
/**
* Unit test for the {@link ModeShapeWebdavStore} implementation, tested using a real web-dav compliant client. This test should
* contains any relevant WebDAV tests from the point of the view of the JCR - WebDAV integration. Any WebDAV spec issues, should
* be tested via {@link WebdavStoreClientTest}.
*
* @author Horia Chiorean
*/
public class ModeShapeWebdavStoreClientTest extends WebdavStoreClientTest {
/**
* The name of the repository is dictated by the "repository-config.json" configuration file loaded by the
* "org.modeshape.jcr.JCR_URL" parameter in the "web.xml" file.
*/
private static final String REPOSITORY_NAME = "webdav_repo";
private static final String SERVER_CONTEXT = "http://localhost:8090/webdav-jcr";
@Override
protected Sardine initializeWebDavClient() throws SardineException {
// Configured in pom
return SardineFactory.begin("dnauser", "password");
}
@Test
public void shouldConnectToRepository() throws Exception {
String uri = getJcrServerUrl(null);
assertTrue(sardine.exists(uri));
assertNotNull(sardine.getResources(uri));
}
@Test
public void shouldConnectToRepositoryAndWorkspace() throws Exception {
String uri = getJcrServerUrl(getDefaultWorkspaceName());
assertTrue(sardine.exists(uri));
assertNotNull(sardine.getResources(uri));
}
@Test
public void shouldNotFindInvalidRepository() throws Exception {
String uri = getServerContext() + "/missing_repo";
assertFalse(sardine.exists(uri));
}
@Test
public void shouldNotFindInvalidWorkspace() throws Exception {
String uri = getJcrServerUrl("missingWS");
assertFalse(sardine.exists(uri));
}
@Test
@FixFor( "MODE-1542" )
public void shouldCreateLargeFile() throws Exception {
int binarySize = 100 * (1 << 20); //100 MB
byte[] binaryData = new byte[binarySize];
new Random().nextBytes(binaryData);
String folderUri = resourceUri(testFolder());
sardine.createDirectory(folderUri);
String fileUri = testFile(folderUri);
sardine.put(fileUri, new ByteArrayInputStream(binaryData), "application/octet-stream");
assertTrue(sardine.exists(fileUri));
DavResource file = getResourceAtURI(fileUri);
assertEquals(binarySize, file.getContentLength().intValue());
}
private String testFile( String folderUri ) {
return folderUri + "/testFile" + UUID.randomUUID().toString();
}
@Test
@FixFor( "MODE-984" )
public void shouldRetrieveFolderCustomProperties() throws Exception {
String folderUri = resourceUri(testFolder());
sardine.createDirectory(folderUri);
DavResource resource = sardine.getResources(folderUri).get(0);
Map<String, String> customProperties = resource.getCustomProps();
assertTrue(!customProperties.isEmpty());
assertEquals("nt:folder", customProperties.get("primaryType"));
assertNotNull(customProperties.get("created"));
assertNotNull(customProperties.get("createdBy"));
}
@Test
@FixFor( "MODE-984" )
public void shouldRetrieveFileCustomProperties() throws Exception {
String folderUri = resourceUri(testFolder());
sardine.createDirectory(folderUri);
byte[] binaryData = new byte[1024];
new Random().nextBytes(binaryData);
String fileUri = testFile(folderUri);
sardine.put(fileUri, new ByteArrayInputStream(binaryData), "application/octet-stream");
DavResource resource = sardine.getResources(fileUri).get(0);
Map<String, String> customProperties = resource.getCustomProps();
assertTrue(!customProperties.isEmpty());
assertEquals("nt:file", customProperties.get("primaryType"));
assertNotNull(customProperties.get("created"));
assertNotNull(customProperties.get("createdBy"));
}
@Override
@FixFor( "MODE-984" )
public void shouldSetCustomPropertiesOnFile() throws Exception {
String folderUri = resourceUri(testFolder());
sardine.createDirectory(folderUri);
byte[] binaryData = new byte[1024];
new Random().nextBytes(binaryData);
String fileUri = testFile(folderUri);
sardine.put(fileUri, new ByteArrayInputStream(binaryData), "application/octet-stream");
Map<String, String> customProps = new HashMap<String, String>();
customProps.put("myProp", "myValue");
sardine.setCustomProps(fileUri, customProps, null);
DavResource resource = sardine.getResources(fileUri).get(0);
Map<String, String> customProperties = resource.getCustomProps();
assertTrue(!customProperties.isEmpty());
assertFalse(customProperties.containsKey("myProp"));
}
@Override
public void shouldSetCustomPropertiesOnFolder() throws Exception {
//custom properties cannot be set on nt:folder
String folderUri = resourceUri(testFolder());
sardine.createDirectory(folderUri);
Map<String, String> customProps = new HashMap<String, String>();
customProps.put("myProp", "myValue");
sardine.setCustomProps(folderUri, customProps, null);
DavResource resource = sardine.getResources(folderUri).get(0);
Map<String, String> customProperties = resource.getCustomProps();
assertTrue(!customProperties.isEmpty());
assertFalse(customProperties.containsKey("myProp"));
}
@Test
@FixFor( "MODE-2010" )
public void shouldIgnoreMultiValuedProperties() throws Exception {
//created via initial content
String nodeUri = resourceUri("node");
DavResource resource = sardine.getResources(nodeUri).get(0);
Map<String, String> customProperties = resource.getCustomProps();
assertTrue(!customProperties.isEmpty());
assertEquals("value", customProperties.get("single-value-prop"));
}
@Test
@FixFor( "MODE-2243" )
public void shouldEscapeIllegalCharsInXMLValues() throws Exception {
//created via initial content
String folderUri = resourceUri("folder");
DavResource folder = sardine.getResources(folderUri).get(0);
Map<String, String> customProperties = folder.getCustomProps();
assertTrue(!customProperties.isEmpty());
assertEquals("nt:folder", customProperties.get("primaryType"));
//nt:folder has a created mixin which will auto-set the next 2 props
assertNotNull(customProperties.get("created"));
assertEquals("<modeshape-worker>", customProperties.get("createdBy"));
}
private String testFolder() {
return "testDirectory" + UUID.randomUUID().toString();
}
protected String getDefaultWorkspaceName() {
return "default";
}
@Override
protected String getServerContext() {
return SERVER_CONTEXT;
}
protected String getRepositoryName() {
return REPOSITORY_NAME;
}
@Override
protected String resourceUri( String resourceName ) {
String rootUrl = getJcrServerUrl(getDefaultWorkspaceName());
return !StringUtil.isBlank(resourceName) ? rootUrl + "/" + resourceName : rootUrl;
}
private String getJcrServerUrl( String workspaceName ) {
String serverContext = getServerContext();
assertNotNull(serverContext);
String repositoryName = getRepositoryName();
assertNotNull(repositoryName);
String baseUrl = serverContext + "/" + repositoryName;
return workspaceName != null ? baseUrl + "/" + workspaceName : baseUrl;
}
}