xenadmin/XenAdminTests/FolderTests/FolderTest.cs
Konstantina Chremmou 62586ef89c CP-5750: Removed ActionType; the actions should be categorised by status (in progress,
succeeded, failed; cancelled at the moment counts as failed, we may need to distinguish
in future). As a consequence the filter checkboxes from the top of the Log tab
were removed and some temporary changes were made to the drawing of action rows
(the controls will change completely in a subsequent commit).

Signed-off-by: Konstantina Chremmou <konstantina.chremmou@citrix.com>
2013-08-09 17:20:38 +01:00

342 lines
11 KiB
C#

/* Copyright (c) Citrix Systems Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.Xml;
using NUnit.Framework;
using XenAdmin;
using XenAdmin.Actions;
using XenAdmin.Model;
using XenAdmin.Network;
using XenAdmin.XenSearch;
using XenAdminTests.SearchTests;
using XenAPI;
namespace XenAdminTests.FolderTests
{
public abstract class FolderTest : MainWindowLauncher_TestFixture
{
public FolderTest() : base("state4.xml") { }
[Test]
public void RunTests()
{
VerifyResult(false); // test the test framework and the database by verifying the "before" state
DoAction();
WaitForActions();
VerifyResult(true);
}
private void VerifyResult(bool after)
{
Search search = EverythingInFolders();
XmlNode expectedResults = GetExpectedResults(after);
MW(delegate() { ComparerAdapter.CompareResults(search, expectedResults); });
}
protected void WaitForActions()
{
// Wait up to 30 seconds to finish all the actions
for (int i = 0; i < 60; ++i)
{
Thread.Sleep(500);
if (!HasOutstandingActions())
break;
}
}
private Search EverythingInFolders()
{
QueryScope scope = new QueryScope(ObjectTypes.AllIncFolders);
QueryFilter filter = new NullQuery<Folder>(PropertyNames.folder, false);
Query q = new Query(scope, filter);
Grouping grouping = new FolderGrouping((Grouping)null);
return new Search(q, grouping, false, "", null, false);
}
private bool HasOutstandingActions()
{
foreach (XenAdmin.Actions.ActionBase a in ConnectionsManager.History)
{
if (!a.IsCompleted)
return true;
}
return false;
}
protected XmlDocument doc;
protected XmlElement xmlSearch, xmlFolderHR, xmlFolderIT, xmlIncubus, xmlHottub;
private XmlNode GetExpectedResults(bool after)
{
// These are the folders for the unmodified database
doc = new XmlDocument();
xmlSearch = doc.CreateElement("search");
doc.AppendChild(xmlSearch);
xmlFolderHR = CreateNode("/HR");
xmlSearch.AppendChild(xmlFolderHR);
xmlIncubus = CreateNode("OpaqueRef:7166136b-f599-3e3c-4515-40dae8cbbead");
xmlFolderHR.AppendChild(xmlIncubus);
xmlFolderIT = CreateNode("/IT Dept");
xmlSearch.AppendChild(xmlFolderIT);
xmlHottub = CreateNode("OpaqueRef:ec64ce83-5185-193c-83a5-53fac244fab4");
xmlFolderIT.AppendChild(xmlHottub);
// The derived class then modifies them through this virtual function
if (after)
PrepareResults();
return xmlSearch;
}
protected XmlElement CreateNode(string opaqueref)
{
XmlElement element = doc.CreateElement("IXenObject");
element.SetAttribute("opaqueref", opaqueref);
return element;
}
// Overridden by the derived class to do some sort of poking around in the folders
protected abstract void DoAction();
// Overridden by the derived class to alter the expected search results to correspond to the above poking
protected abstract void PrepareResults();
}
[TestFixture, Category(TestCategories.UICategoryA)]
public class FolderTest_DoNothing : FolderTest
{
protected override void DoAction()
{
}
protected override void PrepareResults()
{
}
}
[TestFixture, Category(TestCategories.UICategoryA), Category(TestCategories.SmokeTest)]
public class FolderTest_Create : FolderTest
{
protected override void DoAction()
{
IXenConnection connection = GetAnyConnection(); // we only have one
Folders.Create(connection, "/zzz", "/aaa/yyy", "/HR/newHR");
}
protected override void PrepareResults()
{
XmlElement zzz = CreateNode("/zzz");
xmlSearch.AppendChild(zzz);
XmlElement aaa = CreateNode("/aaa");
xmlSearch.PrependChild(aaa);
XmlElement yyy = CreateNode("/aaa/yyy");
aaa.AppendChild(yyy);
XmlElement newHR = CreateNode("/HR/newHR");
xmlFolderHR.PrependChild(newHR);
}
}
[TestFixture, Category(TestCategories.UICategoryA)]
public class FolderTest_Delete : FolderTest
{
protected override void DoAction()
{
Folder folder = GetAnyFolder(delegate(Folder f)
{
return f.name_label == "HR";
});
Folders.Unfolder(folder);
}
protected override void PrepareResults()
{
xmlSearch.RemoveChild(xmlFolderHR);
}
}
[TestFixture, Category(TestCategories.UICategoryA)]
public class FolderTest_DeleteSubFolder : FolderTest
{
protected override void DoAction()
{
IXenConnection connection = GetAnyConnection();
Folders.Create(connection, "/HR/bbb/ccc/ddd");
WaitForActions();
Folder folder = GetAnyFolder(delegate(Folder f)
{
return f.name_label == "ccc";
});
Folders.Unfolder(folder);
}
protected override void PrepareResults()
{
XmlElement bbb = CreateNode("/HR/bbb");
xmlFolderHR.PrependChild(bbb);
}
}
[TestFixture, Category(TestCategories.UICategoryA)]
public class FolderTest_Rename : FolderTest
{
protected override void DoAction()
{
IXenConnection connection = GetAnyConnection();
Folders.Create(connection, "/HR/bbb");
WaitForActions();
Folder folder = GetAnyFolder(delegate(Folder f)
{
return f.name_label == "HR";
});
Folders.Rename(folder, "Human Resources");
}
protected override void PrepareResults()
{
xmlFolderHR.SetAttribute("opaqueref", "/Human Resources");
XmlElement bbb = CreateNode("/Human Resources/bbb");
xmlFolderHR.PrependChild(bbb);
}
}
[TestFixture, Category(TestCategories.UICategoryA)]
public class FolderTest_Unfolder : FolderTest
{
protected override void DoAction()
{
Folders.Unfolder(GetAnyPool()); // we only have one pool
}
protected override void PrepareResults()
{
xmlFolderIT.RemoveChild(xmlHottub);
}
}
[TestFixture, Category(TestCategories.UICategoryA)]
public class FolderTest_Insert : FolderTest
{
protected override void DoAction()
{
VM vm = GetAnyVM(delegate(VM v)
{
return v.name_label == "Iscsi Box";
});
Folder folder = GetAnyFolder(delegate(Folder f)
{
return f.name_label == "IT Dept";
});
Folders.Move(vm, folder);
}
protected override void PrepareResults()
{
XmlElement vm = CreateNode("OpaqueRef:eef198a8-a2df-4141-2869-3234a029a4f5");
xmlFolderIT.AppendChild(vm);
}
}
[TestFixture, Category(TestCategories.UICategoryA)]
public class FolderTest_MoveFolder : FolderTest
{
protected override void DoAction()
{
Folder folderHR = GetAnyFolder(delegate(Folder f)
{
return f.name_label == "HR";
});
Folder folderIT = GetAnyFolder(delegate(Folder f)
{
return f.name_label == "IT Dept";
});
Folders.Move(folderHR, folderIT);
}
protected override void PrepareResults()
{
xmlFolderHR.SetAttribute("opaqueref", "/IT Dept/HR");
xmlFolderIT.PrependChild(xmlFolderHR);
}
}
[TestFixture, Category(TestCategories.UICategoryA)]
public class FolderTest_CantMoveFolderIntoChild : FolderTest
{
protected override void DoAction()
{
IXenConnection connection = GetAnyConnection();
Folders.Create(connection, "/HR/bbb/ccc/ddd");
WaitForActions();
Folder folderHR = GetAnyFolder(delegate(Folder f)
{
return f.name_label == "HR";
});
Folder folderD = GetAnyFolder(delegate(Folder f)
{
return f.name_label == "ddd";
});
Folders.Move(folderHR, folderD);
}
protected override void PrepareResults()
{
XmlElement bbb = CreateNode("/HR/bbb");
xmlFolderHR.PrependChild(bbb);
XmlElement ccc = CreateNode("/HR/bbb/ccc");
bbb.AppendChild(ccc);
XmlElement ddd = CreateNode("/HR/bbb/ccc/ddd");
ccc.AppendChild(ddd);
}
}
}