nixos/test-driver: Make tesseract OCR optional.

By default this is now enabled, and it has to be explicitely enabled
using "enableOCR = true". If it is set to false, any usage of
getScreenText or waitForText will fail with an error suggesting to pass
enableOCR.

This should get rid of the rather large dependency on tesseract which
we don't need for most tests.

Note, that I'm using system("type -P") here to check whether tesseract
is in PATH. I know it's a bashism but we already have other bashisms
within the test scripts and we also run it with bash, so IMHO it's not a
problem here.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
This commit is contained in:
aszlig 2015-05-22 07:14:00 +02:00
parent efd4fcbebc
commit 8be00dc71d
No known key found for this signature in database
GPG key ID: D0EBD0EC8C2DC961
4 changed files with 21 additions and 5 deletions

View file

@ -158,7 +158,9 @@ startAll;
<term><methodname>getScreenText</methodname></term> <term><methodname>getScreenText</methodname></term>
<listitem><para>Return a textual representation of what is currently <listitem><para>Return a textual representation of what is currently
visible on the machine's screen using optical character visible on the machine's screen using optical character
recognition.</para></listitem> recognition.</para>
<note><para>This requires passing <option>enableOCR</option> to the test
attribute set.</para></note></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
@ -248,7 +250,9 @@ startAll;
<term><methodname>waitForText</methodname></term> <term><methodname>waitForText</methodname></term>
<listitem><para>Wait until the supplied regular expressions matches <listitem><para>Wait until the supplied regular expressions matches
the textual contents of the screen by using optical character recognition the textual contents of the screen by using optical character recognition
(see <methodname>getScreenText</methodname>).</para></listitem> (see <methodname>getScreenText</methodname>).</para>
<note><para>This requires passing <option>enableOCR</option> to the test
attribute set.</para></note></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>

View file

@ -499,6 +499,9 @@ sub screenshot {
sub getScreenText { sub getScreenText {
my ($self) = @_; my ($self) = @_;
system("type -P tesseract &> /dev/null") == 0
or die "getScreenText used but enableOCR is false";
my $text; my $text;
$self->nest("performing optical character recognition", sub { $self->nest("performing optical character recognition", sub {
my $tmpbase = Cwd::abs_path(".")."/ocr"; my $tmpbase = Cwd::abs_path(".")."/ocr";

View file

@ -27,7 +27,7 @@ rec {
cp ${./test-driver/Logger.pm} $libDir/Logger.pm cp ${./test-driver/Logger.pm} $libDir/Logger.pm
wrapProgram $out/bin/nixos-test-driver \ wrapProgram $out/bin/nixos-test-driver \
--prefix PATH : "${qemu_kvm}/bin:${vde2}/bin:${netpbm}/bin:${coreutils}/bin:${tesseract}/bin" \ --prefix PATH : "${qemu_kvm}/bin:${vde2}/bin:${netpbm}/bin:${coreutils}/bin" \
--prefix PERL5LIB : "${with perlPackages; lib.makePerlPath [ TermReadLineGnu XMLWriter IOTty FileSlurp ]}:$out/lib/perl5/site_perl" --prefix PERL5LIB : "${with perlPackages; lib.makePerlPath [ TermReadLineGnu XMLWriter IOTty FileSlurp ]}:$out/lib/perl5/site_perl"
''; '';
}; };
@ -68,7 +68,12 @@ rec {
makeTest = makeTest =
{ testScript, makeCoverageReport ? false, name ? "unnamed", ... } @ t: { testScript
, makeCoverageReport ? false
, enableOCR ? false
, name ? "unnamed"
, ...
} @ t:
let let
testDriverName = "nixos-test-driver-${name}"; testDriverName = "nixos-test-driver-${name}";
@ -102,12 +107,14 @@ rec {
vms="$(for i in ${toString vms}; do echo $i/bin/run-*-vm; done)" vms="$(for i in ${toString vms}; do echo $i/bin/run-*-vm; done)"
wrapProgram $out/bin/nixos-test-driver \ wrapProgram $out/bin/nixos-test-driver \
--add-flags "$vms" \ --add-flags "$vms" \
${lib.optionalString enableOCR "--prefix PATH : '${tesseract}/bin'"} \
--run "testScript=\"\$(cat $out/test-script)\"" \ --run "testScript=\"\$(cat $out/test-script)\"" \
--set testScript '"$testScript"' \ --set testScript '"$testScript"' \
--set VLANS '"${toString vlans}"' --set VLANS '"${toString vlans}"'
ln -s ${testDriver}/bin/nixos-test-driver $out/bin/nixos-run-vms ln -s ${testDriver}/bin/nixos-test-driver $out/bin/nixos-run-vms
wrapProgram $out/bin/nixos-run-vms \ wrapProgram $out/bin/nixos-run-vms \
--add-flags "$vms" \ --add-flags "$vms" \
${lib.optionalString enableOCR "--prefix PATH : '${tesseract}/bin'"} \
--set tests '"startAll; joinAll;"' \ --set tests '"startAll; joinAll;"' \
--set VLANS '"${toString vlans}"' \ --set VLANS '"${toString vlans}"' \
${lib.optionalString (builtins.length vms == 1) "--set USE_SERIAL 1"} ${lib.optionalString (builtins.length vms == 1) "--set USE_SERIAL 1"}

View file

@ -252,12 +252,13 @@ let
makeInstallerTest = name: makeInstallerTest = name:
{ createPartitions, preBootCommands ? "", extraConfig ? "" { createPartitions, preBootCommands ? "", extraConfig ? ""
, testChannel ? false, grubVersion ? 2, grubDevice ? "/dev/vda" , testChannel ? false, grubVersion ? 2, grubDevice ? "/dev/vda"
, grubIdentifier ? "uuid" , grubIdentifier ? "uuid", enableOCR ? false
}: }:
makeTest { makeTest {
inherit iso; inherit iso;
name = "installer-" + name; name = "installer-" + name;
nodes = if testChannel then { inherit webserver; } else { }; nodes = if testChannel then { inherit webserver; } else { };
inherit enableOCR;
testScript = testScriptFun { testScript = testScriptFun {
inherit createPartitions preBootCommands testChannel grubVersion inherit createPartitions preBootCommands testChannel grubVersion
grubDevice grubIdentifier extraConfig; grubDevice grubIdentifier extraConfig;
@ -364,6 +365,7 @@ in {
preLVM = true; preLVM = true;
}; };
''; '';
enableOCR = true;
preBootCommands = '' preBootCommands = ''
$machine->start; $machine->start;
$machine->waitForText(qr/Enter passphrase/); $machine->waitForText(qr/Enter passphrase/);