diff --git a/ngrinder-controller/build.gradle b/ngrinder-controller/build.gradle index a0dace9287..1faa1c1f02 100644 --- a/ngrinder-controller/build.gradle +++ b/ngrinder-controller/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation (group: "jaxen", name: "jaxen", version: "1.1.4") implementation (group: "com.beust", name: "jcommander", version: "1.32") implementation (group: "org.pf4j", name: "pf4j", version: "3.0.1") - implementation (group: "org.yaml", name: "snakeyaml", version: "1.25") + implementation (group: "com.esotericsoftware.yamlbeans", name: "yamlbeans", version: "1.17") implementation (group: "commons-collections", name: "commons-collections", version: "3.2.1") implementation (group: "org.reflections", name: "reflections", version: "0.9.9") implementation (group: "com.hazelcast", name: "hazelcast", version: hazelcast_version) diff --git a/ngrinder-controller/src/main/java/org/ngrinder/script/service/GitHubFileEntryService.java b/ngrinder-controller/src/main/java/org/ngrinder/script/service/GitHubFileEntryService.java index f9529cd7fb..c509b474fd 100644 --- a/ngrinder-controller/src/main/java/org/ngrinder/script/service/GitHubFileEntryService.java +++ b/ngrinder-controller/src/main/java/org/ngrinder/script/service/GitHubFileEntryService.java @@ -1,5 +1,6 @@ package org.ngrinder.script.service; +import com.esotericsoftware.yamlbeans.YamlReader; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; @@ -26,7 +27,6 @@ import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.auth.BasicAuthenticationManager; import org.tmatesoft.svn.core.wc.*; -import org.yaml.snakeyaml.Yaml; import java.io.File; import java.io.FileNotFoundException; @@ -280,23 +280,24 @@ public Set getAllGitHubConfig(User user) throws FileNotFoundExcept private Set getAllGithubConfig(FileEntry gitConfigYaml) { Set gitHubConfig = new HashSet<>(); - // Yaml is not thread safe. so create it every time. - Yaml yaml = new Yaml(); - Iterable> gitConfigs = cast(yaml.loadAll(gitConfigYaml.getContent())); - for (Map configMap : gitConfigs) { - if (configMap == null) { - continue; - } - configMap.put("revision", gitConfigYaml.getRevision()); - GitHubConfig config = objectMapper.convertValue(configMap, GitHubConfig.class); + try (YamlReader reader = new YamlReader(gitConfigYaml.getContent())) { + Map gitConfigMap = cast(reader.read()); + while (gitConfigMap != null) { + gitConfigMap.put("revision", gitConfigYaml.getRevision()); + GitHubConfig config = objectMapper.convertValue(gitConfigMap, GitHubConfig.class); + + if (gitHubConfig.contains(config)) { + throw new InvalidGitHubConfigurationException("GitHub configuration '" + + config.getName() + "' is duplicated.\nPlease check your .gitconfig.yml"); + } - if (gitHubConfig.contains(config)) { - throw new InvalidGitHubConfigurationException("GitHub configuration '" - + config.getName() + "' is duplicated.\nPlease check your .gitconfig.yml"); - } + gitHubConfig.add(config); - gitHubConfig.add(config); - } + gitConfigMap = cast(reader.read()); + } + } catch (IOException e) { + throw new InvalidGitHubConfigurationException("Fail to read GitHub configuration.", e); + } return gitHubConfig; } diff --git a/ngrinder-controller/src/test/java/org/ngrinder/script/service/GitHubFileEntryServiceTest.java b/ngrinder-controller/src/test/java/org/ngrinder/script/service/GitHubFileEntryServiceTest.java new file mode 100644 index 0000000000..6bd0a6e11a --- /dev/null +++ b/ngrinder-controller/src/test/java/org/ngrinder/script/service/GitHubFileEntryServiceTest.java @@ -0,0 +1,88 @@ +package org.ngrinder.script.service; + +import org.apache.commons.io.FileUtils; +import org.junit.Before; +import org.junit.Test; +import org.ngrinder.AbstractNGrinderTransactionalTest; +import org.ngrinder.common.util.CompressionUtils; +import org.ngrinder.model.User; +import org.ngrinder.script.model.FileEntry; +import org.ngrinder.script.model.GitHubConfig; +import org.ngrinder.script.repository.MockFileEntityRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.ClassPathResource; + +import java.io.File; +import java.io.IOException; +import java.util.Set; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.is; + +public class GitHubFileEntryServiceTest extends AbstractNGrinderTransactionalTest { + + private static final String GITHUB_CONFIG_NAME = ".gitconfig.yml"; + + @Autowired + private GitHubFileEntryService gitHubFileEntryService; + + @Autowired + private MockFileEntityRepository mockFileEntityRepository; + + @Before + public void before() throws IOException { + File file = new File(System.getProperty("java.io.tmpdir"), "repo"); + FileUtils.deleteQuietly(file); + CompressionUtils.unzip(new ClassPathResource("TEST_USER.zip").getFile(), file); + mockFileEntityRepository.setUserRepository(new File(file, getTestUser().getUserId())); + } + + @Test + public void getAllGitHubConfig() throws Exception { + User testUser = getTestUser(); + + FileEntry fileEntry = new FileEntry(); + fileEntry.setContent("name: My Github Config\n" + + "owner: naver\n" + + "repo: ngrinder\n" + + "access-token: e1a47e652762b60a...3ddc0713b07g13k\n" + + "---\n" + + "name: Another Config\n" + + "owner: naver\n" + + "repo: pinpoint\n" + + "access-token: t9a47e6ff262b60a...3dac0713b07e82a\n" + + "branch: feature/add-ngrinder-scripts\n" + + "base-url: https://api.mygithub.com\n" + + "script-root: ngrinder-scripts\n" + ); + fileEntry.setEncoding("UTF-8"); + fileEntry.setPath(GITHUB_CONFIG_NAME); + fileEntry.setDescription("for unit test"); + mockFileEntityRepository.save(testUser, fileEntry, fileEntry.getEncoding()); + + Set gitHubConfigs = gitHubFileEntryService.getAllGitHubConfig(testUser); + + assertThat(gitHubConfigs.size(), is(2)); + assertThat( + gitHubConfigs, + hasItems( + GitHubConfig.builder() + .name("My Github Config") + .owner("naver") + .repo("ngrinder") + .accessToken("e1a47e652762b60a...3ddc0713b07g13k") + .build(), + GitHubConfig.builder() + .name("Another Config") + .owner("naver") + .repo("pinpoint") + .accessToken("t9a47e6ff262b60a...3dac0713b07e82a") + .branch("feature/add-ngrinder-scripts") + .baseUrl("https://api.mygithub.com") + .scriptRoot("ngrinder-scripts") + .build() + ) + ); + } +}