VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/tests/additions/tdAddSharedFolders1.py@ 84226

Last change on this file since 84226 was 84093, checked in by vboxsync, 5 years ago

Validation Kit/tdAddSharedFolders1.py: Unmount testing bugfixes.

  • Property svn:eol-style set to LF
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 12.9 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4"""
5VirtualBox Validation Kit - Shared Folders #1.
6"""
7
8__copyright__ = \
9"""
10Copyright (C) 2010-2020 Oracle Corporation
11
12This file is part of VirtualBox Open Source Edition (OSE), as
13available from http://www.virtualbox.org. This file is free software;
14you can redistribute it and/or modify it under the terms of the GNU
15General Public License (GPL) as published by the Free Software
16Foundation, in version 2 as it comes in the "COPYING" file of the
17VirtualBox OSE distribution. VirtualBox OSE is distributed in the
18hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
19
20The contents of this file may alternatively be used under the terms
21of the Common Development and Distribution License Version 1.0
22(CDDL) only, as it comes in the "COPYING.CDDL" file of the
23VirtualBox OSE distribution, in which case the provisions of the
24CDDL are applicable instead of those of the GPL.
25
26You may elect to license modified versions of this file under the
27terms and conditions of either the GPL or the CDDL or both.
28"""
29__version__ = "$Revision: 84093 $"
30
31# Standard Python imports.
32import os
33import shutil
34import sys
35
36# Only the main script needs to modify the path.
37try: __file__
38except: __file__ = sys.argv[0];
39g_ksValidationKitDir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))));
40sys.path.append(g_ksValidationKitDir);
41
42# Validation Kit imports.
43from testdriver import reporter;
44from testdriver import base;
45from common import utils;
46
47
48class SubTstDrvAddSharedFolders1(base.SubTestDriverBase):
49 """
50 Sub-test driver for executing shared folders tests.
51 """
52
53 def __init__(self, oTstDrv):
54 base.SubTestDriverBase.__init__(self, oTstDrv, 'add-shared-folders', 'Shared Folders');
55
56 self.asTestsDef = [ 'fsperf', ];
57 self.asTests = self.asTestsDef;
58 self.asExtraArgs = [];
59 self.asGstFsPerfPaths = [
60 '${CDROM}/vboxvalidationkit/${OS/ARCH}/FsPerf${EXESUFF}',
61 '${CDROM}/${OS/ARCH}/FsPerf${EXESUFF}',
62 '${TXSDIR}/${OS/ARCH}/FsPerf${EXESUFF}',
63 '${TXSDIR}/FsPerf${EXESUFF}',
64 'E:/vboxvalidationkit/${OS/ARCH}/FsPerf${EXESUFF}',
65 ];
66 self.sGuestSlash = '';
67
68 def parseOption(self, asArgs, iArg):
69 if asArgs[iArg] == '--add-shared-folders-tests': # 'add' as in 'additions', not the verb.
70 iArg += 1;
71 iNext = self.oTstDrv.requireMoreArgs(1, asArgs, iArg);
72 if asArgs[iArg] == 'all':
73 self.asTests = self.asTestsDef;
74 else:
75 self.asTests = asArgs[iArg].split(':');
76 for s in self.asTests:
77 if s not in self.asTestsDef:
78 raise base.InvalidOption('The "--add-shared-folders-tests" value "%s" is not valid; valid values are: %s'
79 % (s, ' '.join(self.asTestsDef)));
80 return iNext;
81 if asArgs[iArg] == '--add-shared-folders-extra-arg':
82 iArg += 1;
83 iNext = self.oTstDrv.requireMoreArgs(1, asArgs, iArg);
84 self.asExtraArgs.append(asArgs[iArg]);
85 return iNext;
86 return iArg;
87
88 def showUsage(self):
89 base.SubTestDriverBase.showUsage(self);
90 reporter.log(' --add-shared-folders-tests <t1[:t2[:]]>');
91 reporter.log(' Default: all (%s)' % (':'.join(self.asTestsDef)));
92 reporter.log(' --add-shared-folders-extra-arg <fsperf-arg>');
93 reporter.log(' Adds an extra FsPerf argument. Can be repeated.');
94
95 return True;
96
97 def mountShareEx(self, oSession, oTxsSession, sShareName, sHostPath, sGuestMountPoint, fMustSucceed):
98 """
99 Automount a shared folder in the guest, extended version.
100
101 Returns success status, based on fMustSucceed.
102 """
103 reporter.testStart('Automounting "%s"' % (sShareName,));
104
105 reporter.log2('Creating shared folder "%s" at "%s" ...' % (sShareName, sGuestMountPoint));
106 try:
107 oConsole = oSession.o.console;
108 oConsole.createSharedFolder(sShareName, sHostPath, True, True, sGuestMountPoint);
109 except:
110 if fMustSucceed:
111 reporter.errorXcpt('createSharedFolder(%s,%s,True,True,%s)' % (sShareName, sHostPath, sGuestMountPoint));
112 else:
113 reporter.log('createSharedFolder(%s,%s,True,True,%s) failed, good' % (sShareName, sHostPath, sGuestMountPoint));
114 reporter.testDone();
115 return False is fMustSucceed;
116
117 # Check whether we can see the shared folder now. Retry for 30 seconds.
118 msStart = base.timestampMilli();
119 while True:
120 fRc = oTxsSession.syncIsDir(sGuestMountPoint + self.sGuestSlash + 'candle.dir');
121 reporter.log2('candle.dir check -> %s' % (fRc,));
122 if fRc is fMustSucceed:
123 break;
124 if base.timestampMilli() - msStart > 30000:
125 reporter.error('Shared folder mounting timed out!');
126 break;
127 self.oTstDrv.sleep(1);
128
129 reporter.testDone();
130
131 return fRc == fMustSucceed;
132
133 def mountShare(self, oSession, oTxsSession, sShareName, sHostPath, sGuestMountPoint):
134 """
135 Automount a shared folder in the guest.
136
137 Returns success status.
138 """
139 return self.mountShareEx(oSession, oTxsSession, sShareName, sHostPath, sGuestMountPoint, fMustSucceed = True);
140
141 def unmountShareEx(self, oSession, oTxsSession, sShareName, sGuestMountPoint, fMustSucceed):
142 """
143 Unmounts a shared folder in the guest.
144
145 Returns success status, based on fMustSucceed.
146 """
147 reporter.log2('Autounmount');
148 try:
149 oConsole = oSession.o.console;
150 oConsole.removeSharedFolder(sShareName);
151 except:
152 if fMustSucceed:
153 reporter.errorXcpt('removeSharedFolder(%s)' % (sShareName,));
154 else:
155 reporter.log('removeSharedFolder(%s)' % (sShareName,));
156 reporter.testDone();
157 return False is fMustSucceed;
158
159 # Check whether the shared folder is gone on the guest now. Retry for 30 seconds.
160 msStart = base.timestampMilli();
161 while True:
162 fRc = oTxsSession.syncIsDir(sGuestMountPoint + self.sGuestSlash + 'candle.dir');
163 reporter.log2('candle.dir check -> %s' % (fRc,));
164 if fRc is not fMustSucceed:
165 break;
166 if base.timestampMilli() - msStart > 30000:
167 reporter.error('Shared folder unmounting timed out!');
168 fRc = False;
169 break;
170 self.oTstDrv.sleep(1);
171
172 reporter.testDone();
173
174 return fRc is not fMustSucceed;
175
176 def unmountShare(self, oSession, oTxsSession, sShareName, sGuestMountPoint):
177 """
178 Unmounts a shared folder in the guest, extended version.
179
180 Returns success status, based on fMustSucceed.
181 """
182 return self.unmountShareEx(oSession, oTxsSession, sShareName, sGuestMountPoint, fMustSucceed = True);
183
184 def testIt(self, oTestVm, oSession, oTxsSession):
185 """
186 Executes the test.
187
188 Returns fRc, oTxsSession. The latter may have changed.
189 """
190 reporter.log("Active tests: %s" % (self.asTests,));
191
192 #
193 # Skip the test if before 6.0
194 #
195 if self.oTstDrv.fpApiVer < 6.0:
196 reporter.log('Requires 6.0 or later (for now)');
197 return (None, oTxsSession);
198
199 # Guess a free mount point inside the guest.
200 if oTestVm.isWindows() or oTestVm.isOS2():
201 self.sGuestSlash = '\\';
202 else:
203 self.sGuestSlash = '/';
204
205 #
206 # Create the host directory to share. Empty except for a 'candle.dir' subdir
207 # that we use to check that it mounted correctly.
208 #
209 sShareName1 = 'shfl1';
210 sShareHostPath1 = os.path.join(self.oTstDrv.sScratchPath, sShareName1);
211 reporter.log2('Creating shared host folder "%s"...' % (sShareHostPath1,));
212 if os.path.exists(sShareHostPath1):
213 try: shutil.rmtree(sShareHostPath1);
214 except: return (reporter.errorXcpt('shutil.rmtree(%s)' % (sShareHostPath1,)), oTxsSession);
215 try: os.mkdir(sShareHostPath1);
216 except: return (reporter.errorXcpt('os.mkdir(%s)' % (sShareHostPath1,)), oTxsSession);
217 try: os.mkdir(os.path.join(sShareHostPath1, 'candle.dir'));
218 except: return (reporter.errorXcpt('os.mkdir(%s)' % (sShareHostPath1,)), oTxsSession);
219
220 # Guess a free mount point inside the guest.
221 if oTestVm.isWindows() or oTestVm.isOS2():
222 sMountPoint1 = 'V:';
223 else:
224 sMountPoint1 = '/mnt/' + sShareName1;
225
226 fRc = self.mountShare(oSession, oTxsSession, sShareName1, sShareHostPath1, sMountPoint1);
227 if fRc is not True:
228 return (False, oTxsSession); # skip the remainder if we cannot auto mount the folder.
229
230 #
231 # Run FsPerf inside the guest.
232 #
233 fSkip = 'fsperf' not in self.asTests;
234 if fSkip is False:
235 cMbFree = utils.getDiskUsage(sShareHostPath1);
236 if cMbFree >= 16:
237 reporter.log2('Free space: %u MBs' % (cMbFree,));
238 else:
239 reporter.log('Skipping FsPerf because only %u MB free on %s' % (cMbFree, sShareHostPath1,));
240 fSkip = True;
241 if fSkip is False:
242 # Common arguments:
243 asArgs = ['FsPerf', '-d', sMountPoint1 + self.sGuestSlash + 'fstestdir-1', '-s8'];
244
245 # Skip part of mmap on older windows systems without CcCoherencyFlushAndPurgeCache (>= w7).
246 reporter.log2('oTestVm.sGuestOsType=%s' % (oTestVm.sGuestOsType,));
247 if oTestVm.getNonCanonicalGuestOsType() \
248 in [ 'WindowsNT3x', 'WindowsNT4', 'Windows2000', 'WindowsXP', 'WindowsXP_64', 'Windows2003',
249 'Windows2003_64', 'WindowsVista', 'WindowsVista_64', 'Windows2008', 'Windows2008_64']:
250 asArgs.append('--no-mmap-coherency');
251
252 # Configure I/O block sizes according to guest memory size:
253 cbMbRam = 128;
254 try: cbMbRam = oSession.o.machine.memorySize;
255 except: reporter.errorXcpt();
256 reporter.log2('cbMbRam=%s' % (cbMbRam,));
257 asArgs.append('--set-block-size=1');
258 asArgs.append('--add-block-size=512');
259 asArgs.append('--add-block-size=4096');
260 asArgs.append('--add-block-size=16384');
261 asArgs.append('--add-block-size=65536');
262 asArgs.append('--add-block-size=1048576'); # 1 MiB
263 if cbMbRam >= 512:
264 asArgs.append('--add-block-size=33554432'); # 32 MiB
265 if cbMbRam >= 768:
266 asArgs.append('--add-block-size=134217728'); # 128 MiB
267
268 # Putting lots (10000) of files in a single directory causes issues on OS X
269 # (HFS+ presumably, though could be slow disks) and some linuxes (slow disks,
270 # maybe ext2/3?). So, generally reduce the file count to 4096 everywhere
271 # since we're not here to test the host file systems, and 3072 on macs.
272 if utils.getHostOs() in [ 'darwin', ]:
273 asArgs.append('--many-files=3072');
274 elif utils.getHostOs() in [ 'linux', ]:
275 asArgs.append('--many-files=4096');
276
277 # Add the extra arguments from the command line and kick it off:
278 asArgs.extend(self.asExtraArgs);
279
280 # Run FsPerf:
281 reporter.log2('Starting guest FsPerf (%s)...' % (asArgs,));
282 sFsPerfPath = self._locateGstFsPerf(oTxsSession);
283 fRc = self.oTstDrv.txsRunTest(oTxsSession, 'FsPerf', 30 * 60 * 1000, sFsPerfPath, asArgs);
284 reporter.log2('FsPerf -> %s' % (fRc,));
285
286 sTestDir = os.path.join(sShareHostPath1, 'fstestdir-1');
287 if os.path.exists(sTestDir):
288 fRc = reporter.errorXcpt('test directory lingers: %s' % (sTestDir,));
289 try: shutil.rmtree(sTestDir);
290 except: fRc = reporter.errorXcpt('shutil.rmtree(%s)' % (sTestDir,));
291 else:
292 reporter.testStart('FsPerf');
293 reporter.testDone(fSkip or fRc is None);
294
295 #
296 # Check if auto-unmounting works.
297 #
298 if fRc is True:
299 fRc = self.unmountShare(oSession, oTxsSession, sShareName1, sMountPoint1);
300
301 ## @todo Add tests for multiple automount shares, random unmounting, reboot test.
302
303 return (fRc, oTxsSession);
304
305 def _locateGstFsPerf(self, oTxsSession):
306 """
307 Returns guest side path to FsPerf.
308 """
309 for sFsPerfPath in self.asGstFsPerfPaths:
310 if oTxsSession.syncIsFile(sFsPerfPath):
311 return sFsPerfPath;
312 reporter.log('Unable to find guest FsPerf in any of these places: %s' % ('\n '.join(self.asGstFsPerfPaths),));
313 return self.asGstFsPerfPaths[0];
314
315
316
317if __name__ == '__main__':
318 reporter.error('Cannot run standalone, use tdAddBasic1.py');
319 sys.exit(1);
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette