From 997786858ca43a457c934e15cf84588883ccb8d2 Mon Sep 17 00:00:00 2001 From: Alex Rudyy Date: Wed, 1 Apr 2015 12:46:30 +0000 Subject: QPID-6446: Verify that store path is a writable folder on creation of derby virtual host and node git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1670629 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/qpid/server/util/FileHelper.java | 26 +++ .../server/virtualhost/AbstractVirtualHost.java | 2 +- .../apache/qpid/server/util/FileHelperTest.java | 40 ++++- .../virtualhost/derby/DerbyVirtualHostImpl.java | 11 ++ .../derby/DerbyVirtualHostNodeImpl.java | 11 ++ .../derby/DerbyVirtualHostNodeTest.java | 175 +++++++++++++++++++++ qpid/java/test-profiles/JavaDerbyExcludes | 2 - 7 files changed, 263 insertions(+), 4 deletions(-) create mode 100644 qpid/java/broker-plugins/derby-store/src/test/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNodeTest.java (limited to 'qpid/java') diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/util/FileHelper.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/util/FileHelper.java index 0e1a28f220..a13e3f52f9 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/util/FileHelper.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/util/FileHelper.java @@ -130,4 +130,30 @@ public class FileHelper } } } + + public boolean isWritableDirectory(String path) + { + File storePath = new File(path); + if (storePath.exists()) + { + if (!storePath.isDirectory()) + { + return false; + } + } + else + { + do + { + storePath = storePath.getParentFile(); + if (storePath == null) + { + return false; + } + } + while (!storePath.exists()); + } + return storePath.canWrite(); + } + } diff --git a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java index 76fbb4f48e..e0b0d37cbe 100644 --- a/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java +++ b/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java @@ -297,7 +297,7 @@ public abstract class AbstractVirtualHost> exte - private void validateMessageStoreCreation() + protected void validateMessageStoreCreation() { MessageStore store = createMessageStore(); if (store != null) diff --git a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/util/FileHelperTest.java b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/util/FileHelperTest.java index 9d47ed496a..27581fa60f 100644 --- a/qpid/java/broker-core/src/test/java/org/apache/qpid/server/util/FileHelperTest.java +++ b/qpid/java/broker-core/src/test/java/org/apache/qpid/server/util/FileHelperTest.java @@ -27,10 +27,11 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.PosixFileAttributeView; import java.nio.file.attribute.PosixFilePermission; -import java.nio.file.attribute.PosixFilePermissions; import java.util.Set; import org.apache.qpid.test.utils.QpidTestCase; +import org.apache.qpid.test.utils.TestFileUtils; +import org.apache.qpid.util.FileUtils; public class FileHelperTest extends QpidTestCase { @@ -121,6 +122,43 @@ public class FileHelperTest extends QpidTestCase } } + public void testIsWritableDirectoryForFilePath() throws Exception + { + File workDir = TestFileUtils.createTestDirectory("test", true); + try + { + File file = new File(workDir, getTestName()); + file.createNewFile(); + assertFalse("Should return false for a file", _fileHelper.isWritableDirectory(file.getAbsolutePath())); + } + finally + { + FileUtils.delete(workDir, true); + } + } + + + public void testIsWritableDirectoryForNonWritablePath() throws Exception + { + File workDir = TestFileUtils.createTestDirectory("test", true); + try + { + if (Files.getFileStore(workDir.toPath()).supportsFileAttributeView(PosixFileAttributeView.class)) + { + File file = new File(workDir, getTestName()); + file.mkdirs(); + if (file.setWritable(false, false)) + { + assertFalse("Should return false for non writable folder", + _fileHelper.isWritableDirectory(new File(file, "test").getAbsolutePath())); + } + } + } + finally + { + FileUtils.delete(workDir, true); + } + } private void assertPermissions(Path path) throws IOException { diff --git a/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhost/derby/DerbyVirtualHostImpl.java b/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhost/derby/DerbyVirtualHostImpl.java index 5089090643..dbaf5e55b7 100644 --- a/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhost/derby/DerbyVirtualHostImpl.java +++ b/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhost/derby/DerbyVirtualHostImpl.java @@ -20,12 +20,14 @@ */ package org.apache.qpid.server.virtualhost.derby; +import org.apache.qpid.server.configuration.IllegalConfigurationException; import org.apache.qpid.server.model.ManagedAttributeField; import org.apache.qpid.server.model.ManagedObject; import org.apache.qpid.server.model.ManagedObjectFactoryConstructor; import org.apache.qpid.server.model.VirtualHostNode; import org.apache.qpid.server.store.MessageStore; import org.apache.qpid.server.store.derby.DerbyMessageStore; +import org.apache.qpid.server.util.FileHelper; import org.apache.qpid.server.virtualhost.AbstractVirtualHost; import java.util.Map; @@ -75,4 +77,13 @@ public class DerbyVirtualHostImpl extends AbstractVirtualHost _broker; + + @Override + public void setUp() throws Exception + { + super.setUp(); + _taskExecutor = new TaskExecutorImpl(); + _taskExecutor.start(); + _workDir = TestFileUtils.createTestDirectory("qpid.work_dir", true); + setTestSystemProperty("qpid.work_dir", _workDir.getAbsolutePath()); + _broker = createBroker(); + } + + public void tearDown() throws Exception + { + try + { + _broker.close(); + } + finally + { + _taskExecutor.stop(); + TestFileUtils.delete(_workDir, true); + super.tearDown(); + } + } + + public void testCreateAndCloseVirtualHostNode() throws Exception + { + String nodeName = getTestName(); + Map nodeData = new HashMap<>(); + nodeData.put(VirtualHostNode.NAME, nodeName); + nodeData.put(VirtualHostNode.TYPE, DerbyVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE); + + VirtualHostNode virtualHostNode = (VirtualHostNode)_broker.createChild(VirtualHostNode.class, nodeData); + virtualHostNode.start(); + virtualHostNode.close(); + } + + + public void testCreateDuplicateVirtualHostNodeAndClose() throws Exception + { + + String nodeName = getTestName(); + Map nodeData = new HashMap<>(); + nodeData.put(VirtualHostNode.NAME, nodeName); + nodeData.put(VirtualHostNode.TYPE, DerbyVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE); + + VirtualHostNode virtualHostNode = (VirtualHostNode)_broker.createChild(VirtualHostNode.class, nodeData); + virtualHostNode.start(); + + try + { + _broker.createChild(VirtualHostNode.class, nodeData); + } + catch(Exception e) + { + assertEquals("Unexpected message", "Child of type " + virtualHostNode.getClass().getSimpleName() + " already exists with name of " + getTestName(), e.getMessage()); + } + virtualHostNode.close(); + } + + public void testOnCreateValidationForFileStorePath() throws Exception + { + File file = new File(_workDir, getTestName()); + file.createNewFile(); + + String nodeName = getTestName(); + Map nodeData = new HashMap<>(); + nodeData.put(VirtualHostNode.NAME, nodeName); + nodeData.put(VirtualHostNode.TYPE, DerbyVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE); + nodeData.put(DerbyVirtualHostNodeImpl.STORE_PATH, file.getAbsolutePath()); + try + { + _broker.createChild(VirtualHostNode.class, nodeData); + fail("Cannot create store for the file store path"); + } + catch(IllegalConfigurationException e) + { + // pass + } + + } + + + public void testOnCreateValidationForNonWritableStorePath() throws Exception + { + if (Files.getFileStore(_workDir.toPath()).supportsFileAttributeView(PosixFileAttributeView.class)) + { + File file = new File(_workDir, getTestName()); + file.mkdirs(); + if (file.setWritable(false, false)) + { + String nodeName = getTestName(); + Map nodeData = new HashMap<>(); + nodeData.put(VirtualHostNode.NAME, nodeName); + nodeData.put(VirtualHostNode.TYPE, DerbyVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE); + nodeData.put(DerbyVirtualHostNodeImpl.STORE_PATH, file.getAbsolutePath()); + try + { + _broker.createChild(VirtualHostNode.class, nodeData); + fail("Cannot create store for the non writable store path"); + } + catch (IllegalConfigurationException e) + { + // pass + } + } + } + } + + private BrokerAdapter createBroker() + { + Map brokerAttributes = Collections.singletonMap(Broker.NAME, "Broker"); + SystemConfig parent = mock(SystemConfig.class); + when(parent.getEventLogger()).thenReturn(new EventLogger()); + when(parent.getCategoryClass()).thenReturn(SystemConfig.class); + when(parent.getTaskExecutor()).thenReturn(_taskExecutor); + when(parent.getChildExecutor()).thenReturn(_taskExecutor); + when(parent.getModel()).thenReturn(BrokerModel.getInstance()); + when(parent.getObjectFactory()).thenReturn(new ConfiguredObjectFactoryImpl(BrokerModel.getInstance())); + BrokerAdapter broker = new BrokerAdapter(brokerAttributes, parent); + broker.start(); + return broker; + } +} diff --git a/qpid/java/test-profiles/JavaDerbyExcludes b/qpid/java/test-profiles/JavaDerbyExcludes index 49db2ec00c..814406f04d 100644 --- a/qpid/java/test-profiles/JavaDerbyExcludes +++ b/qpid/java/test-profiles/JavaDerbyExcludes @@ -20,5 +20,3 @@ org.apache.qpid.server.store.berkeleydb.* org.apache.qpid.server.store.berkeleydb.replication.* -# QPID-6446: temporary disable the test until issue is resolved -org.apache.qpid.systest.rest.VirtualHostNodeRestTest#testCreateVirtualHostNodeByPost -- cgit v1.2.1