cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# -*- coding: utf-8 -*-
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox Validation Kit - Additions Basics #1.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncCopyright (C) 2010-2014 Oracle Corporation
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncThis file is part of VirtualBox Open Source Edition (OSE), as
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncavailable from http://www.virtualbox.org. This file is free software;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncyou can redistribute it and/or modify it under the terms of the GNU
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGeneral Public License (GPL) as published by the Free Software
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncFoundation, in version 2 as it comes in the "COPYING" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox OSE distribution. VirtualBox OSE is distributed in the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsynchope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncThe contents of this file may alternatively be used under the terms
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncof the Common Development and Distribution License Version 1.0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync(CDDL) only, as it comes in the "COPYING.CDDL" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox OSE distribution, in which case the provisions of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncCDDL are applicable instead of those of the GPL.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncYou may elect to license modified versions of this file under the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncterms and conditions of either the GPL or the CDDL or both.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Standard Python imports.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Only the main script needs to modify the path.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncg_ksValidationKitDir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Validation Kit imports.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Sub test driver imports.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncsys.path.append(os.path.dirname(os.path.abspath(__file__))); # For sub-test drivers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncclass tdAddBasic1(vbox.TestDriver): # pylint: disable=R0902
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Additions Basics #1.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # - More of the settings stuff can e and need to be generalized!
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.oTestVmSet = self.oTestVmManager.getStandardVmSet('nat');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.asTestsDef = ['guestprops', 'stdguestprops', 'guestcontrol'];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.addSubTestDriver(SubTstDrvAddGuestCtrl(self));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Overridden methods.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log(' Default: %s (all)' % (':'.join(self.asTestsDef)));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log(' Same as --virt-modes hwvirt --cpu-counts 1.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def parseOption(self, asArgs, iArg): # pylint: disable=R0912,R0915
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if iArg >= len(asArgs): raise base.InvalidOption('The "--tests" takes a colon separated list of tests');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync raise base.InvalidOption('The "--tests" value "%s" is not valid; valid values are: %s' \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return vbox.TestDriver.parseOption(self, asArgs, iArg);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not self.importVBoxApi(): # So we can use the constant below.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync eNic0AttachType = vboxcon.NetworkAttachmentType_NAT;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.oTestVmSet.actionConfig(self, eNic0AttachType = eNic0AttachType, sDvdImage = sGaIso);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self.oTestVmSet.actionExecute(self, self.testOneCfg);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Test execution helpers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Runs the specified VM thru the tests.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns a success indicator on the general test execution. This is not
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync the actual test result.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oSession, oTxsSession = self.startVmAndConnectToTxsViaTcp(oTestVm.sVmName, fCdWait = True, \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if oSession is not None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Do the testing.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, oTxsSession = self.testInstallAdditions(oSession, oTxsSession, oTestVm);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self.testGuestProperties(oSession, oTxsSession, oTestVm) and fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (fRc2, oTxsSession) = self.aoSubTstDrvs[0].testIt(oTestVm, oSession, oTxsSession);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## @todo Save an restore test.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## @todo Reset tests.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## @todo Final test: Uninstallation.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #self.terminateVmBySession(oSession)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def testInstallAdditions(self, oSession, oTxsSession, oTestVm):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Tests installing the guest additions
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self.testWindowsInstallAdditions(oSession, oTxsSession, oTestVm);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('Guest Additions installation not implemented for %s yet! (%s)' % \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Verify installation of Guest Additions using commmon bits.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Wait for the GAs to come up.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## @todo need to signed up for a OnAdditionsStateChanged and wait runlevel to
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # at least reach Userland.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Check if the additions are operational.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Check the additionsVersion attribute. It must not be empty.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.testIGuest_additionsRunLevel(oGuest, oTestVm);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## @todo test IAdditionsFacilities.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def testWindowsInstallAdditions(self, oSession, oTxsSession, oTestVm):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Installs the Windows guest additions using the test execution service.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Since this involves rebooting the guest, we will have to create a new TXS session.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Delete relevant log files.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asLogFile = [sWinDir+'setupapi.log', sWinDir+'setupact.log', sWinDir+'setuperr.log'];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Install the public signing key.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if oTestVm.sKind not in ('WindowsNT4', 'Windows2000', 'WindowsXP', 'Windows2003'):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # The actual install.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Enable installing the optional auto-logon modules (VBoxGINA/VBoxCredProv) + (Direct)3D support.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Also tell the installer to produce the appropriate log files.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self.txsRunTest(oTxsSession, 'VBoxWindowsAdditions.exe', 5 * 60 * 1000, \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '${CDROM}/VBoxWindowsAdditions.exe', ('${CDROM}/VBoxWindowsAdditions.exe', '/S', '/l', '/with_autologon'));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # For testing the installation (D)3D stuff ('/with_d3d') we need to boot up in safe mode.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Reboot the VM and reconnect the TXS session.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (fRc, oTxsSession) = self.txsRebootAndReconnectViaTcp(oSession, oTxsSession, cMsTimeout = 3 * 60000);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Add the Windows Guest Additions installer files to the files we want to download
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # from the guest.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sGuestAddsDir = 'C:/Program Files/Oracle/VirtualBox Guest Additions/';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Note: There won't be a install_ui.log because of the silent installation.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asLogFile.append(sGuestAddsDir + 'install_drivers.log');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Download log files.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Ignore errors as all files above might not be present (or in different locations)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # on different Windows guests.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.txsDownloadFiles(oSession, oTxsSession, asLogFile, fIgnoreErrors = True);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns False if no version string could be obtained, otherwise True
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync even though errors are logged.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.errorXcpt('Getting the additions version failed.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('IGuest::additionsVersion="%s"' % (sVer,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('IGuest::additionsVersion is empty.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('IGuest::additionsVersion is contains spaces: "%s".' % (sVer,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('IGuest::additionsVersion does not contain at least tree dot separated fields: "%s" (%d).'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## @todo verify the format.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def testIGuest_additionsRunLevel(self, oGuest, oTestVm):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Do run level tests.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync eExpectedRunLevel = vboxcon.AdditionsRunLevelType_Desktop;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync eExpectedRunLevel = vboxcon.AdditionsRunLevelType_Userland;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## @todo Insert wait for the desired run level.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.errorXcpt('Getting the additions run level failed.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('IGuest::additionsRunLevel=%s' % (iLevel,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('Expected runlevel %d, found %d instead' % (eExpectedRunLevel, iLevel));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def testGuestProperties(self, oSession, oTxsSession, oTestVm):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Test guest properties.