| /* |
| * Copyright 2000-2011 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package git4idea.repo; |
| |
| import com.google.common.base.Function; |
| import com.google.common.collect.Collections2; |
| import com.intellij.openapi.application.PluginPathManager; |
| import com.intellij.openapi.util.io.FileUtil; |
| import com.intellij.openapi.util.text.StringUtil; |
| import com.intellij.openapi.vcs.VcsTestUtil; |
| import com.intellij.util.LineSeparator; |
| import com.intellij.util.containers.ContainerUtil; |
| import git4idea.GitBranch; |
| import git4idea.GitLocalBranch; |
| import git4idea.GitRemoteBranch; |
| import git4idea.GitStandardRemoteBranch; |
| import git4idea.test.GitPlatformTest; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import java.io.File; |
| import java.io.FilenameFilter; |
| import java.io.IOException; |
| import java.util.*; |
| |
| public class GitConfigTest extends GitPlatformTest { |
| |
| public Collection<TestSpec> loadRemotes() throws IOException { |
| return loadConfigData(getTestDataFolder("remote")); |
| } |
| |
| public Collection<TestSpec> loadBranches() throws IOException { |
| return loadConfigData(getTestDataFolder("branch")); |
| } |
| |
| private static File getTestDataFolder(String subfolder) { |
| File testData = getTestDataFolder(); |
| return new File(new File(testData, "config"), subfolder); |
| } |
| |
| @NotNull |
| public static Collection<TestSpec> loadConfigData(@NotNull File dataFolder) throws IOException { |
| File[] tests = dataFolder.listFiles(new FilenameFilter() { |
| @Override |
| public boolean accept(File dir, String name) { |
| return !name.startsWith("."); |
| } |
| }); |
| Collection<TestSpec> data = ContainerUtil.newArrayList(); |
| for (File testDir : tests) { |
| File descriptionFile = null; |
| File configFile = null; |
| File resultFile = null; |
| File[] files = testDir.listFiles(); |
| assertNotNull("No test specifications found in " + testDir.getPath(), files); |
| for (File file : files) { |
| if (file.getName().endsWith("_desc.txt")) { |
| descriptionFile = file; |
| } |
| else if (file.getName().endsWith("_config.txt")) { |
| configFile = file; |
| } |
| else if (file.getName().endsWith("_result.txt")) { |
| resultFile = file; |
| } |
| } |
| assertNotNull(String.format("description file not found in %s among %s", testDir, Arrays.toString(testDir.list())), descriptionFile); |
| assertNotNull(String.format("config file file not found in %s among %s", testDir, Arrays.toString(testDir.list())), configFile); |
| assertNotNull(String.format("result file file not found in %s among %s", testDir, Arrays.toString(testDir.list())), resultFile); |
| |
| String testName = FileUtil.loadFile(descriptionFile).split("\n")[0]; // description is in the first line of the desc-file |
| if (!testName.toLowerCase().startsWith("ignore")) { |
| data.add(new TestSpec(testName, configFile, resultFile)); |
| } |
| } |
| return data; |
| } |
| |
| @NotNull |
| public static File getTestDataFolder() { |
| File pluginRoot = new File(PluginPathManager.getPluginHomePath("git4idea")); |
| return new File(pluginRoot, "testData"); |
| } |
| |
| public void testRemotes() throws IOException { |
| Collection<TestSpec> objects = loadRemotes(); |
| for (TestSpec spec : objects) { |
| doTestRemotes(spec.name, spec.config, spec.result); |
| } |
| } |
| |
| public void testBranches() throws IOException { |
| Collection<TestSpec> objects = loadBranches(); |
| for (TestSpec spec : objects) { |
| doTestBranches(spec.name, spec.config, spec.result); |
| } |
| } |
| |
| private void doTestRemotes(String testName, File configFile, File resultFile) throws IOException { |
| GitConfig config = GitConfig.read(myPlatformFacade, configFile); |
| VcsTestUtil.assertEqualCollections(testName, config.parseRemotes(), readRemoteResults(resultFile)); |
| } |
| |
| private void doTestBranches(String testName, File configFile, File resultFile) throws IOException { |
| Collection<GitBranchTrackInfo> expectedInfos = readBranchResults(resultFile); |
| Collection<GitLocalBranch> localBranches = Collections2.transform(expectedInfos, new Function<GitBranchTrackInfo, GitLocalBranch>() { |
| @Override |
| public GitLocalBranch apply(@Nullable GitBranchTrackInfo input) { |
| assert input != null; |
| return input.getLocalBranch(); |
| } |
| }); |
| Collection<GitRemoteBranch> remoteBranches = Collections2.transform(expectedInfos, new Function<GitBranchTrackInfo, GitRemoteBranch>() { |
| @Override |
| public GitRemoteBranch apply(@Nullable GitBranchTrackInfo input) { |
| assert input != null; |
| return input.getRemoteBranch(); |
| } |
| }); |
| |
| VcsTestUtil.assertEqualCollections(testName, |
| GitConfig.read(myPlatformFacade, configFile).parseTrackInfos(localBranches, remoteBranches), |
| expectedInfos); |
| } |
| |
| private static Collection<GitBranchTrackInfo> readBranchResults(File file) throws IOException { |
| String content = FileUtil.loadFile(file); |
| Collection<GitBranchTrackInfo> remotes = new ArrayList<GitBranchTrackInfo>(); |
| List<String> remStrings = StringUtil.split(content, "BRANCH"); |
| for (String remString : remStrings) { |
| if (StringUtil.isEmptyOrSpaces(remString)) { |
| continue; |
| } |
| String[] info = StringUtil.splitByLines(remString.trim()); |
| String branch = info[0]; |
| GitRemote remote = getRemote(info[1]); |
| String remoteBranchAtRemote = info[2]; |
| String remoteBranchHere = info[3]; |
| boolean merge = info[4].equals("merge"); |
| remotes.add(new GitBranchTrackInfo(new GitLocalBranch(branch, GitBranch.DUMMY_HASH), |
| new GitStandardRemoteBranch(remote, remoteBranchAtRemote, GitBranch.DUMMY_HASH), |
| merge)); |
| } |
| return remotes; |
| } |
| |
| private static GitRemote getRemote(String remoteString) { |
| String[] remoteInfo = remoteString.split(" "); |
| return new GitRemote(remoteInfo[0], getSingletonOrEmpty(remoteInfo, 1), getSingletonOrEmpty(remoteInfo, 2), |
| getSingletonOrEmpty(remoteInfo, 3), getSingletonOrEmpty(remoteInfo, 4)); |
| } |
| |
| private static Set<GitRemote> readRemoteResults(File resultFile) throws IOException { |
| String content = FileUtil.loadFile(resultFile); |
| Set<GitRemote> remotes = new HashSet<GitRemote>(); |
| List<String> remStrings = StringUtil.split(content, "REMOTE"); |
| for (String remString : remStrings) { |
| if (StringUtil.isEmptyOrSpaces(remString)) { |
| continue; |
| } |
| String[] info = StringUtil.splitByLines(remString.trim()); |
| String name = info[0]; |
| List<String> urls = getSpaceSeparatedStrings(info[1]); |
| Collection<String> pushUrls = getSpaceSeparatedStrings(info[2]); |
| List<String> fetchSpec = getSpaceSeparatedStrings(info[3]); |
| List<String> pushSpec = getSpaceSeparatedStrings(info[4]); |
| GitRemote remote = new GitRemote(name, urls, pushUrls, fetchSpec, pushSpec); |
| remotes.add(remote); |
| } |
| return remotes; |
| } |
| |
| private static List<String> getSpaceSeparatedStrings(String line) { |
| if (StringUtil.isEmptyOrSpaces(line)) { |
| return Collections.emptyList(); |
| } |
| return Arrays.asList(line.split(" ")); |
| } |
| |
| private static List<String> getSingletonOrEmpty(String[] array, int i) { |
| return array.length < i + 1 ? Collections.<String>emptyList() : Collections.singletonList(array[i]); |
| } |
| |
| private static class TestSpec { |
| @NotNull String name; |
| @NotNull File config; |
| @NotNull File result; |
| |
| public TestSpec(@NotNull String testName, @NotNull File configFile, @NotNull File resultFile) { |
| this.name = testName; |
| this.config = configFile; |
| this.result = resultFile; |
| } |
| } |
| |
| } |