/* 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 NUnit.Framework; using XenAdmin.Controls.DataGridViewEx; using XenAdmin.Wizards.NewVMWizard; using XenAdmin.ServerDBs; using XenAPI; using XenAdmin; using System.Windows.Forms; namespace XenAdminTests.WizardTests.state4_xml { /// /// Tests that VM.Clone is called when using the New VM Wizard with a user template with default storage settings. /// public abstract class NewVMWizardBiosStringsTest : WizardTest { protected bool _copyBiosStringsInvoked; protected NewVMWizardBiosStringsTest(string[] pages) : base(pages, true, true) { Assert.AreEqual(1, DbProxy.proxys.Count); DbProxy.proxys[ConnectionsManager.XenConnectionsCopy[0]].Invoking += DbProxy_Invoking; } protected void DbProxy_Invoking(object sender, DbProxyInvokingEventArgs e) { _copyBiosStringsInvoked |= e.ProxyMethodInfo.MethodName == "copy_bios_strings" && e.ProxyMethodInfo.TypeName == "vm"; } protected static int FindRow(DataGridView gridView, VM v) { DataGridViewRowCollection rows = gridView.Rows; for (int i = 0; i < rows.Count; ++i) { Page_Template.TemplatesGridViewItem row = (Page_Template.TemplatesGridViewItem)rows[i]; if (row.Template == v) return i; } return -1; // no matches } } [TestFixture, Category(TestCategories.UICategoryB)] public class NewVMWizardBiosStringsSnapshotTest : NewVMWizardBiosStringsTest { public NewVMWizardBiosStringsSnapshotTest() : base(new[] { "Template", "BIOS Strings", "Name", "Installation Media", "Home Server", "CPU && Memory", "Storage", "Networking", "Finish" }) { Assert.AreEqual(1, DbProxy.proxys.Count); DbProxy.proxys[ConnectionsManager.XenConnectionsCopy[0]].Invoking += DbProxy_Invoking; } protected override NewVMWizard NewWizard() { VM snapshot = GetAnySnapshot(v=>v.name_label != "orphaned snapshot"); Assert.NotNull(snapshot, "Snapshot not found."); List hosts = new List(snapshot.Connection.Cache.Hosts); Assert.IsTrue( hosts.Count > 0 ); hosts.Sort(); return new NewVMWizard(snapshot.Connection, snapshot, hosts[0]); } protected override void TestPage(string pageName) { if (pageName == "Template") { var gridView = TestUtils.GetDataGridView(wizard, "page_1_Template.TemplatesGridView"); var checkBox = TestUtils.GetCheckBox(wizard, "page_1_Template.checkBoxCopyBiosStrings"); MWWaitFor(() => gridView.SelectedRows.Count == 1, "First item (snapshot) wasn't selected by default."); int row1 = gridView.SelectedRows[0].Index; MW(() => { Assert.IsTrue(checkBox.Checked, "Checkbox should be checked for BIOS locked snapshot."); Assert.IsFalse(checkBox.Enabled, "Checkbox should be disabled for BIOS locked snapshot."); }); // select a Windows template VM defaultTemplate = GetAnyDefaultTemplate(v => v.IsHVM && v.name_label != "orphaned snapshot"); int row2 = FindRow(gridView, defaultTemplate); MW(() => gridView.Rows[row2].Selected = true); MWWaitFor(() => !checkBox.Checked, "Checkbox was checked for default-template."); MW(() => Assert.IsTrue(checkBox.Enabled, "Checkbox should be enabled when default-template selected.")); // check the checkbox and move to the previous selection MW(() => { checkBox.Checked = true; gridView.Rows[row1].Selected = true; }); MWWaitFor(() => checkBox.Checked, "Checkbox should remain checked when moving from default-template to BIOS locked snapshot"); MW(() => Assert.IsFalse(checkBox.Enabled, "Checkbox should be disabled for for BIOS locked snapshot")); } else if (pageName == "BIOS Strings") { MWWaitFor(() => TestUtils.GetDataGridView(wizard, "page_1b_BiosLocking.ServersGridView").RowCount == 0); } else if (pageName == "Name") { Assert.IsFalse(TestUtils.GetXenTabPage(wizard,"page_4_HomeServer").DisableStep, "Home Server page should be enabled when BIOS locking checkbox is checked."); } base.TestPage(pageName); } } [TestFixture, Category(TestCategories.UICategoryB)] public class NewVMWizardBiosStringsUserTemplateTest : NewVMWizardBiosStringsTest { public NewVMWizardBiosStringsUserTemplateTest() : base(new[] { "Template", "Name", "Installation Media", "Home Server", "CPU && Memory", "Storage", "Networking", "Finish" }) { Assert.AreEqual(1, DbProxy.proxys.Count); DbProxy.proxys[ConnectionsManager.XenConnectionsCopy[0]].Invoking += DbProxy_Invoking; } protected override NewVMWizard NewWizard() { VM template = GetAnyUserTemplate(); Assert.NotNull(template, "User template not found not found."); List hosts = new List(template.Connection.Cache.Hosts); Assert.IsTrue(hosts.Count > 0); hosts.Sort(); return new NewVMWizard(template.Connection, template, hosts[0]); } protected override void TestPage(string pageName) { if (pageName == "Template") { var gridView = TestUtils.GetDataGridView(wizard, "page_1_Template.TemplatesGridView"); var checkBox = TestUtils.GetCheckBox(wizard, "page_1_Template.checkBoxCopyBiosStrings"); // select the non-bios locked user template MWWaitFor(() => gridView.SelectedRows.Count == 1, "First item (user template) wasn't selected by default."); int row1 = gridView.SelectedRows[0].Index; MWWaitFor(() => !checkBox.Checked, "Checkbox was checked for non-BIOS locked user-template."); MW(() => Assert.IsFalse(checkBox.Enabled, "Checkbox should be disabled when user-template selected.")); // select a Windows template VM defaultTemplate = GetAnyDefaultTemplate(v => v.IsHVM); int row2 = FindRow(gridView, defaultTemplate); MW(() => gridView.Rows[row2].Selected = true); MWWaitFor(() => !checkBox.Checked, "Checkbox was checked for default-template."); MW(() => Assert.IsTrue(checkBox.Enabled, "Checkbox should be enabled when default-template selected.")); // check the checkbox and move to the previous selection MW(() => { checkBox.Checked = true; gridView.Rows[row1].Selected = true; }); MWWaitFor(() => !checkBox.Checked, "Checkbox should not remain checked when moving from default-template to non-BIOS locked user-template."); MW(() => Assert.IsFalse(checkBox.Enabled, "Checkbox should be disabled when user-template selected.")); } else if (pageName == "Name") { Assert.IsFalse(TestUtils.GetXenTabPage(wizard, "page_4_HomeServer").DisableStep, "Home Server page should be enabled for non-BIOS locked user-template."); } base.TestPage(pageName); } } [TestFixture, Category(TestCategories.UICategoryB)] public class NewVMWizardBiosStringsWindowsTemplateTest : NewVMWizardBiosStringsTest { public NewVMWizardBiosStringsWindowsTemplateTest() : base(new[] { "Template", "BIOS Strings", "Name", "Installation Media", "CPU && Memory", "Storage", "Networking", "Finish" }) { Assert.AreEqual(1, DbProxy.proxys.Count); DbProxy.proxys[ConnectionsManager.XenConnectionsCopy[0]].Invoking += DbProxy_Invoking; } protected override NewVMWizard NewWizard() { VM defTemplate = GetAnyDefaultTemplate(v => v.IsHVM); Assert.NotNull(defTemplate, "Default template not found."); List hosts = new List(defTemplate.Connection.Cache.Hosts); Assert.IsTrue(hosts.Count > 0); hosts.Sort(); return new NewVMWizard(defTemplate.Connection, defTemplate, hosts[0]); } protected override void TestPage(string pageName) { if (pageName == "Template") { var gridView = TestUtils.GetDataGridView(wizard, "page_1_Template.TemplatesGridView"); var checkBox = TestUtils.GetCheckBox(wizard, "page_1_Template.checkBoxCopyBiosStrings"); //select the windows template MWWaitFor(() => gridView.SelectedRows.Count == 1, "First item (windows template) wasn't selected by default."); MWWaitFor(() => !checkBox.Checked, "Checkbox was checked for default-template."); MW(() => Assert.IsTrue(checkBox.Enabled, "Checkbox should be enabled when default-template selected.")); // select another default template VM otherDefTemplate = GetAnyDefaultTemplate(v => v.IsHVM && v != ((Page_Template.TemplatesGridViewItem)gridView.SelectedRows[0]).Template); int row2 = FindRow(gridView, otherDefTemplate); // check the checkbox and move to another default template MW(() => { checkBox.Checked = true; gridView.Rows[row2].Selected = true; }); MWWaitFor(() => checkBox.Checked, "Checkbox should remain checked when moving from default-template to default-template"); MW(() => Assert.IsTrue(checkBox.Enabled, "Checkbox should be enabled for default-template")); } else if (pageName == "BIOS Strings") { MWWaitFor(() => TestUtils.GetDataGridView(wizard, "page_1b_BiosLocking.ServersGridView").Rows[0].Selected, "First row wasn't selected."); } else if (pageName == "Name") { Assert.IsTrue(TestUtils.GetXenTabPage(wizard, "page_4_HomeServer").DisableStep, "Home Server page should be disabled when BIOS locking checkbox is checked."); } base.TestPage(pageName); } protected override void RunAfter() { MWWaitFor(() => wizard.Action.IsCompleted && wizard.Action.Succeeded, "Wizard didn't succeed."); Assert.IsTrue(_copyBiosStringsInvoked, "VM.copy_bios_strings wasn't called."); DbProxy.proxys[ConnectionsManager.XenConnectionsCopy[0]].Invoking -= DbProxy_Invoking; } } }