| 
									
										
										
										
											2016-03-29 14:16:01 +01:00
										 |  |  | { system, minimal ? false, config ? {} }: | 
					
						
							| 
									
										
										
										
											2010-01-05 11:18:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-29 14:16:01 +01:00
										 |  |  | with import ./build-vms.nix { inherit system minimal config; }; | 
					
						
							| 
									
										
										
										
											2010-01-05 11:18:43 +00:00
										 |  |  | with pkgs; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | rec { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-09 10:14:45 +00:00
										 |  |  |   inherit pkgs; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-05 11:18:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-16 15:54:15 +00:00
										 |  |  |   testDriver = stdenv.mkDerivation { | 
					
						
							|  |  |  |     name = "nixos-test-driver"; | 
					
						
							| 
									
										
										
										
											2011-01-05 14:04:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     buildInputs = [ makeWrapper perl ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     unpackPhase = "true"; | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-26 15:04:27 +02:00
										 |  |  |     preferLocalBuild = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-05 14:04:38 +00:00
										 |  |  |     installPhase = | 
					
						
							| 
									
										
										
										
											2010-12-16 15:54:15 +00:00
										 |  |  |       ''
 | 
					
						
							|  |  |  |         mkdir -p $out/bin | 
					
						
							|  |  |  |         cp ${./test-driver/test-driver.pl} $out/bin/nixos-test-driver | 
					
						
							|  |  |  |         chmod u+x $out/bin/nixos-test-driver | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-16 15:54:15 +00:00
										 |  |  |         libDir=$out/lib/perl5/site_perl | 
					
						
							|  |  |  |         mkdir -p $libDir | 
					
						
							|  |  |  |         cp ${./test-driver/Machine.pm} $libDir/Machine.pm | 
					
						
							| 
									
										
										
										
											2011-01-06 17:28:35 +00:00
										 |  |  |         cp ${./test-driver/Logger.pm} $libDir/Logger.pm | 
					
						
							| 
									
										
										
										
											2010-12-16 15:54:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-05 14:04:38 +00:00
										 |  |  |         wrapProgram $out/bin/nixos-test-driver \ | 
					
						
							| 
									
										
										
										
											2015-05-22 07:14:00 +02:00
										 |  |  |           --prefix PATH : "${qemu_kvm}/bin:${vde2}/bin:${netpbm}/bin:${coreutils}/bin" \ | 
					
						
							| 
									
										
										
										
											2015-08-11 11:52:13 +02:00
										 |  |  |           --prefix PERL5LIB : "${with perlPackages; lib.makePerlPath [ TermReadLineGnu XMLWriter IOTty FileSlurp ]}:$out/lib/perl5/site_perl" | 
					
						
							| 
									
										
										
										
											2010-12-16 15:54:15 +00:00
										 |  |  |       '';
 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-05 11:18:43 +00:00
										 |  |  |   # Run an automated test suite in the given virtual network. | 
					
						
							| 
									
										
										
										
											2011-01-12 18:47:23 +00:00
										 |  |  |   # `driver' is the script that runs the network. | 
					
						
							|  |  |  |   runTests = driver: | 
					
						
							| 
									
										
										
										
											2010-01-05 11:18:43 +00:00
										 |  |  |     stdenv.mkDerivation { | 
					
						
							| 
									
										
										
										
											2014-06-25 12:45:52 +02:00
										 |  |  |       name = "vm-test-run-${driver.testName}"; | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-02 11:17:50 +02:00
										 |  |  |       requiredSystemFeatures = [ "kvm" "nixos-test" ]; | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-24 23:48:31 +02:00
										 |  |  |       buildInputs = [ libxslt ]; | 
					
						
							| 
									
										
										
										
											2010-08-29 23:24:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-05 11:18:43 +00:00
										 |  |  |       buildCommand = | 
					
						
							|  |  |  |         ''
 | 
					
						
							| 
									
										
										
										
											2011-01-09 22:21:22 +00:00
										 |  |  |           mkdir -p $out/nix-support | 
					
						
							| 
									
										
										
										
											2010-12-16 15:54:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-10 11:17:29 +02:00
										 |  |  |           LOGFILE=$out/log.xml tests='eval $ENV{testScript}; die $@ if $@;' ${driver}/bin/nixos-test-driver | 
					
						
							| 
									
										
										
										
											2010-01-05 11:18:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  |           # Generate a pretty-printed log. | 
					
						
							| 
									
										
										
										
											2011-01-09 17:58:52 +00:00
										 |  |  |           xsltproc --output $out/log.html ${./test-driver/log2html.xsl} $out/log.xml | 
					
						
							|  |  |  |           ln -s ${./test-driver/logfile.css} $out/logfile.css | 
					
						
							|  |  |  |           ln -s ${./test-driver/treebits.js} $out/treebits.js | 
					
						
							| 
									
										
										
										
											2014-09-07 15:37:16 +02:00
										 |  |  |           ln -s ${jquery}/js/jquery.min.js $out/ | 
					
						
							|  |  |  |           ln -s ${jquery-ui}/js/jquery-ui.min.js $out/ | 
					
						
							| 
									
										
										
										
											2011-01-09 17:58:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-07 16:50:26 +00:00
										 |  |  |           touch $out/nix-support/hydra-build-products | 
					
						
							| 
									
										
										
										
											2011-01-09 18:46:02 +00:00
										 |  |  |           echo "report testlog $out log.html" >> $out/nix-support/hydra-build-products | 
					
						
							| 
									
										
										
										
											2011-01-09 18:56:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-09 14:07:44 +00:00
										 |  |  |           for i in */xchg/coverage-data; do | 
					
						
							| 
									
										
										
										
											2011-01-09 22:21:22 +00:00
										 |  |  |             mkdir -p $out/coverage-data | 
					
						
							| 
									
										
										
										
											2011-08-09 14:07:44 +00:00
										 |  |  |             mv $i $out/coverage-data/$(dirname $(dirname $i)) | 
					
						
							| 
									
										
										
										
											2011-01-09 18:56:11 +00:00
										 |  |  |           done | 
					
						
							| 
									
										
										
										
											2010-01-05 11:18:43 +00:00
										 |  |  |         ''; # */
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |   makeTest = | 
					
						
							| 
									
										
										
										
											2015-05-22 07:14:00 +02:00
										 |  |  |     { testScript | 
					
						
							|  |  |  |     , makeCoverageReport ? false | 
					
						
							|  |  |  |     , enableOCR ? false | 
					
						
							|  |  |  |     , name ? "unnamed" | 
					
						
							|  |  |  |     , ... | 
					
						
							|  |  |  |     } @ t: | 
					
						
							| 
									
										
										
										
											2010-02-17 09:37:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |     let | 
					
						
							| 
									
										
										
										
											2014-06-25 12:45:52 +02:00
										 |  |  |       testDriverName = "nixos-test-driver-${name}"; | 
					
						
							| 
									
										
										
										
											2014-03-03 13:39:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |       nodes = buildVirtualNetwork ( | 
					
						
							|  |  |  |         t.nodes or (if t ? machine then { machine = t.machine; } else { })); | 
					
						
							| 
									
										
										
										
											2011-01-16 14:21:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |       testScript' = | 
					
						
							|  |  |  |         # Call the test script with the computed nodes. | 
					
						
							|  |  |  |         if builtins.isFunction testScript | 
					
						
							|  |  |  |         then testScript { inherit nodes; } | 
					
						
							|  |  |  |         else testScript; | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |       vlans = map (m: m.config.virtualisation.vlans) (lib.attrValues nodes); | 
					
						
							| 
									
										
										
										
											2011-01-16 14:21:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |       vms = map (m: m.config.system.build.vm) (lib.attrValues nodes); | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-22 08:01:17 +02:00
										 |  |  |       ocrProg = tesseract.override { enableLanguages = [ "eng" ]; }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |       # Generate onvenience wrappers for running the test driver | 
					
						
							|  |  |  |       # interactively with the specified network, and for starting the | 
					
						
							|  |  |  |       # VMs from the command line. | 
					
						
							| 
									
										
										
										
											2014-06-25 12:45:52 +02:00
										 |  |  |       driver = runCommand testDriverName | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |         { buildInputs = [ makeWrapper]; | 
					
						
							|  |  |  |           testScript = testScript'; | 
					
						
							|  |  |  |           preferLocalBuild = true; | 
					
						
							| 
									
										
										
										
											2014-06-25 12:45:52 +02:00
										 |  |  |           testName = name; | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |         ''
 | 
					
						
							|  |  |  |           mkdir -p $out/bin | 
					
						
							|  |  |  |           echo "$testScript" > $out/test-script | 
					
						
							|  |  |  |           ln -s ${testDriver}/bin/nixos-test-driver $out/bin/ | 
					
						
							|  |  |  |           vms="$(for i in ${toString vms}; do echo $i/bin/run-*-vm; done)" | 
					
						
							|  |  |  |           wrapProgram $out/bin/nixos-test-driver \ | 
					
						
							|  |  |  |             --add-flags "$vms" \ | 
					
						
							| 
									
										
										
										
											2015-05-22 08:01:17 +02:00
										 |  |  |             ${lib.optionalString enableOCR "--prefix PATH : '${ocrProg}/bin'"} \ | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |             --run "testScript=\"\$(cat $out/test-script)\"" \ | 
					
						
							| 
									
										
										
										
											2016-06-19 13:38:46 +02:00
										 |  |  |             --set testScript '$testScript' \ | 
					
						
							|  |  |  |             --set VLANS '${toString vlans}' | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |           ln -s ${testDriver}/bin/nixos-test-driver $out/bin/nixos-run-vms | 
					
						
							|  |  |  |           wrapProgram $out/bin/nixos-run-vms \ | 
					
						
							|  |  |  |             --add-flags "$vms" \ | 
					
						
							| 
									
										
										
										
											2015-05-22 08:01:17 +02:00
										 |  |  |             ${lib.optionalString enableOCR "--prefix PATH : '${ocrProg}/bin'"} \ | 
					
						
							| 
									
										
										
										
											2016-06-19 13:38:46 +02:00
										 |  |  |             --set tests 'startAll; joinAll;' \ | 
					
						
							|  |  |  |             --set VLANS '${toString vlans}' \ | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |             ${lib.optionalString (builtins.length vms == 1) "--set USE_SERIAL 1"} | 
					
						
							|  |  |  |         ''; # "
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |       passMeta = drv: drv // lib.optionalAttrs (t ? meta) { | 
					
						
							|  |  |  |         meta = (drv.meta or {}) // t.meta; | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |       test = passMeta (runTests driver); | 
					
						
							|  |  |  |       report = passMeta (releaseTools.gcovReport { coverageRuns = [ test ]; }); | 
					
						
							| 
									
										
										
										
											2010-03-10 22:51:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-12 12:09:40 +02:00
										 |  |  |     in (if makeCoverageReport then report else test) // {  | 
					
						
							|  |  |  |       inherit nodes driver test;  | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-21 14:31:05 +00:00
										 |  |  |   runInMachine = | 
					
						
							|  |  |  |     { drv | 
					
						
							|  |  |  |     , machine | 
					
						
							|  |  |  |     , preBuild ? "" | 
					
						
							|  |  |  |     , postBuild ? "" | 
					
						
							| 
									
										
										
										
											2011-01-13 10:54:07 +00:00
										 |  |  |     , ... # ??? | 
					
						
							| 
									
										
										
										
											2010-05-21 14:31:05 +00:00
										 |  |  |     }: | 
					
						
							| 
									
										
										
										
											2010-03-11 13:11:06 +00:00
										 |  |  |     let | 
					
						
							| 
									
										
										
										
											2011-01-13 10:54:07 +00:00
										 |  |  |       vm = buildVM { } | 
					
						
							| 
									
										
										
										
											2011-01-13 11:39:03 +00:00
										 |  |  |         [ machine | 
					
						
							| 
									
										
										
										
											2013-10-16 11:36:09 +02:00
										 |  |  |           { key = "run-in-machine"; | 
					
						
							|  |  |  |             networking.hostName = "client"; | 
					
						
							|  |  |  |             nix.readOnlyStore = false; | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2011-01-13 10:54:07 +00:00
										 |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2010-03-11 13:11:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       buildrunner = writeText "vm-build" ''
 | 
					
						
							|  |  |  |         source $1 | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-11 13:11:06 +00:00
										 |  |  |         ${coreutils}/bin/mkdir -p $TMPDIR | 
					
						
							| 
									
										
										
										
											2010-07-23 13:59:50 +00:00
										 |  |  |         cd $TMPDIR | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-23 13:59:50 +00:00
										 |  |  |         $origBuilder $origArgs | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-11 07:40:16 +00:00
										 |  |  |         exit $? | 
					
						
							| 
									
										
										
										
											2010-03-11 13:11:06 +00:00
										 |  |  |       '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |       testScript = ''
 | 
					
						
							| 
									
										
										
										
											2010-03-11 13:11:06 +00:00
										 |  |  |         startAll; | 
					
						
							| 
									
										
										
										
											2013-10-16 11:36:09 +02:00
										 |  |  |         $client->waitForUnit("multi-user.target"); | 
					
						
							| 
									
										
										
										
											2010-03-11 13:11:06 +00:00
										 |  |  |         ${preBuild} | 
					
						
							| 
									
										
										
										
											2014-09-24 23:48:31 +02:00
										 |  |  |         $client->succeed("env -i ${bash}/bin/bash ${buildrunner} /tmp/xchg/saved-env >&2"); | 
					
						
							| 
									
										
										
										
											2010-03-11 13:11:06 +00:00
										 |  |  |         ${postBuild} | 
					
						
							| 
									
										
										
										
											2013-10-16 11:36:09 +02:00
										 |  |  |         $client->succeed("sync"); # flush all data before pulling the plug | 
					
						
							| 
									
										
										
										
											2010-03-11 13:11:06 +00:00
										 |  |  |       '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       vmRunCommand = writeText "vm-run" ''
 | 
					
						
							| 
									
										
										
										
											2011-08-09 14:07:44 +00:00
										 |  |  |         ${coreutils}/bin/mkdir $out | 
					
						
							|  |  |  |         ${coreutils}/bin/mkdir -p vm-state-client/xchg | 
					
						
							|  |  |  |         export > vm-state-client/xchg/saved-env | 
					
						
							| 
									
										
										
										
											2014-04-14 14:23:38 +02:00
										 |  |  |         export tests='${testScript}' | 
					
						
							| 
									
										
										
										
											2011-01-13 10:54:07 +00:00
										 |  |  |         ${testDriver}/bin/nixos-test-driver ${vm.config.system.build.vm}/bin/run-*-vm | 
					
						
							| 
									
										
										
										
											2010-08-29 23:24:54 +00:00
										 |  |  |       ''; # */
 | 
					
						
							| 
									
										
										
										
											2010-03-11 13:11:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     in | 
					
						
							|  |  |  |       lib.overrideDerivation drv (attrs: { | 
					
						
							| 
									
										
										
										
											2010-08-29 23:24:54 +00:00
										 |  |  |         requiredSystemFeatures = [ "kvm" ]; | 
					
						
							| 
									
										
										
										
											2010-03-11 13:11:06 +00:00
										 |  |  |         builder = "${bash}/bin/sh"; | 
					
						
							|  |  |  |         args = ["-e" vmRunCommand]; | 
					
						
							|  |  |  |         origArgs = attrs.args; | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  |         origBuilder = attrs.builder; | 
					
						
							| 
									
										
										
										
											2010-03-11 13:11:06 +00:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2010-03-11 15:09:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-13 10:54:07 +00:00
										 |  |  |   runInMachineWithX = { require ? [], ... } @ args: | 
					
						
							| 
									
										
										
										
											2010-03-11 15:09:10 +00:00
										 |  |  |     let | 
					
						
							|  |  |  |       client = | 
					
						
							|  |  |  |         { config, pkgs, ... }: | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2010-04-29 12:45:22 +00:00
										 |  |  |           inherit require; | 
					
						
							| 
									
										
										
										
											2010-03-11 15:09:10 +00:00
										 |  |  |           virtualisation.memorySize = 1024; | 
					
						
							|  |  |  |           services.xserver.enable = true; | 
					
						
							|  |  |  |           services.xserver.displayManager.slim.enable = false; | 
					
						
							|  |  |  |           services.xserver.displayManager.auto.enable = true; | 
					
						
							|  |  |  |           services.xserver.windowManager.default = "icewm"; | 
					
						
							|  |  |  |           services.xserver.windowManager.icewm.enable = true; | 
					
						
							|  |  |  |           services.xserver.desktopManager.default = "none"; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |     in | 
					
						
							|  |  |  |       runInMachine ({ | 
					
						
							| 
									
										
										
										
											2011-01-13 10:54:07 +00:00
										 |  |  |         machine = client; | 
					
						
							|  |  |  |         preBuild = | 
					
						
							|  |  |  |           ''
 | 
					
						
							|  |  |  |             $client->waitForX; | 
					
						
							|  |  |  |           '';
 | 
					
						
							|  |  |  |       } // args); | 
					
						
							| 
									
										
										
										
											2010-03-11 15:09:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-14 18:20:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-24 15:46:10 +02:00
										 |  |  |   simpleTest = as: (makeTest as).test; | 
					
						
							| 
									
										
										
										
											2010-03-10 22:51:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-05 11:18:43 +00:00
										 |  |  | } |