/* * 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.webdav; 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 java.io.InputStream; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import org.junit.Before; import org.junit.Test; import org.modeshape.common.util.IoUtil; import org.modeshape.common.util.StringUtil; import com.googlecode.sardine.DavResource; import com.googlecode.sardine.Sardine; import com.googlecode.sardine.SardineFactory; import com.googlecode.sardine.util.SardineException; /** * Integration test for the {@link org.modeshape.webdav.IWebdavStore} default implementation, tested using a real web-dav * compliant client. This should be updated whenever the default webdav support is updated (e.g. when fixing compliance bugs). * <p> * Ideally this would contain at least the test cases that <a href="http://www.webdav.org/neon/litmus">Litmus</a> has. * </p> * * @author Horia Chiorean (hchiorea@redhat.com) */ public class WebdavStoreClientTest { /** * The servlet context name comes from the pom.xml */ private static final String SERVER_CONTEXT = "http://localhost:8090/webdav"; protected Sardine sardine; @Before public void beforeEach() throws Exception { sardine = initializeWebDavClient(); } protected Sardine initializeWebDavClient() throws SardineException { return SardineFactory.begin(); } @Test public void shouldConnectWithValidCredentials() throws Exception { String uri = resourceUri(null); assertTrue(sardine.exists(uri)); try { assertNotNull(sardine.getResources(uri)); } catch (SardineException e) { // there seems to be a bug in Sardine146 (which is the only one available via Maven atm) assertEquals(302, e.getStatusCode()); } } @Test public void shouldCreateFolder() throws Exception { String folderName = testFolder(); String uri = resourceUri(folderName); sardine.createDirectory(uri); assertTrue(sardine.exists(uri)); DavResource folder = getResourceAtURI(uri); assertEquals(0l, folder.getContentLength().longValue()); } private String testFolder() { return "testFolder" + UUID.randomUUID().toString(); } protected DavResource getResourceAtURI( String uri ) throws SardineException { List<DavResource> resourcesList = sardine.getResources(uri); assertEquals(1, resourcesList.size()); return resourcesList.get(0); } @Test public void shouldCreateFile() throws Exception { String folderUri = resourceUri(testFolder()); sardine.createDirectory(folderUri); InputStream fileStream = getClass().getClassLoader().getResourceAsStream("textfile.txt"); assertNotNull(fileStream); String fileUri = folderUri + "/testFile" + UUID.randomUUID().toString(); sardine.put(fileUri, fileStream); assertTrue(sardine.exists(fileUri)); DavResource file = getResourceAtURI(fileUri); byte[] fileBytes = IoUtil.readBytes(getClass().getClassLoader().getResourceAsStream("textfile.txt")); assertEquals(fileBytes.length, file.getContentLength().longValue()); } protected String resourceUri( String resourceName ) { return !StringUtil.isBlank(resourceName) ? getServerContext() + "/" + resourceName : getServerContext(); } protected String getServerContext() { return SERVER_CONTEXT; } @Test public void shouldSetCustomPropertiesOnFolder() throws Exception { String folderUri = resourceUri(testFolder()); sardine.createDirectory(folderUri); assertCustomPropertiesOnResource(folderUri); } @Test public void shouldIgnoreCustomPropertiesOnFolderIfNotPresent() throws Exception { String folderUri = resourceUri(testFolder()); sardine.createDirectory(folderUri); sardine.setCustomProps(folderUri, null, null); sardine.setCustomProps(folderUri, null, Arrays.asList("missing_prop")); } @Test public void shouldSetCustomPropertiesOnFile() throws Exception { String folderUri = resourceUri(testFolder()); sardine.createDirectory(folderUri); InputStream fileStream = getClass().getClassLoader().getResourceAsStream("textfile.txt"); String fileUri = folderUri + "/testFile" + UUID.randomUUID().toString(); sardine.put(fileUri, fileStream); assertCustomPropertiesOnResource(fileUri); } private void assertCustomPropertiesOnResource( String resourceUri ) throws SardineException { Map<String, String> propertiesToAdd = new HashMap<String, String>(); propertiesToAdd.put("prop1", "value1"); propertiesToAdd.put("prop2", "value2"); sardine.setCustomProps(resourceUri, propertiesToAdd, null); DavResource resource = sardine.getResources(resourceUri).get(0); Map<String, String> customProps = resource.getCustomProps(); assertEquals("value1", customProps.get("prop1")); assertEquals("value2", customProps.get("prop2")); sardine.setCustomProps(resourceUri, null, Arrays.asList("prop2", "prop3")); resource = sardine.getResources(resourceUri).get(0); customProps = resource.getCustomProps(); assertEquals("value1", customProps.get("prop1")); assertFalse(customProps.containsKey("prop2")); } }