|
16 | 16 | // under the License. |
17 | 17 | package org.apache.cloudstack.storage.template; |
18 | 18 |
|
| 19 | +import static org.junit.Assert.assertFalse; |
| 20 | +import static org.junit.Assert.assertNull; |
19 | 21 | import static org.mockito.ArgumentMatchers.any; |
| 22 | +import static org.mockito.Mockito.doReturn; |
20 | 23 | import static org.mockito.Mockito.mock; |
| 24 | +import static org.mockito.Mockito.mockConstruction; |
21 | 25 | import static org.mockito.Mockito.mockStatic; |
22 | 26 | import static org.mockito.Mockito.never; |
23 | 27 | import static org.mockito.Mockito.times; |
24 | 28 |
|
| 29 | +import java.nio.file.Files; |
25 | 30 | import java.nio.file.Path; |
26 | 31 |
|
27 | 32 | import org.junit.After; |
| 33 | +import org.junit.Assert; |
28 | 34 | import org.junit.Before; |
29 | 35 | import org.junit.Test; |
30 | 36 | import org.junit.runner.RunWith; |
31 | 37 | import org.mockito.InjectMocks; |
| 38 | +import org.mockito.MockedConstruction; |
32 | 39 | import org.mockito.MockedStatic; |
33 | 40 | import org.mockito.Mockito; |
| 41 | +import org.mockito.Spy; |
34 | 42 | import org.mockito.junit.MockitoJUnitRunner; |
35 | 43 |
|
36 | 44 | import com.cloud.agent.api.storage.DeleteEntityDownloadURLCommand; |
37 | 45 | import com.cloud.utils.FileUtil; |
| 46 | +import com.cloud.utils.script.Script; |
38 | 47 |
|
39 | 48 | @RunWith(MockitoJUnitRunner.class) |
40 | 49 | public class UploadManagerImplTest { |
41 | 50 |
|
| 51 | + @Spy |
42 | 52 | @InjectMocks |
43 | 53 | UploadManagerImpl uploadManager; |
44 | 54 |
|
@@ -82,4 +92,40 @@ public void deletesSymlinkRootDirectoryWhenNoFile() { |
82 | 92 | uploadManager.deleteEntitySymlinkRootDirectoryIfNeeded(mock(DeleteEntityDownloadURLCommand.class), validLinkPath); |
83 | 93 | fileUtilMock.verify(() -> FileUtil.deleteRecursively(any(Path.class)), times(1)); |
84 | 94 | } |
| 95 | + |
| 96 | + @Test |
| 97 | + public void baseExtractDirectoryIsNotReadyWhenMissing() { |
| 98 | + assertFalse(uploadManager.isBaseExtractDirectoryReady(Path.of("/nonexistent/cloudstack/userdata/"))); |
| 99 | + } |
| 100 | + |
| 101 | + @Test |
| 102 | + public void baseExtractDirectoryIsNotReadyWhenNotOwnedByApacheUser() throws Exception { |
| 103 | + Path dir = Files.createTempDirectory("userdata"); |
| 104 | + try { |
| 105 | + assertFalse(uploadManager.isBaseExtractDirectoryReady(dir)); |
| 106 | + } finally { |
| 107 | + Files.delete(dir); |
| 108 | + } |
| 109 | + } |
| 110 | + |
| 111 | + @Test |
| 112 | + public void ensureBaseExtractDirectorySkipsInstallWhenReady() { |
| 113 | + doReturn(true).when(uploadManager).isBaseExtractDirectoryReady(any(Path.class)); |
| 114 | + try (MockedConstruction<Script> scripts = mockConstruction(Script.class)) { |
| 115 | + assertNull(uploadManager.ensureBaseExtractDirectory()); |
| 116 | + Assert.assertTrue(scripts.constructed().isEmpty()); |
| 117 | + } |
| 118 | + } |
| 119 | + |
| 120 | + @Test |
| 121 | + public void ensureBaseExtractDirectoryInstallsWhenNotReady() { |
| 122 | + doReturn(false).when(uploadManager).isBaseExtractDirectoryReady(any(Path.class)); |
| 123 | + try (MockedConstruction<Script> scripts = mockConstruction(Script.class, |
| 124 | + (script, context) -> Mockito.when(script.execute()).thenReturn("Permission denied"))) { |
| 125 | + Assert.assertEquals("Permission denied", uploadManager.ensureBaseExtractDirectory()); |
| 126 | + Assert.assertEquals(1, scripts.constructed().size()); |
| 127 | + Mockito.verify(scripts.constructed().get(0)).add("-d", "-o", UploadManagerImpl.APACHE_USER, "-g", UploadManagerImpl.APACHE_USER, |
| 128 | + "-m", "755", UploadManagerImpl.BASE_EXTRACT_PATH); |
| 129 | + } |
| 130 | + } |
85 | 131 | } |
0 commit comments