// NAnt - A .NET build tool
// Copyright (C) 2001-2003 Gerry Shaw
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// Clayton Harbour (claytonharbour@sporadicism.com)
using System.Globalization;
using System.IO;
using NUnit.Framework;
using NAnt.Core;
using NAnt.Core.Tasks;
using Tests.NAnt.Core;
namespace Tests.NAnt.SourceControl.Tasks {
///
/// Tests that the update task performs correctly and does
/// not return errors.
///
[TestFixture]
public class UpdateTaskTest : BuildTestBase {
#region Private Instance Fields
private string destination;
private const bool TestUseSharpCvsLib = false;
private readonly string TestModule = "sharpcvslib";
private readonly string CheckFile = "lib/ICSharpCode.SharpZipLib.dll";
private readonly string TestCvsRoot =
":pserver:anonymous@cvs.sourceforge.net:/cvsroot/sharpcvslib";
private readonly string _checkoutXML = @"
";
///
/// Project to update the working directory.
///
private readonly string _updateXML = @"
";
///
/// Filesets are not currently implemented in sharpcvslib so we default
/// to using the command line client for this test.
///
/// CDH: 2004/03/25
///
/* private readonly string _updateFilesetsXML = @"
";
*/
private readonly string _updateOptionsXML = @"
";
#endregion Private Instance Fields
#region Override implementation of BuildTestBase
///
/// Run the checkout command so we have something to update.
///
[SetUp]
protected override void SetUp () {
base.SetUp ();
this.destination = this.TempDirName;
object[] args = {TestUseSharpCvsLib.ToString(), TestModule,
TestCvsRoot, this.destination, string.Empty, string.Empty};
string checkoutBuild = FormatBuildFile(_checkoutXML, args);
this.RunBuild(checkoutBuild, Level.Info);
}
///
/// Remove the directory created by the checkout/ update.
///
[TearDown]
protected override void TearDown () {
base.TearDown();
}
#endregion Override implementation of BuildTestBase
#region Public Instance Methods
///
/// Test that a file deleted from the local working directory
/// is retrieved from the cvs repository during an update.
///
[Test]
[Category("InetAccess")]
public void Test_CvsUpdate () {
string checkoutPath = Path.Combine(this.destination, this.TestModule);
string checkFilePath = Path.Combine(checkoutPath, this.CheckFile);
if (File.Exists(checkFilePath)) {
// Delete the file.
File.Delete(checkFilePath);
}
// Make sure the file does not exist before we start the test.
Assert.IsFalse(File.Exists(checkFilePath), "The check file should not be there.");
// Run the update to bring the file back down.
object[] args = {TestUseSharpCvsLib.ToString(), TestModule, TestCvsRoot, checkoutPath,
string.Empty};
this.RunBuild(FormatBuildFile(_updateXML, args),
Level.Info);
// Check that the file is back.
Assert.IsTrue(File.Exists(checkFilePath),
"File does not exist, update probably did not work.");
}
[Test]
[Category("InetAccess")]
public void TestUpdateClean () {
string checkoutPath = Path.Combine(this.destination, this.TestModule);
string checkFilePath = Path.Combine(checkoutPath, this.CheckFile);
string checkContents;
StreamReader reader = new StreamReader(File.Open(checkFilePath, FileMode.Open));
checkContents = reader.ReadToEnd();
reader.Close();
reader = null;
// Update the file with data
FileStream writer = File.Open(checkFilePath, FileMode.Append, FileAccess.Write);
string updateMsg = "UpdateTaskTest - overwrite local changes test.";
byte[] updateMsgBytes = System.Text.Encoding.ASCII.GetBytes(updateMsg);
writer.Write(updateMsgBytes, 0, updateMsgBytes.Length);
writer.Close();
writer = null;
// Run the update to bring the file back down.
bool buildDirs = false;
bool pruneEmpty = false;
bool overwriteLocal = true;
bool recursive = false;
object[] args = {TestUseSharpCvsLib.ToString(), TestModule, TestCvsRoot, checkoutPath,
buildDirs, pruneEmpty, overwriteLocal, recursive, checkFilePath};
string formattedBuildFile = FormatBuildFile(this._updateOptionsXML, args);
this.RunBuild(formattedBuildFile,
Level.Info);
// Check that the file is back.
Assert.IsTrue(File.Exists(checkFilePath),
"File does not exist, update probably did not work.");
StreamReader replacedReader = new StreamReader(File.Open(checkFilePath, FileMode.Open));
string checkContentsReplaced = replacedReader.ReadToEnd();
replacedReader.Close();
replacedReader = null;
Assert.AreEqual(checkContents, checkContentsReplaced);
}
#endregion Public Instance Methods
#region Private Instance Methods
private string FormatBuildFile(string baseFile, object[] args) {
return string.Format(CultureInfo.InvariantCulture, baseFile, args);
}
#endregion Private Instance Methods
}
}