package de.ks.blogging.grav.pages; import com.google.common.base.StandardSystemProperty; import de.ks.FileUtil; import de.ks.blogging.grav.entity.GravBlog; import de.ks.blogging.grav.ui.post.BlogIntegrationAdvancedFixture; import de.ks.blogging.grav.ui.post.BlogIntegrationBasicFixture; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPSClient; import org.apache.ftpserver.FtpServer; import org.apache.ftpserver.FtpServerFactory; import org.apache.ftpserver.ftplet.User; import org.apache.ftpserver.ftplet.UserManager; import org.apache.ftpserver.listener.ListenerFactory; import org.apache.ftpserver.ssl.SslConfigurationFactory; import org.apache.ftpserver.usermanager.PropertiesUserManagerFactory; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.Inet4Address; import java.net.InetAddress; import java.nio.file.Files; import java.util.Arrays; import java.util.List; import static org.junit.Assert.*; public class RepositorySupportTest { private static final Logger log = LoggerFactory.getLogger(RepositorySupportTest.class); public static final int PORT = 8312; public static final String USERNAME = "testUser"; public static final String PASSWORD = "Dummy123"; private FtpServer server; private File tmpDir; private File ftpDir; private BlogIntegrationBasicFixture fixture; private BlogIntegrationAdvancedFixture fixtureAdvanced; @Before public void setUp() throws Exception { tmpDir = new File(StandardSystemProperty.JAVA_IO_TMPDIR.value()); ftpDir = new File(tmpDir, "ftpserver"); if (ftpDir.exists()) { FileUtil.deleteDir(ftpDir); } ftpDir.mkdir(); fillDirectory(ftpDir); FtpServerFactory serverFactory = new FtpServerFactory(); ListenerFactory factory = new ListenerFactory(); factory.setPort(PORT); SslConfigurationFactory ssl = new SslConfigurationFactory(); File keyStoreFile = new File(getClass().getResource("keystore.jks").toURI()); ssl.setKeystoreFile(keyStoreFile); ssl.setKeystorePassword("test123"); factory.setSslConfiguration(ssl.createSslConfiguration()); factory.setImplicitSsl(true); serverFactory.addListener("default", factory.createListener()); File userFile = new File(getClass().getResource("testuser.properties").toURI()); PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory(); userManagerFactory.setFile(userFile); UserManager userManager = userManagerFactory.createUserManager(); serverFactory.setUserManager(userManager); String[] allUserNames = userManager.getAllUserNames(); for (String userName : allUserNames) { User user = userManager.getUserByName(userName); log.info("User: {}, ps={}", userName, user != null ? user.getPassword() : "null"); } server = serverFactory.createServer(); server.start(); } private void fillDirectory(File file) throws IOException { File file1 = new File(file, "test.md"); file1.createNewFile(); Files.write(file1.toPath(), Arrays.asList("Hello", "world")); } @After public void tearDown() throws Exception { server.stop(); if (fixture != null) { fixture.cleanup(); } } @Test public void testConnection() throws Exception { FTPSClient ftpClient = new FTPSClient(true); ftpClient.setConnectTimeout(5000); InetAddress inetAddress = Inet4Address.getLocalHost(); ftpClient.connect(inetAddress, PORT); ftpClient.login(USERNAME, PASSWORD); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); FTPFile[] ftpFiles = ftpClient.listFiles(); assertEquals(1, ftpFiles.length); assertEquals("test.md", ftpFiles[0].getName()); File target = new File(tmpDir, "out.md"); try (FileOutputStream fileOutputStream = new FileOutputStream(target)) { ftpClient.retrieveFile("test.md", fileOutputStream); } List<String> read = Files.readAllLines(target.toPath()); assertEquals("Hello", read.get(0)); assertEquals("world", read.get(1)); File upload = new File(tmpDir, "upload.md"); Files.write(upload.toPath(), Arrays.asList("Hello", "Sauerland")); try (FileInputStream stream = new FileInputStream(upload)) { ftpClient.storeFile("upload_server.md", stream); } List<String> lines = Files.readAllLines(new File(ftpDir, "upload_server.md").toPath()); assertEquals("Hello", lines.get(0)); assertEquals("Sauerland", lines.get(1)); ftpClient.disconnect(); } @Test public void testGetGitRev() throws Exception { fixture = new BlogIntegrationBasicFixture(); fixture.createBlogFolders(true); Files.write(new File(ftpDir, "git-rev.txt").toPath(), Arrays.asList("test123")); RepositorySupport repositorySupport = getRepositorySupport(); String lastGitRev = repositorySupport.getLastGitRev(); assertNotNull(lastGitRev); assertEquals("test123", lastGitRev); } protected RepositorySupport getRepositorySupport() { String path; if (fixture != null) { path = fixture.getGitBlog().getPath(); } else { path = fixtureAdvanced.getBlogFolder().getPath(); } GravBlog gravBlog = new GravBlog("test", path); gravBlog.setFtpPass(PASSWORD); gravBlog.setFtpUser(USERNAME); gravBlog.setFtpHost("localhost"); gravBlog.setFtpPort(PORT); return new RepositorySupport(new GravPages(gravBlog)); } @Test public void testGitDiff() throws Exception { fixture = new BlogIntegrationBasicFixture(); fixture.createBlogFolders(true); RepositorySupport repositorySupport = getRepositorySupport(); FileChanges changedFiles = repositorySupport.getChangedFiles(fixture.getCommit1()); log.info("Querying for commit {}", fixture.getCommit1()); assertEquals(1, changedFiles.getModifiedAdded().size()); assertEquals("blog2_b.md", changedFiles.getModifiedAdded().get(0)); changedFiles = repositorySupport.getChangedFiles(fixture.getCommit3(), fixture.getCommitMoved()); assertEquals(1, changedFiles.getModifiedAdded().size()); assertEquals(1, changedFiles.getDeleted().size()); assertEquals("blog2_d.md", changedFiles.getModifiedAdded().get(0)); assertEquals("blog2_c.md", changedFiles.getDeleted().get(0)); changedFiles = repositorySupport.getChangedFiles(fixture.getCommitMoved()); assertEquals(1, changedFiles.getDeleted().size()); assertEquals("blog2_d.md", changedFiles.getDeleted().get(0)); } @Test public void testUploadChanges() throws Exception { fixture = new BlogIntegrationBasicFixture(); fixture.createBlogFolders(true); RepositorySupport repositorySupport = getRepositorySupport(); Files.write(new File(ftpDir, "git-rev.txt").toPath(), Arrays.asList(fixture.getCommit1())); FileChanges changedFiles = repositorySupport.getChangedFiles(fixture.getCommit1()); repositorySupport.upload(changedFiles, i -> log.info("{}/{}", i, changedFiles.getTotalChangeAmount())); assertTrue(new File(ftpDir, "blog2_b.md").exists()); } @Test public void testUploadMoved() throws Exception { fixture = new BlogIntegrationBasicFixture(); fixture.createBlogFolders(true); RepositorySupport repositorySupport = getRepositorySupport(); Files.write(new File(fixture.getGitBlog(), "blog2_d.md").toPath(), Arrays.asList("hujhu")); Files.write(new File(ftpDir, "blog2_c.md").toPath(), Arrays.asList("hohoho")); Files.write(new File(ftpDir, "git-rev.txt").toPath(), Arrays.asList(fixture.getCommit3())); FileChanges changedFiles = repositorySupport.getChangedFiles(fixture.getCommit3(), fixture.getCommitMoved()); repositorySupport.upload(changedFiles, i -> log.info("{}/{}", i, changedFiles.getTotalChangeAmount())); assertFalse(new File(ftpDir, "blog2_c.md").exists()); assertTrue(new File(ftpDir, "blog2_d.md").exists()); } @Test public void testUploadChangesAdvanced() throws Exception { fixtureAdvanced = new BlogIntegrationAdvancedFixture(); fixtureAdvanced.createBlogFolders(); RepositorySupport repositorySupport = getRepositorySupport(); String commitId = fixtureAdvanced.getCommits().get(0); FileChanges changedFiles = repositorySupport.getChangedFiles(commitId); repositorySupport.upload(changedFiles, i -> log.info("#done with {}/{}", i, changedFiles.getTotalChangeAmount())); } }