PageRenderTime 46ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/jira-project/jira-components/jira-tests-parent/jira-tests-unit/src/test/java/com/atlassian/jira/startup/TestJiraHomeStartupCheck.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 240 lines | 186 code | 47 blank | 7 comment | 7 complexity | 2f84c947d4acb321544c501385650cef MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.startup;
  2. import com.atlassian.jira.config.util.JiraHome;
  3. import com.atlassian.jira.help.HelpUrl;
  4. import com.atlassian.jira.help.StaticHelpUrls;
  5. import com.atlassian.jira.junit.rules.MockitoMocksInContainer;
  6. import com.atlassian.jira.plugin.PluginPath;
  7. import org.junit.After;
  8. import org.junit.Rule;
  9. import org.junit.Test;
  10. import org.junit.rules.ExpectedException;
  11. import org.junit.rules.RuleChain;
  12. import org.junit.rules.TemporaryFolder;
  13. import java.io.File;
  14. import static org.hamcrest.Matchers.arrayContainingInAnyOrder;
  15. import static org.hamcrest.Matchers.containsString;
  16. import static org.junit.Assert.assertEquals;
  17. import static org.junit.Assert.assertFalse;
  18. import static org.junit.Assert.assertNull;
  19. import static org.junit.Assert.assertThat;
  20. import static org.junit.Assert.assertTrue;
  21. @SuppressWarnings({"ResultOfMethodCallIgnored"})
  22. public class TestJiraHomeStartupCheck {
  23. @Rule
  24. public RuleChain container = MockitoMocksInContainer.forTest(this);
  25. @Rule
  26. public ExpectedException exception = ExpectedException.none();
  27. @Rule
  28. public TemporaryFolder temporaryFolder = new TemporaryFolder();
  29. private JiraHomeStartupCheck startupCheck;
  30. @After
  31. public void tearDown() {
  32. if (startupCheck != null) {
  33. startupCheck.stop();
  34. }
  35. }
  36. @Test
  37. public void testName() throws Exception {
  38. assertEquals("Jira.Home Startup Check", new JiraHomeStartupCheck((new MockJiraHomePathLocator(""))).getName());
  39. }
  40. @Test
  41. public void shouldWorkWithExistingDirectory() throws Exception {
  42. final File file = temporaryFolder.newFolder("TestJiraHomeStartupCheck.isOk");
  43. startupCheck = new JiraHomeStartupCheck(new MockJiraHomePathLocator(file));
  44. assertTrue(startupCheck.isOk());
  45. assertNull(startupCheck.getFaultDescription());
  46. assertNull(startupCheck.getHTMLFaultDescription());
  47. assertEquals("Jira.Home Startup Check", startupCheck.getName());
  48. assertEquals(file.getAbsolutePath(), startupCheck.getJiraHomeDirectory().getAbsolutePath());
  49. }
  50. @Test
  51. public void shouldPassWhenDirectoryDoesntExistAndIsCreated() throws Exception {
  52. final File file = temporaryFolder.newFolder("TestJiraHomeStartupCheck.isOk");
  53. file.delete();
  54. startupCheck = new JiraHomeStartupCheck(new MockJiraHomePathLocator(file));
  55. assertTrue(startupCheck.isOk());
  56. assertNull(startupCheck.getFaultDescription());
  57. assertNull(startupCheck.getHTMLFaultDescription());
  58. assertEquals("Jira.Home Startup Check", startupCheck.getName());
  59. assertEquals(file.getAbsolutePath(), startupCheck.getJiraHomeDirectory().getAbsolutePath());
  60. // check that all of the expected directories get created
  61. for (String subdir : JiraHome.localsubdirs) {
  62. assertTrue(new File(file, subdir).exists());
  63. }
  64. for (String subdir : JiraHome.sharedsubdirs) {
  65. assertTrue(new File(file, subdir).exists());
  66. }
  67. }
  68. @Test
  69. public void shouldFailWhenDirectoryIsLocked() throws Exception {
  70. final File file = temporaryFolder.newFolder("TestJiraHomeStartupCheck.isOk");
  71. final JiraHomeStartupCheck startupCheck = new JiraHomeStartupCheck(new MockJiraHomePathLocator(file));
  72. assertTrue(startupCheck.isOk());
  73. final JiraHomeStartupCheck startupCheckShouldFailLocked = new JiraHomeStartupCheck(new MockJiraHomePathLocator(file));
  74. assertFalse(startupCheckShouldFailLocked.isOk());
  75. final String expectedMessage = String.format("The jira.home directory '%s' is already locked by another running instance of JIRA.", file.getCanonicalPath());
  76. assertEquals(expectedMessage, startupCheckShouldFailLocked.getFaultDescription());
  77. final String expectedHtmlMessage = String.format("The jira.home directory '%s' is already locked by another running instance of JIRA.", file.getCanonicalPath());
  78. assertEquals(expectedHtmlMessage, startupCheckShouldFailLocked.getHTMLFaultDescription());
  79. assertNull(startupCheckShouldFailLocked.getJiraHomeDirectory());
  80. }
  81. public void shouldThrowExceptionWhenJiraHasNoPermissionToWriteToDirectory() throws Exception {
  82. final File dir = temporaryFolder.newFolder("TestJiraHomeStartupCheck");
  83. dir.setReadOnly();
  84. exception.expect(JiraHomeException.class);
  85. exception.expectMessage(containsString("JIRA has no permission to either create or write to subdirectory"));
  86. startupCheck = new JiraHomeStartupCheck(new MockJiraHomePathLocator(dir));
  87. startupCheck.createLocalHomeDirectories(dir);
  88. }
  89. @Test
  90. public void shouldCreateSubdirectoriesWhenJiraHasWritePermission() throws Exception {
  91. final File dir = temporaryFolder.newFolder();
  92. startupCheck = new JiraHomeStartupCheck(new MockJiraHomePathLocator(dir));
  93. startupCheck.createLocalHomeDirectories(dir);
  94. assertThat(dir.list(), arrayContainingInAnyOrder(JiraHome.localsubdirs.toArray()));
  95. }
  96. @Test
  97. public void shouldThrowExceptionWhenJiraHasNoWritePersmissionToSubDirectory() throws Exception {
  98. final File dir = temporaryFolder.newFolder("TestJiraHomeStartupCheck");
  99. final File subDir = new File(dir, PluginPath.PLUGINS_DIRECTORY);
  100. subDir.mkdir();
  101. subDir.setReadOnly();
  102. exception.expect(JiraHomeException.class);
  103. exception.expectMessage(containsString("JIRA has no permission to either create or write to subdirectory"));
  104. startupCheck = new JiraHomeStartupCheck(new MockJiraHomePathLocator(dir));
  105. startupCheck.createLocalHomeDirectories(dir);
  106. }
  107. @Test
  108. public void shouldFailWhenDirectoryIsReadonly() throws Exception {
  109. // This test relies on filesystem-specific behaviour.
  110. // Making a directory readonly on Windows does not mean you cannot create files within that directory.
  111. if (System.getProperty("os.name").contains("Windows")) {
  112. return;
  113. }
  114. final File file = temporaryFolder.newFolder("TestJiraHomeStartupCheck.isOk");
  115. final JiraHomeStartupCheck startupCheck = new JiraHomeStartupCheck(new MockJiraHomePathLocator(file));
  116. // we have to run this once normally to create all of the standard jirahome subdirectories
  117. startupCheck.createLocalHomeDirectories(file);
  118. startupCheck.createSharedHomeDirectories(file);
  119. // then we can set jirahome read only and see the lock failed error
  120. file.setReadOnly();
  121. assertFalse(startupCheck.isOk());
  122. final String expectedMessage = expectedMessage("Unable to create and acquire lock file for jira.home directory '", file.getCanonicalFile(), "'.");
  123. assertEquals(expectedMessage, startupCheck.getFaultDescription());
  124. assertEquals(expectedMessage, startupCheck.getHTMLFaultDescription());
  125. assertNull(startupCheck.getJiraHomeDirectory());
  126. }
  127. @Test
  128. public void shouldFailWhenPassedFileIsNull() throws Exception {
  129. final JiraHomeStartupCheck startupCheck = new JiraHomeStartupCheck(new MockJiraHomePathLocator((File) null));
  130. assertFalse(startupCheck.isOk());
  131. assertTrue(startupCheck.getFaultDescription().startsWith("No jira.home is configured."));
  132. assertTrue(startupCheck.getHTMLFaultDescription().startsWith("No jira.home is configured."));
  133. assertNull(startupCheck.getJiraHomeDirectory());
  134. }
  135. @Test
  136. public void shouldFailWhenDirectoryPathIsEmpty() throws Exception {
  137. final JiraHomeStartupCheck startupCheck = new JiraHomeStartupCheck(new MockJiraHomePathLocator(""));
  138. assertFalse(startupCheck.isOk());
  139. assertTrue(startupCheck.getFaultDescription().startsWith("No jira.home is configured."));
  140. assertTrue(startupCheck.getHTMLFaultDescription().startsWith("No jira.home is configured."));
  141. assertNull(startupCheck.getJiraHomeDirectory());
  142. }
  143. @Test
  144. public void shouldFailWhenFileIsNotDirectory() throws Exception {
  145. final File file = temporaryFolder.newFile("testFileIsNotDirectory");
  146. startupCheck = new JiraHomeStartupCheck(new MockJiraHomePathLocator(file));
  147. assertFalse(startupCheck.isOk());
  148. final String expectedMessage = expectedMessage("Configured jira.home '", file, "' is not a directory.");
  149. assertEquals(expectedMessage, startupCheck.getFaultDescription());
  150. assertEquals(expectedMessage, startupCheck.getHTMLFaultDescription());
  151. assertNull(startupCheck.getJiraHomeDirectory());
  152. }
  153. @Test
  154. public void shouldFailWhenCannotCreateDirectory() throws Exception {
  155. // This test relies on filesystem-specific behaviour.
  156. // Making a directory readonly on Windows does not mean you cannot create files within that directory.
  157. if (System.getProperty("os.name").contains("Windows")) {
  158. return;
  159. }
  160. final File file = temporaryFolder.newFolder("TestJiraHomeStartupCheck.testCannotCreateDirectory");
  161. file.setReadOnly();
  162. final String path = file.getAbsolutePath() + java.io.File.separator + "readonly";
  163. startupCheck = new JiraHomeStartupCheck(new MockJiraHomePathLocator(path));
  164. assertFalse(startupCheck.isOk());
  165. final HelpUrl jiraHomeHelp = StaticHelpUrls.getInstance().getUrl("jirahome");
  166. final String expectedMessage = String.format("Could not create jira.home directory '%s'. Please see "
  167. + "%s for more information on how to set up your JIRA home directory.", path, jiraHomeHelp.getUrl());
  168. assertEquals(expectedMessage, startupCheck.getFaultDescription());
  169. final String expectedHtmlMessage = String.format("Could not create jira.home directory '%s'. "
  170. + "Please see <a href=\"%s\">%s</a> for more information on how to set up your JIRA home directory.",
  171. path, jiraHomeHelp.getUrl(), jiraHomeHelp.getTitle());
  172. assertEquals(expectedHtmlMessage, startupCheck.getHTMLFaultDescription());
  173. assertNull(startupCheck.getJiraHomeDirectory());
  174. }
  175. private String expectedMessage(final String prefix, final File jiraHomeDirectory, final String suffix) {
  176. return prefix + jiraHomeDirectory.getAbsolutePath() + suffix;
  177. }
  178. private static class MockJiraHomePathLocator implements JiraHomePathLocator {
  179. private final String path;
  180. private MockJiraHomePathLocator(String filePath) {
  181. path = filePath;
  182. }
  183. private MockJiraHomePathLocator(File filePath) {
  184. path = filePath == null ? null : filePath.getAbsolutePath();
  185. }
  186. public String getJiraHome() {
  187. return path;
  188. }
  189. public String getDisplayName() {
  190. return "";
  191. }
  192. }
  193. }