/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.oodt.cas.protocol.http;

//JUnit imports
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.Scanner;

import org.apache.commons.io.FileUtils;
import org.apache.oodt.cas.protocol.ProtocolFile;
import org.apache.oodt.cas.protocol.auth.NoAuthentication;
import org.apache.oodt.cas.protocol.exceptions.ProtocolException;
import org.apache.oodt.cas.protocol.http.util.HttpUtils;

import junit.framework.TestCase;

/**
 * Test class for {@link HttpProtocol}.
 * 
 * @author bfoster
 */
public class TestHttpProtocol extends TestCase {
	
	public void testConnection() throws InstantiationException, ProtocolException {
		HttpProtocol httpProtocol = new HttpProtocol();
		assertFalse(httpProtocol.connected());
		httpProtocol.connect("svn.apache.org", new NoAuthentication());
		assertTrue(httpProtocol.connected());
	}
	
	public void testLSandCD() throws ProtocolException, InstantiationException {
		HttpProtocol httpProtocol = new HttpProtocol();
		httpProtocol.connect("svn.apache.org", new NoAuthentication());
		assertTrue(httpProtocol.connected());
		httpProtocol.cd(new ProtocolFile("repos/asf/oodt/trunk/protocol/http/src/main/java/org/apache/oodt/cas/protocol/http", true));
		List<ProtocolFile> files = httpProtocol.ls();
		boolean foundFile = false;
		for (ProtocolFile file : files) {
			if (file.getName().equals("HttpProtocol.java")) {
				foundFile = true;
				break;
			}
		}
		assertTrue(foundFile);
	}
	
	public void testPWD() throws ProtocolException {
		HttpProtocol httpProtocol = new HttpProtocol();
		httpProtocol.connect("svn.apache.org", new NoAuthentication());
		assertTrue(httpProtocol.connected());
		ProtocolFile gotoDir = new ProtocolFile(httpProtocol.pwd(),
			"repos/asf/oodt/trunk/protocol/http/src/test/java/org/apache/oodt/cas/protocol/http", true);
		httpProtocol.cd(gotoDir);
		ProtocolFile currentDir = httpProtocol.pwd();
		System.out.println(gotoDir.getAbsoluteFile());
		System.out.println(currentDir.getAbsoluteFile());
		assertEquals(gotoDir, currentDir);
	}
	
	public void testGET() throws ProtocolException, IOException {
		HttpProtocol httpProtocol = new HttpProtocol();
		httpProtocol.connect("svn.apache.org", new NoAuthentication());
		assertTrue(httpProtocol.connected());
		httpProtocol.cd(new ProtocolFile("repos/asf/oodt/trunk/protocol/http/src/test/java/org/apache/oodt/cas"
										 + "/protocol/http", true));
		File bogus = File.createTempFile("bogus", "bogus");
		File tmpDir = new File(bogus.getParentFile(), "TestHttpProtocol");
		bogus.delete();
		tmpDir.mkdirs();
		File toFile = new File(tmpDir, "TestHttpProtocol.java");
		httpProtocol.get(new ProtocolFile("TestHttpProtocol.java", false), toFile);
		assertTrue(toFile.exists());
		assertNotSame(0, toFile.length());
		
		String fileContent = "";
		Scanner scanner = new Scanner(toFile);
		while(scanner.hasNextLine()) {
			fileContent += scanner.nextLine();
		}
		assertEquals(fileContent, HttpUtils.readUrl(HttpUtils.connect(new URL("http://svn.apache.org/repos/asf/oodt/"
																			  + "trunk/protocol/http/src/test/java/org/"
																			  + "apache/oodt/cas/protocol/http/"
																			  + "TestHttpProtocol.java"))));
		FileUtils.forceDelete(tmpDir);
	}
}
