blob: 7149e0efe52259cb3a31b3a80c9ce90bdab05a3b [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* 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 com.google.gct.idea.appengine.synchronization;
import com.google.common.collect.Lists;
import junit.framework.Assert;
import org.apache.commons.io.FileUtils;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ListBranchCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.junit.RepositoryTestCase;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.RemoteConfig;
import org.eclipse.jgit.transport.URIish;
import org.junit.Ignore;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URISyntaxException;
import java.util.ArrayList;
/**
* Tests for {@link SampleSyncTask}
*/
public class SampleSyncTaskTest extends RepositoryTestCase {
private Git mockGitHubRepo;
private String mockAndroidRepoPath;
private String mockGitHubRepoPath;
@Override
public void setUp() throws Exception {
super.setUp();
mockAndroidRepoPath = System.getProperty("java.io.tmpdir") + "/android/mockAndroidRepo";
String mockGitHubRepoGitPath = db.getDirectory().getPath();
mockGitHubRepoPath = mockGitHubRepoGitPath.substring(0, mockGitHubRepoGitPath.lastIndexOf('/'));
// Configure the mock github repo
StoredConfig targetConfig = db.getConfig();
targetConfig.setString("branch", "master", "remote", "origin");
targetConfig.setString("branch", "master", "merge", "refs/heads/master");
RemoteConfig config = new RemoteConfig(targetConfig, "origin");
config.addURI(new URIish(mockGitHubRepoGitPath));
config.addFetchRefSpec(new RefSpec("+refs/heads/*:refs/remotes/origin/*"));
config.update(targetConfig);
targetConfig.save();
mockGitHubRepo = new Git(db);
// commit something
writeTrashFile("Test.txt", "Hello world");
mockGitHubRepo.add().addFilepattern("Test.txt").call();
mockGitHubRepo.commit().setMessage("Initial commit").call();
mockGitHubRepo.tag().setName("tag-initial").setMessage("Tag initial").call();
}
@Override
public void tearDown() throws IOException {
FileUtils.forceDelete(new File(mockAndroidRepoPath));
}
@Ignore
@Test
public void testSync_noLocalRepo() throws IOException, GitAPIException {
// Sync files from mock Git Hub repo to mock local Android sample template repo
SampleSyncTask sampleSyncTask = new SampleSyncTask(mockAndroidRepoPath, mockGitHubRepoPath);
sampleSyncTask.run();
File mockAndroidRepoDir = new File(mockAndroidRepoPath);
Assert.assertTrue(mockAndroidRepoDir.exists());
Git mockAndroidRepo = Git.open(mockAndroidRepoDir);
Assert.assertEquals("refs/heads/master", mockAndroidRepo.getRepository().getFullBranch());
Assert.assertEquals(1, mockAndroidRepo.branchList().setListMode(ListBranchCommand.ListMode.REMOTE).call().size());
File mockGitHubRepoDir = new File(mockGitHubRepoPath);
Assert.assertTrue(mockGitHubRepoDir.exists());
File[] mockAndroidRepoFiles = mockAndroidRepoDir.listFiles();
File[] mockGitHubRepoFiles = mockGitHubRepoDir.listFiles();
Assert.assertEquals(mockGitHubRepoFiles.length, mockAndroidRepoFiles.length);
int num = 0;
for(File aFile : mockGitHubRepoFiles) {
aFile.getName().equals(mockAndroidRepoFiles[0].getName());
num++;
}
}
@Ignore
@Test
public void testSync_singleCommit() throws GitAPIException, IOException, URISyntaxException {
// Sync files from mock Git Hub repo to mock local Android sample template repo
SampleSyncTask sampleSyncTask = new SampleSyncTask(mockAndroidRepoPath, mockGitHubRepoPath);
sampleSyncTask.run();
// Add a file to mock github repo
RevCommit commit = addFileToMockGitHubRepo("a.txt", "Adding a.txt");
// Sync files from mock Git Hub repo to mock local Android sample template repo
sampleSyncTask.run();
// Check that the last commit in the mock Android repo is the commit made to add a new file
Git mockAndroidRepo = Git.open(new File(mockAndroidRepoPath));
Iterable<RevCommit> logs = mockAndroidRepo.log().call();
Assert.assertNotNull(logs);
// Check that commits exist
boolean hasCommits = false;
for (RevCommit aLog : logs) {
hasCommits = true;
Assert.assertEquals(commit.getCommitTime(), aLog.getCommitTime());
Assert.assertEquals(commit.getFullMessage(), aLog.getFullMessage());
break;
}
Assert.assertTrue(hasCommits);
}
@Ignore
@Test
public void testSync_multipleCommits() throws GitAPIException, IOException {
// Sync files from mock Git Hub repo to mock local Android sample template repo
SampleSyncTask sampleSyncTask = new SampleSyncTask(mockAndroidRepoPath, mockGitHubRepoPath);
sampleSyncTask.run();
// Add 2 files to mock github repo
RevCommit commit1 = addFileToMockGitHubRepo("a.txt", "Adding a.txt");
Assert.assertNotNull(commit1);
RevCommit commit2 = addFileToMockGitHubRepo("b.txt", "Adding b.txt");
Assert.assertNotNull(commit2);
// Delete a file from github repo
RevCommit commit3 = removeFileFromMockGitHubRepo("a.txt", "Removing a.txt");
Assert.assertNotNull(commit3);
// Sync files from mock Git Hub repo to mock local Android sample template repo
sampleSyncTask.run();
// Check that last 3 commits in mock Android repo
Git mockAndroidRepo = Git.open(new File(mockAndroidRepoPath));
Iterable<RevCommit> logs = mockAndroidRepo.log().call();
Assert.assertNotNull(logs);
ArrayList<RevCommit> logsList = Lists.newArrayList(logs);
Assert.assertTrue(logsList.size() >= 3);
Assert.assertEquals(commit3.getCommitTime(), logsList.get(0).getCommitTime());
Assert.assertEquals(commit3.getFullMessage(), logsList.get(0).getFullMessage());
Assert.assertEquals(commit2.getCommitTime(), logsList.get(1).getCommitTime());
Assert.assertEquals(commit2.getFullMessage(), logsList.get(1).getFullMessage());
Assert.assertEquals(commit1.getCommitTime(), logsList.get(2).getCommitTime());
Assert.assertEquals(commit1.getFullMessage(), logsList.get(2).getFullMessage());
}
private RevCommit addFileToMockGitHubRepo(String fileName, String commitMessage) throws GitAPIException, IOException {
// Create a new file
File file = new File(db.getWorkTree(), fileName);
file.createNewFile();
PrintWriter writer = new PrintWriter(file);
writer.print("Some content");
writer.close();
// Add file to mocked Github repo
mockGitHubRepo.add().addFilepattern(fileName).call();
RevCommit commit = mockGitHubRepo.commit()
.setMessage(commitMessage)
.call();
Assert.assertNotNull(commit);
mockGitHubRepo.push().call();
return commit;
}
private RevCommit removeFileFromMockGitHubRepo(String fileName, String commitMessage) throws GitAPIException {
mockGitHubRepo.rm()
.addFilepattern(fileName)
.call();
RevCommit commit = mockGitHubRepo.commit()
.setMessage(commitMessage)
.call();
Assert.assertNotNull(commit);
mockGitHubRepo.push().call();
return commit;
}
}