context: //
  // NAnt.SharePoint Microsoft Sharepoint Server utility tasks.
  // Copyright (C) 2004 Interlink Group, LLC
  //
  // This library is free software; you can redistribute it and/or
  // modify it under the terms of the GNU Lesser General Public
  // License as published by the Free Software Foundation; either
  // version 2.1 of the License, or (at your option) any later version.
  // 
  // This library 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
  // Lesser General Public License for more details.
  // 
  // You should have received a copy of the GNU Lesser General Public
  // License along with this library; if not, write to the Free Software
  // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  //
  using System;
  using System.DirectoryServices;
  using System.Globalization;
  using System.IO;
  
  using Microsoft.SharePoint;
  using Microsoft.SharePoint.Administration;
  using Microsoft.SharePoint.Utilities;
  
  using NUnit.Framework;
  
  using Tests.NAnt.Core;
  using Tests.NAnt.Core.Util;
  
  namespace NAnt.SharePoint.Tasks {
      /// <summary>
      /// Summary description for CreateSPSiteTaskTest.
      /// </summary>
      [TestFixture]
      public class CreateSPSiteTaskTest : BuildTestBase {
          #region private members for test values
  
          /// <summary>
          /// UserName that will be used to create the test user.
          /// </summary>
          private static string _userName = "DeleteSPSiteTaskUser";
  
          /// <summary>
          /// Password that will be given to the test user.
          /// </summary>
          private static string _password = "Delete1SPSiteTaskUserPassword";
  
          /// <summary>
          /// Title for test site.
          /// </summary>
          private static string _newSPSiteTitle = "Create SPSite Test 1";
  
          /// <summary>
          /// Abbreviatin for test site that will be used to build the Url.
          /// </summary>
          private static string _newSPSiteAbbreviation = "CSPT1";
  
          /// <summary>
          /// Url for test site.
          /// </summary>
          private static string _newSPSiteServerUrl = "http://" + System.Environment.MachineName;
  
          /// <summary>
          /// Url for test site.
          /// </summary>
          private static string _newSPSiteUrl = _newSPSiteServerUrl + "/sites/" + _newSPSiteAbbreviation;
  
          /// <summary>
          /// Description for test site.
          /// </summary>
          private static string _newSPSiteDescription = "New Area Description..." + 
              _newSPSiteTitle;
  
          /// <summary>
          /// SPS Template for test site.
          /// </summary>
          private static string _newSPSiteTemplate = "STS";
  
          /// <summary>
          /// SPS managed path within SharePoint for test site.
          /// </summary>
          private static string _newSPSiteManagedPath = "sites";
  
          /// <summary>
          /// Login account for test site.
          /// </summary>
          private static string _newSPSiteOwnerLogin = System.Environment.MachineName + "\\" + _userName;
  
          /// <summary>
          /// Owner name for test site.
          /// </summary>
          private static string _newSPSiteOwnerName = "Donald Duck";
  
          /// <summary>
          /// Email for owner of test site.
          /// </summary>
          private static string _newSPSiteOwnerEmail = "Donal.Duck@disney.com";
  
          /// <summary>
          /// Login account for test site.
          /// </summary>
          private static string _newSPSiteContactLogin = System.Environment.MachineName + "\\" + _userName;
  
          /// <summary>
          /// Contact name for test site.
          /// </summary>
          private static string _newSPSiteContactName = "Daisy Duck";
  
          /// <summary>
          /// Email for contact of test site.
          /// </summary>
          private static string _newSPSiteContactEmail = "daisy.duck@disney.com";
  
          /// <summary>
          /// AD path string for the root directory of the local machine.
          /// </summary>
          private static string _rootDirectory = "WinNT://" + Environment.MachineName + ", computer";
  
          #endregion private members for test values
  
          #region private members for project xml
          private static string _xmlProjectTemplate = 
              @"<project name='Test Delete' default='create'>
                  <target name='create'>
                      <createspsite failonerror='{0}'
                      url='{1}'
                      abbreviation='{2}' 
                      title='{3}' 
                      description='{4}' 
                      template='{5}' 
                      managedpath='{6}'
                      ownerlogin='{7}' 
                      ownername='{8}' 
                      owneremail='{9}' 
                      contactlogin='{10}' 
                      contactname='{11}' 
                      contactemail='{12}'/>
                  </target>
              </project>";
          #endregion private members for project xml
  
          [SetUp]
          protected override void SetUp() {
              base.SetUp();
              
              DirectoryEntry root = new DirectoryEntry(_rootDirectory);
              DirectoryEntry userEntry = root.Children.Add(_userName, "user");
              userEntry.Invoke("SetPassword", _password);
              userEntry.CommitChanges(); 
          }
  
          [TearDown]
          protected override void TearDown() {
              DirectoryEntry root = new DirectoryEntry(_rootDirectory);
              DirectoryEntry userEntry = root.Children.Find(_userName);
              root.Children.Remove(userEntry);
              
              try {
                  SPSite site = new SPSite(_newSPSiteUrl);
                  site.Delete(); 
              } catch (FileNotFoundException) {
                  // If a FileNotFoundException was raise it was because the site was 
                  // correctly deleted by the test.
              }
          }
  
          [Test]
          public void TestCreateSPSite() {
  
              string[] parameters = new string[]{"true", 
                                                    _newSPSiteServerUrl,
                                                    _newSPSiteAbbreviation,
                                                    _newSPSiteTitle, 
                                                    _newSPSiteDescription, 
                                                    _newSPSiteTemplate, 
                                                    _newSPSiteManagedPath,
                                                    _newSPSiteOwnerLogin, 
                                                    _newSPSiteOwnerName, 
                                                    _newSPSiteOwnerEmail, 
                                                    _newSPSiteContactLogin, 
                                                    _newSPSiteContactName, 
                                                    _newSPSiteContactEmail,};
  
              string result = result = RunBuild(String.Format(
                  CultureInfo.InvariantCulture, 
                  _xmlProjectTemplate, 
                  parameters));
              
              SPGlobalAdmin globalAdmin = new SPGlobalAdmin();
              System.Uri uri = new System.Uri(_newSPSiteServerUrl);
              SPVirtualServer vs = globalAdmin.OpenVirtualServer(uri);
  
              bool siteWasCreated = false;
              foreach (SPSite site in vs.Sites) {
                  if (site.RootWeb.Title.Equals(_newSPSiteTitle)) {
                      siteWasCreated = true;
                  }
              }
              Assertion.Assert("The site was not created.", siteWasCreated);
          }
  
          [Test]
          [ExpectedException(typeof(TestBuildException))]
          public void TestCreateSPSiteInvalidUrl() {
              string[] parameters = new string[]{"true", 
                                                    "foo",
                                                    _newSPSiteAbbreviation,
                                                    _newSPSiteTitle, 
                                                    _newSPSiteDescription, 
                                                    _newSPSiteTemplate, 
                                                    _newSPSiteManagedPath,
                                                    _newSPSiteOwnerLogin, 
                                                    _newSPSiteOwnerName, 
                                                    _newSPSiteOwnerEmail, 
                                                    _newSPSiteContactLogin, 
                                                    _newSPSiteContactName, 
                                                    _newSPSiteContactEmail,};
  
              string result = result = RunBuild(String.Format(
                  CultureInfo.InvariantCulture, 
                  _xmlProjectTemplate, 
                  parameters));
              
              SPGlobalAdmin globalAdmin = new SPGlobalAdmin();
              System.Uri uri = new System.Uri(_newSPSiteServerUrl);
              SPVirtualServer vs = globalAdmin.OpenVirtualServer(uri);
  
              bool siteWasCreated = false;
              foreach (SPSite site in vs.Sites) {
                  if (site.RootWeb.Title.Equals(_newSPSiteTitle)) {
                      siteWasCreated = true;
                  }
              }
              Assertion.Assert("The site was not created.", siteWasCreated);
          }
  
          [Test]
          public void TestCreateSPSiteInvalidUrlWithoutFailOnError() {
  
gt:             string[] parameters = new string[]{"false", 