package com.gitblit.tests;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.text.MessageFormat;
import java.util.Date;
import java.util.concurrent.Executors;

import junit.framework.TestCase;

import org.eclipse.jgit.api.CloneCommand;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import org.eclipse.jgit.util.FileUtils;

import com.gitblit.GitBlitServer;

public class GitServletTest extends TestCase {

	File folder = new File(GitBlitSuite.REPOSITORIES, "working/ticgit");

	int port = 8180;

	int shutdownPort = 8181;

	@Override
	protected void setUp() throws Exception {
		// Start a Gitblit instance
		Executors.newSingleThreadExecutor().execute(new Runnable() {
			public void run() {
				GitBlitServer.main("--httpPort", "" + port, "--httpsPort", "0", "--shutdownPort",
						"" + shutdownPort, "--repositoriesFolder",
						"\"" + GitBlitSuite.REPOSITORIES.getAbsolutePath() + "\"", "--userService",
						"distrib/users.properties");
			}
		});

		// Wait a few seconds for it to be running
		Thread.sleep(2500);
	}

	@Override
	protected void tearDown() throws Exception {
		// Stop Gitblit
		GitBlitServer.main("--stop", "--shutdownPort", "" + shutdownPort);

		// Wait a few seconds for it to be running
		Thread.sleep(2500);
	}

	public void testClone() throws Exception {
		if (folder.exists()) {
			FileUtils.delete(folder, FileUtils.RECURSIVE);
		}
		CloneCommand clone = Git.cloneRepository();
		clone.setURI(MessageFormat.format("http://localhost:{0,number,#}/git/ticgit.git", port));
		clone.setDirectory(folder);
		clone.setBare(false);
		clone.setCloneAllBranches(true);
		clone.call();
	}

	public void testAnonymousCommit() throws Exception {
		Git git = Git.open(folder);
		File file = new File(folder, "TODO");
		OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream(file, true));
		BufferedWriter w = new BufferedWriter(os);
		w.write("// " + new Date().toString() + "\n");
		w.close();
		git.add().addFilepattern(file.getName()).call();
		git.commit().setMessage("test commit").call();
		git.push().setPushAll().call();
		git.getRepository().close();
	}
		
	public void testBogusLoginClone() throws Exception {
		File folder = new File(GitBlitSuite.REPOSITORIES, "working/gitblit");
		if (folder.exists()) {
			FileUtils.delete(folder, FileUtils.RECURSIVE);
		}
		CloneCommand clone = Git.cloneRepository();
		clone.setURI(MessageFormat.format("http://localhost:{0,number,#}/git/gitblit.git", port));
		clone.setDirectory(folder);
		clone.setBare(false);
		clone.setCloneAllBranches(true);
		clone.setCredentialsProvider(new UsernamePasswordCredentialsProvider("bogus", "bogus"));
		clone.call();
	}
}
