Merge lp:~johnemb/randgen/xml-report into lp:randgen

Proposed by John H. Embretsen
Status: Merged
Merged at revision: not available
Proposed branch: lp:~johnemb/randgen/xml-report
Merge into: lp:randgen
Diff against target: 1405 lines (+861/-284)
9 files modified
gentest.pl (+14/-2)
lib/GenTest.pm (+10/-2)
lib/GenTest/App/GenTest.pm (+38/-2)
lib/GenTest/XML/BuildInfo.pm (+112/-96)
lib/GenTest/XML/Environment.pm (+331/-46)
lib/GenTest/XML/Report.pm (+66/-53)
lib/GenTest/XML/Test.pm (+85/-80)
lib/GenTest/XML/Transporter.pm (+189/-0)
runall.pl (+16/-3)
To merge this branch: bzr merge lp:~johnemb/randgen/xml-report
Reviewer Review Type Date Requested Status
Random Query Generator Team Pending
Review via email: mp+22942@code.launchpad.net

Description of the change

Basic support for automatic test reporting. Extends the existing XML reporting functionality (module) with various fixes, adaptations to new version of the specified schema, and adds functionality for sending XML report files via SCP to a remote destination.

The functionality is working, but expect to see further improvements in the near future.

New options (to runall and gentest) added (subject to change):

 --testname=<name_of_test>
 --report-xml-tt (enable reporting to the TestTool reporting framework)
 --report-xml-tt-type=<type> (report transport type, current default is "scp")
 --report-xml-tt-dest=<destination> (where to send XML report, current default is set to some non-public user@host:path, tested internally).

To enable XML report delivery both options --xml-output=<filename> and --report-xml-tt must be set.

See https://blueprints.launchpad.net/randgen/+spec/xml-report-delivery

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'gentest.pl'
--- gentest.pl 2010-03-13 15:32:59 +0000
+++ gentest.pl 2010-04-07 14:30:43 +0000
@@ -46,6 +46,7 @@
46 'gendata:s',46 'gendata:s',
47 'grammar=s',47 'grammar=s',
48 'redefine=s',48 'redefine=s',
49 'testname=s',
49 'threads=i',50 'threads=i',
50 'queries=s',51 'queries=s',
51 'duration=s',52 'duration=s',
@@ -54,12 +55,15 @@
54 'rpl_mode=s',55 'rpl_mode=s',
55 'validators:s@',56 'validators:s@',
56 'reporters:s@',57 'reporters:s@',
58 'report-xml-tt',
59 'report-xml-tt-type=s',
60 'report-xml-tt-dest=s',
57 'seed=s',61 'seed=s',
58 'mask=i',62 'mask=i',
59 'mask-level=i',63 'mask-level=i',
60 'rows=i',64 'rows=i',
61 'varchar-length=i',65 'varchar-length=i',
62 'xml_output=s',66 'xml-output=s',
63 'views',67 'views',
64 'start-dirty',68 'start-dirty',
65 'filter=s',69 'filter=s',
@@ -77,6 +81,7 @@
77 'engine',81 'engine',
78 'gendata',82 'gendata',
79 'redefine',83 'redefine',
84 'testname',
80 'threads',85 'threads',
81 'queries',86 'queries',
82 'duration',87 'duration',
@@ -85,6 +90,9 @@
85 'rpl_mode',90 'rpl_mode',
86 'validators',91 'validators',
87 'reporters',92 'reporters',
93 'report-xml-tt',
94 'report-xml-tt-type',
95 'report-xml-tt-dest',
88 'seed',96 'seed',
89 'mask',97 'mask',
90 'mask-level',98 'mask-level',
@@ -138,7 +146,11 @@
138 --views : Pass --views to gendata-old.pl or gendata.pl146 --views : Pass --views to gendata-old.pl or gendata.pl
139 --filter : ......147 --filter : ......
140 --start-dirty: Do not generate data (use existing database(s))148 --start-dirty: Do not generate data (use existing database(s))
141 --xml-output: ......149 --xml-output: Name of a file to which an XML report will be written if this option is set.
150 --report-xml-tt: Report test results in XML-format to the Test Tool (TT) reporting framework.
151 --report-xml-tt-type: Type of TT XML transport to use (e.g. scp)
152 --report-xml-tt-dest: Destination of TT XML report (e.g. user\@host:/path/to/location (for type scp))
153 --testname : Name of test, used for reporting purposes.
142 --valgrind : ......154 --valgrind : ......
143 --filter : ......155 --filter : ......
144 --help : This help message156 --help : This help message
145157
=== modified file 'lib/GenTest.pm'
--- lib/GenTest.pm 2010-03-04 13:51:59 +0000
+++ lib/GenTest.pm 2010-04-07 14:30:43 +0000
@@ -18,7 +18,7 @@
18package GenTest;18package GenTest;
19use base 'Exporter';19use base 'Exporter';
2020
21@EXPORT = ('say', 'sayFile', 'tmpdir', 'safe_exit', 'windows',21@EXPORT = ('say', 'sayFile', 'tmpdir', 'safe_exit', 'windows', 'linux',
22 'solaris', 'isoTimestamp', 'isoUTCTimestamp', 'rqg_debug');22 'solaris', 'isoTimestamp', 'isoUTCTimestamp', 'rqg_debug');
2323
24use strict;24use strict;
@@ -123,6 +123,14 @@
123 } 123 }
124}124}
125125
126sub linux {
127 if ($^O eq 'linux') {
128 return 1;
129 } else {
130 return 0;
131 }
132}
133
126sub solaris {134sub solaris {
127 if ($^O eq 'solaris') {135 if ($^O eq 'solaris') {
128 return 1;136 return 1;
@@ -136,7 +144,7 @@
136144
137 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = defined $datetime ? localtime($datetime) : localtime();145 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = defined $datetime ? localtime($datetime) : localtime();
138 return sprintf("%04d-%02d-%02dT%02d:%02d:%02d", $year+1900, $mon+1 ,$mday ,$hour, $min, $sec);146 return sprintf("%04d-%02d-%02dT%02d:%02d:%02d", $year+1900, $mon+1 ,$mday ,$hour, $min, $sec);
139 147
140}148}
141149
142sub isoUTCTimestamp {150sub isoUTCTimestamp {
143151
=== modified file 'lib/GenTest/App/GenTest.pm'
--- lib/GenTest/App/GenTest.pm 2010-04-06 13:29:11 +0000
+++ lib/GenTest/App/GenTest.pm 2010-04-07 14:30:43 +0000
@@ -24,6 +24,7 @@
24use strict;24use strict;
25use Carp;25use Carp;
26use Data::Dumper;26use Data::Dumper;
27use File::Basename;
2728
28use GenTest;29use GenTest;
29use GenTest::Properties;30use GenTest::Properties;
@@ -40,6 +41,7 @@
40use GenTest::XML::Report;41use GenTest::XML::Report;
41use GenTest::XML::Test;42use GenTest::XML::Test;
42use GenTest::XML::BuildInfo;43use GenTest::XML::BuildInfo;
44use GenTest::XML::Transporter;
43use GenTest::Constants;45use GenTest::Constants;
44use GenTest::Result;46use GenTest::Result;
45use GenTest::Validator;47use GenTest::Validator;
@@ -234,8 +236,24 @@
234 );236 );
235 }237 }
236 238
239 # XML:
240 # Define test suite name for reporting purposes.
241 # Until we support test suites and/or reports with multiple suites/tests,
242 # we use the test name as test suite name, from config option "testname".
243 # Default test name is the basename portion of the grammar file name.
244 # If a grammar file is not given, the default is "rqg_no_name".
245 my $test_suite_name = $self->config->testname;
246 if (not defined $test_suite_name) {
247 if (defined $self->config->grammar) {
248 $test_suite_name = basename($self->config->grammar, '.yy');
249 } else {
250 $test_suite_name = "rqg_no_name";
251 }
252 }
253
237 my $test = GenTest::XML::Test->new(254 my $test = GenTest::XML::Test->new(
238 id => Time::HiRes::time(),255 id => time(),
256 name => $test_suite_name, # NOTE: Consider changing to test (or test case) name when suites are supported.
239 attributes => {257 attributes => {
240 engine => $self->config->engine,258 engine => $self->config->engine,
241 gendata => $self->config->gendata,259 gendata => $self->config->gendata,
@@ -254,6 +272,7 @@
254 272
255 my $report = GenTest::XML::Report->new(273 my $report = GenTest::XML::Report->new(
256 buildinfo => $buildinfo,274 buildinfo => $buildinfo,
275 name => $test_suite_name, # NOTE: name here refers to the name of the test suite or "test".
257 tests => [ $test ]276 tests => [ $test ]
258 );277 );
259278
@@ -393,9 +412,26 @@
393 $test->end($total_status == STATUS_OK ? "pass" : "fail");412 $test->end($total_status == STATUS_OK ? "pass" : "fail");
394 413
395 if (defined $self->config->property('xml-output')) {414 if (defined $self->config->property('xml-output')) {
396 open (XML , ">$self->config->property('xml-output')") or say("Unable to open $self->config->property('xml-output'): $!");415 open (XML , '>'.$self->config->property('xml-output')) or carp("Unable to open ".$self->config->property('xml-output').": $!");
397 print XML $report->xml();416 print XML $report->xml();
398 close XML;417 close XML;
418 say("XML report written to ". $self->config->property('xml-output'));
419 }
420
421 # XML Result reporting to Test Tool (TT).
422 # Currently both --xml-output=<filename> and --report-xml-tt must be
423 # set to trigger this.
424 if (defined $self->config->property('report-xml-tt')) {
425 my $xml_transporter = GenTest::XML::Transporter->new(
426 type => $self->config->property('report-xml-tt-type')
427 );
428 my $result = $xml_transporter->sendXML(
429 $self->config->property('xml-output'),
430 $self->config->property('report-xml-tt-dest')
431 );
432 if ($result != STATUS_OK) {
433 croak("Error from XML Transporter: $result");
434 }
399 }435 }
400 436
401 if ($total_status == STATUS_OK) {437 if ($total_status == STATUS_OK) {
402438
=== modified file 'lib/GenTest/XML/BuildInfo.pm'
--- lib/GenTest/XML/BuildInfo.pm 2010-02-10 12:47:45 +0000
+++ lib/GenTest/XML/BuildInfo.pm 2010-04-07 14:30:43 +0000
@@ -1,4 +1,4 @@
1# Copyright (C) 2008-2009 Sun Microsystems, Inc. All rights reserved.1# Copyright (c) 2008, 2010 Oracle and/or its affiliates. All rights reserved.
2# Use is subject to license terms.2# Use is subject to license terms.
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
@@ -24,107 +24,123 @@
24use GenTest;24use GenTest;
25use DBI;25use DBI;
2626
27use constant BUILDINFO_DSNS => 0;27use constant BUILDINFO_DSNS => 0;
28use constant BUILDINFO_SERVERS => 1;28use constant BUILDINFO_SERVERS => 1;
2929
30use constant BUILDINFO_SERVER_VERSION => 0;30use constant BUILDINFO_SERVER_VERSION => 0;
31use constant BUILDINFO_SERVER_PACKAGE => 1;31use constant BUILDINFO_SERVER_PACKAGE => 1;
32use constant BUILDINFO_SERVER_BIT => 2;32use constant BUILDINFO_SERVER_BIT => 2;
33use constant BUILDINFO_SERVER_PATH => 3;33use constant BUILDINFO_SERVER_PATH => 3;
34use constant BUILDINFO_SERVER_VARIABLES => 4;34use constant BUILDINFO_SERVER_VARIABLES => 4;
3535
36sub new {36sub new {
37 my $class = shift;37 my $class = shift;
3838
39 my $buildinfo = $class->SUPER::new({39 my $buildinfo = $class->SUPER::new({
40 dsns => BUILDINFO_DSNS40 dsns => BUILDINFO_DSNS
41 }, @_);41 }, @_);
4242
43 $buildinfo->[BUILDINFO_SERVERS] = [];43 $buildinfo->[BUILDINFO_SERVERS] = [];
4444
45 foreach my $id (0..$#{$buildinfo->[BUILDINFO_DSNS]}) {45 foreach my $id (0..$#{$buildinfo->[BUILDINFO_DSNS]})
46 my $dsn = $buildinfo->[BUILDINFO_DSNS]->[$id];46 {
47 next if $dsn eq '';47 my $dsn = $buildinfo->[BUILDINFO_DSNS]->[$id];
48 my $dbh = DBI->connect($dsn);48 next if $dsn eq '';
4949 my $dbh = DBI->connect($dsn);
50 my $server;50
5151 my $server;
52 $server->[BUILDINFO_SERVER_VERSION] = $dbh->selectrow_array('SELECT @@version');52
53 $server->[BUILDINFO_SERVER_PACKAGE] = $dbh->selectrow_array('SELECT @@version_comment');53 # TODO: Add support for non-MySQL dsns.
54 $server->[BUILDINFO_SERVER_BIT] = $dbh->selectrow_array('SELECT @@version_compile_machine');54 $server->[BUILDINFO_SERVER_VERSION] = $dbh->selectrow_array('SELECT @@version');
55 $server->[BUILDINFO_SERVER_PATH] = $dbh->selectrow_array('SELECT @@basedir');55 $server->[BUILDINFO_SERVER_PACKAGE] = $dbh->selectrow_array('SELECT @@version_comment');
56 $server->[BUILDINFO_SERVER_VARIABLES] = [];56 # According to the schema, bit must be "32" or "64".
5757 #$server->[BUILDINFO_SERVER_BIT] = $dbh->selectrow_array('SELECT @@version_compile_machine');
58 my $sth = $dbh->prepare("SHOW VARIABLES");58 $server->[BUILDINFO_SERVER_PATH] = $dbh->selectrow_array('SELECT @@basedir');
59 $sth->execute();59 $server->[BUILDINFO_SERVER_VARIABLES] = [];
60 while (my ($name, $value) = $sth->fetchrow_array()) {60
61 push @{$server->[BUILDINFO_SERVER_VARIABLES]}, [ $name , $value ];61 my $sth = $dbh->prepare("SHOW VARIABLES");
62 }62 $sth->execute();
63 $sth->finish();63 while (my ($name, $value) = $sth->fetchrow_array()) {
6464 push @{$server->[BUILDINFO_SERVER_VARIABLES]}, [ $name , $value ];
65 $dbh->disconnect();65 }
6666 $sth->finish();
67 $buildinfo->[BUILDINFO_SERVERS]->[$id] = $server;67
68 }68 $dbh->disconnect();
6969
70 return $buildinfo;70 $buildinfo->[BUILDINFO_SERVERS]->[$id] = $server;
71 }
72
73 return $buildinfo;
71}74}
7275
73sub xml {76sub xml {
74 require XML::Writer;77 require XML::Writer;
7578
76 my $buildinfo = shift;79 my $buildinfo = shift;
77 my $buildinfo_xml;80 my $buildinfo_xml;
7881
79 my $writer = XML::Writer->new(82 my $writer = XML::Writer->new(
80 OUTPUT => \$buildinfo_xml,83 OUTPUT => \$buildinfo_xml,
81 );84 );
8285
83 $writer->startTag('product');86 $writer->startTag('product');
84 $writer->dataElement('name','mysql');87 $writer->dataElement('name','MySQL');
85 $writer->startTag('builds');88 $writer->startTag('builds');
8689
87 foreach my $id (0..$#{$buildinfo->[BUILDINFO_DSNS]}) {90 foreach my $id (0..$#{$buildinfo->[BUILDINFO_DSNS]})
88 my $server = $buildinfo->[BUILDINFO_SERVERS]->[$id];91 {
89 next if not defined $server;92 my $server = $buildinfo->[BUILDINFO_SERVERS]->[$id];
9093 next if not defined $server;
91 $writer->startTag('build', id => $id);94
92 $writer->dataElement('version', $server->[BUILDINFO_SERVER_VERSION]);95 $writer->startTag('build', id => $id);
93 $writer->dataElement('package', $server->[BUILDINFO_SERVER_PACKAGE]);96 $writer->dataElement('version', $server->[BUILDINFO_SERVER_VERSION]);
94 $writer->dataElement('bit', $server->[BUILDINFO_SERVER_BIT]);97 $writer->dataElement('package', $server->[BUILDINFO_SERVER_PACKAGE]);
95 $writer->dataElement('path', $server->[BUILDINFO_SERVER_PATH]);98 #$writer->dataElement('bit', $server->[BUILDINFO_SERVER_BIT]); # Must be 32 or 64
96 # <compile_options> 99 $writer->dataElement('path', $server->[BUILDINFO_SERVER_PATH]);
97 $writer->endTag('build');100 ## TODO (if applicable):
98 }101 #<xsd:element name="tree" type="xsd:string" minOccurs="0" form="qualified"/>
99102 #<xsd:element name="revision" type="xsd:string" minOccurs="0" form="qualified"/>
100 $writer->endTag('builds');103 #<xsd:element name="tag" type="xsd:string" minOccurs="0" form="qualified"/>
101104 #<xsd:element name="compile_options" type="cassiopeia:Options" minOccurs="0" form="qualified"/>
102 $writer->startTag('binaries');105 #<xsd:element name="commandline" type="xsd:string" minOccurs="0" form="qualified" />
103106 #<xsd:element name="buildscript" minOccurs="0" type="xsd:string" form="qualified" />
104 foreach my $id (0..$#{$buildinfo->[BUILDINFO_DSNS]}) {107 $writer->endTag('build');
105 my $server = $buildinfo->[BUILDINFO_SERVERS]->[$id];108 }
106 next if not defined $server;109
107110
108 $writer->startTag('binary');111 $writer->endTag('builds');
109 $writer->dataElement('name', 'mysqld');112
110 $writer->startTag('commandline_options');113 $writer->startTag('binaries'); # --> <software> = <program>
111114
112 foreach my $option (@{$server->[BUILDINFO_SERVER_VARIABLES]}) {115 foreach my $id (0..$#{$buildinfo->[BUILDINFO_DSNS]})
113 $writer->startTag('option');116 {
114 $writer->dataElement('name', $option->[0]);117 my $server = $buildinfo->[BUILDINFO_SERVERS]->[$id];
115 $writer->dataElement('value', $option->[1]);118 next if not defined $server;
116 $writer->endTag('option');119
117 }120 $writer->startTag('program');
118121 $writer->dataElement('name', 'mysqld');
119 $writer->endTag('commandline_options');122 $writer->dataElement('type', 'database');
120 $writer->endTag('binary');123 $writer->startTag('commandline_options');
121 }124
122 125 # TODO: List actual commmand-line options (and config file options /
123 $writer->endTag('binaries');126 # RQG-defaults?), not all server variables?
124 $writer->endTag('product');127 foreach my $option (@{$server->[BUILDINFO_SERVER_VARIABLES]})
125 $writer->end();128 {
126129 $writer->startTag('option');
127 return $buildinfo_xml; 130 $writer->dataElement('name', $option->[0]);
131 $writer->dataElement('value', $option->[1]);
132 $writer->endTag('option');
133 }
134
135 $writer->endTag('commandline_options');
136 $writer->endTag('program');
137 }
138
139 $writer->endTag('binaries');
140 $writer->endTag('product');
141 $writer->end();
142
143 return $buildinfo_xml;
128}144}
129145
1301;1461;
131147
=== modified file 'lib/GenTest/XML/Environment.pm'
--- lib/GenTest/XML/Environment.pm 2010-02-10 12:47:45 +0000
+++ lib/GenTest/XML/Environment.pm 2010-04-07 14:30:43 +0000
@@ -1,4 +1,4 @@
1# Copyright (C) 2008-2009 Sun Microsystems, Inc. All rights reserved.1# Copyright (c) 2008, 2010 Oracle and/or its affiliates. All rights reserved.
2# Use is subject to license terms.2# Use is subject to license terms.
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
@@ -21,57 +21,342 @@
21@ISA = qw(GenTest);21@ISA = qw(GenTest);
2222
23use strict;23use strict;
24use Carp;
25use File::Spec;
24use GenTest;26use GenTest;
2527use Net::Domain qw(hostfqdn);
28
29# Global variables keeping environment info
30our $hostname = Net::Domain->hostfqdn();
31our $arch;
32our $kernel;
33our $bit;
34our $cpu;
35our $memory;
36#our $disk;
37our $role = 'server';
38our $locale;
39our $encoding;
40our $timezone;
41our $osType;
42our $osVer;
43our $osRev;
44our $osPatch;
45our $osBit;
46
47
48our $DEBUG=0;
2649
27sub new {50sub new {
28 my $class = shift;51 my $class = shift;
2952
30 my $environment = $class->SUPER::new({53 my $environment = $class->SUPER::new({
31 }, @_);54 }, @_);
3255
33 return $environment;56 return $environment;
34}57}
3558
36sub xml {59sub xml {
37 require XML::Writer;60 require XML::Writer;
3861
39 my $environment = shift;62 # Obtain environmental info from host.
40 my $environment_xml;63 # In separate function because lots of logic is needed to parse various
4164 # information based on the OS.
42 my $writer = XML::Writer->new(65 getInfo();
43 OUTPUT => \$environment_xml,66
44 );67 my $environment = shift;
4568 my $environment_xml;
46 $writer->startTag('environments');69
47 $writer->startTag('environment', 'id' => 0);70 my $writer = XML::Writer->new(
48 $writer->startTag('hosts');71 OUTPUT => \$environment_xml,
49 $writer->startTag('host');72 );
5073
51 $writer->dataElement('name', `hostname`);74 $writer->startTag('environments');
52 $writer->dataElement('arch', $^O);75 $writer->startTag('environment', 'id' => 0);
53 $writer->dataElement('role', 'server');76 $writer->startTag('hosts');
5477 $writer->startTag('host');
55 # <os>78
5679 # Some elements may be empty either because
57 # <software>80 # a) we don't know that piece of information
5881 # b) values are fetched from a database of test hosts
59 $writer->startTag('software');82 $writer->dataElement('name', $hostname);
60 $writer->startTag('program');83 $writer->dataElement('arch', $arch);
61 $writer->dataElement('name', 'perl');84 $writer->dataElement('kernel', $kernel);
62 $writer->dataElement('version', $^V);85 $writer->dataElement('bit', $bit) if defined $bit;
63 $writer->dataElement('path', $^X);86 $writer->dataElement('cpu', $cpu);
64 $writer->endTag('program');87 $writer->dataElement('memory', $memory);
65 $writer->endTag('software');88 $writer->dataElement('disk', '');
6689 $writer->dataElement('role', $role);
67 $writer->endTag('host');90 $writer->dataElement('locale', $locale);
68 $writer->endTag('hosts');91 $writer->dataElement('encoding', $encoding);
69 $writer->endTag('environment');92 $writer->dataElement('timezone', $timezone);
70 $writer->endTag('environments');93
7194 #
72 $writer->end();95 # <software> ...
7396 #
74 return $environment_xml; 97 $writer->startTag('software');
98
99 # <os>
100 $writer->startTag('program');
101 $writer->dataElement('name', $osType);
102 $writer->dataElement('type', 'os');
103 $writer->dataElement('version', $osVer);
104 #$writer->dataElement('patch', $osPatch); # not in XML schema
105 $writer->dataElement('bit', $osBit) if defined $osBit;
106 $writer->endTag('program');
107
108 # <program> perl
109 $writer->startTag('program');
110 $writer->dataElement('name', 'perl');
111 $writer->dataElement('type', 'perl');
112 #$writer->dataElement('version', $^V); # Solaris yields: Code point \u0005 is not a valid character in XML at lib/GenTest/XML/Environment.pm line 45
113 $writer->dataElement('version', $]);
114 $writer->dataElement('path', $^X);
115 $writer->endTag('program');
116
117 # <program> harness
118 $writer->startTag('program');
119 $writer->dataElement('name', 'Random Query Generator');
120 $writer->dataElement('type', 'harness');
121 my $rqg_path = File::Spec->rel2abs(); # assuming cwd is the randgen dir
122 $writer->dataElement('path', $rqg_path);
123 ## TODO (if applicable):
124 #<xsd:element name="version" type="xsd:string" minOccurs="0" maxOccurs="1" form="qualified"/>
125 #<xsd:element name="revision" type="xsd:int" minOccurs="0" form="qualified"/>
126 #<xsd:element name="commandline_options" type="cassiopeia:Options" minOccurs="0" form="qualified"/>
127 #<xsd:element name="commandline" minOccurs="0" type="xsd:string" form="qualified" /> # alternative to the above
128 $writer->endTag('program');
129
130 $writer->endTag('software');
131
132 $writer->endTag('host');
133 $writer->endTag('hosts');
134 $writer->endTag('environment');
135 $writer->endTag('environments');
136
137 $writer->end();
138
139 return $environment_xml;
140}
141
142sub getInfo()
143{
144
145 # lets see what OS type we have
146 if (linux())
147 {
148
149 # Get the CPU info
150 $cpu = trim(`cat /proc/cpuinfo | grep -i "model name" | head -n 1 | cut -b 14-`);
151 my $numOfP = trim(`cat /proc/cpuinfo | grep processor |wc -l`);
152 $cpu ="$numOfP"."x"."$cpu";
153
154 #try to get OS Information
155 if (-e "/etc/SuSE-release"){$osVer=`cat /etc/SuSE-release |head -n 1`;}
156 elsif (-e "/etc/redhat-release"){$osVer=`cat /etc/redhat-release |head -n 1`;}
157 elsif (-e "/etc/debian_version"){$osVer=`cat /etc/debian_version |head -n 1`;}
158 else {$osVer="linux-unknown";}
159 $osVer=trim($osVer);
160 if (-e "/etc/SuSE-release"){$osPatch=`cat /etc/SuSE-release |tail -n 1`;}
161 elsif (-e "/etc/redhat-release"){$osPatch=`cat /etc/redhat-release |tail -n 1`;}
162 elsif (-e "/etc/debian_version"){$osPatch=`cat /etc/debian_version |tail -n 1`;}
163 else {$osPatch="unknown";}
164 (my $trash, $osPatch) = split(/=/,$osPatch);
165 $osType="Linux";
166 $arch=trim(`uname -m`);
167 # We assume something like "x86_64" from 'uname -m'. Get bit info from that.
168 ($trash, $bit) = split(/_/,$arch);
169 # If nothing after '_' (or no '_' at all), assume 32-bit.
170 $bit = "32" if length($bit) < 1;
171 #$bit = undef if length($bit) < 1;
172 $osBit = $bit; # treat $osBit as $bit for now...
173
174 $kernel=trim(`uname -r`);
175
176 #Memory
177 $memory = trim(`cat /proc/meminfo | grep -i memtotal`);
178 $memory =~ s/MemTotal: //;
179 ($memory, $trash) = split(/k/,$memory);
180 $memory = trim(`cat /proc/meminfo |grep -i memtotal`);
181 $memory =~ /MemTotal:\s*(\d+)/;
182 $memory = sprintf("%.2f",($1/1024000))."GB";
183
184 #locale
185 if (defined ($locale=`locale |grep LC_CTYPE| cut -b 10-`))
186 {
187 ($locale,$encoding) = split(/\./,$locale);
188 }
189 else
190 {
191 $locale = "UNKNOWN";
192 $encoding = "UNKNOWN";
193 }
194
195 #TimeZone
196 $timezone = trim(`date +%Z`);
197 }
198 elsif(solaris())
199 {
200
201 # Get the CPU info
202 my $tmpVar = `/usr/sbin/psrinfo -v | grep -i "operates" | head -1`;
203 ($cpu, my $speed) = split(/processor operates at/,$tmpVar);
204 $cpu =~ s/The//;
205 $speed =~ s/MHz//;
206 $cpu = trim($cpu);
207 $speed = trim($speed);
208 if ($speed => 1000)
209 {
210 $speed = $speed/1000;
211 $speed = "$speed"."GHz";
212 }
213 else
214 {
215 $speed = "$speed"."MHz";
216 }
217
218 my $numOfP = `/usr/sbin/psrinfo -v | grep -i "operates" |wc -l`;
219 $numOfP = trim($numOfP);
220 $cpu ="$numOfP"."x"."$cpu"."$speed";
221
222 #try to get OS Information
223 ($osType,$osVer,$arch) = split (/ /, trim(`uname -srp`));
224 # use of uname -m is discouraged (man pages), so use isainfo instead
225 $kernel = `isainfo -k`;
226 $osBit = `isainfo -b`;
227 my $trash; # variable functioning as /dev/null
228 ($trash, $trash, my $osPatch1, my $osPatch2, $trash) = split(/ /, trim(`cat /etc/release | head -1`));
229 my $osPatch3 = `uname -v`;
230 $osPatch = $osPatch1.' '.$osPatch2.' '.$osPatch3;
231 $osPatch = trim($osPatch);
232
233 #Memory
234 $memory = `/usr/sbin/prtconf | grep Memory`;
235 $memory =~ s/Memory size://;
236 $memory =~ s/Megabytes//;
237 $memory = trim($memory);
238 $memory = $memory/1024;
239 ($memory, my $trash) = split(/\./,$memory);
240 $memory = "$memory"."GB";
241
242 #locale
243 if (defined ($locale=`locale |grep LC_CTYPE| cut -b 10-`))
244 {
245 ($locale,$encoding) = split(/\./,$locale);
246 }
247 else
248 {
249 $locale = "UNKNOWN";
250 $encoding = "UNKNOWN";
251 }
252
253 #TimeZone
254 $timezone = trim(`date +%Z`);
255 }
256 elsif(windows())
257 {
258 #$hostName = `hostname`;
259 my @tmpData;
260 if ($^O eq 'cygwin')
261 {
262 # Assuming cygwin on Windows at this point
263 @tmpData = `cmd /c systeminfo 2>&1`;
264 }
265 else
266 {
267 # Assuming Windows at this point
268 @tmpData = `systeminfo 2>&1`;
269 }
270
271 if ($? != 0)
272 {
273 carp "systeminfo command failed with: $?";
274 $cpu = "UNKNOWN";
275 $osType = "UNKNOWN";
276 $osVer = "UNKNOWN";
277 $arch = "UNKNOWN";
278 $kernel = "UNKNOWN";
279 $memory = "UNKNOWN";
280 $locale = "UNKNOWN";
281 $timezone = "UNKNOWN";
282 }
283 else
284 {
285 $kernel = "UNKOWN";
286 my $cpuFlag = 0;
287 # Time to get busy and grab what we need.
288 foreach my $line (@tmpData)
289 {
290 if ($cpuFlag == 1)
291 {
292 (my $numP, $cpu) = split(/\:/,$line);
293 $numP = trim($numP);
294 (my $trash, $numP) = split(/\[/,$numP);
295 ($numP, $trash) = split(/\]/,$numP);
296 $cpu = "$numP"."$cpu";
297 $cpu = trim($cpu);
298 $cpuFlag=0;
299 }
300 elsif ($line =~ /OS Name:\s+(.*?)\s*$/)
301 {
302 $osType = $1;
303 }
304 elsif ($line =~ /^OS Version:\s+(.*?)\s*$/)
305 {
306 $osVer = $1;
307 }
308 elsif ($line =~ /System type:\s/i)
309 {
310 (my $trash, $arch) = split(/\:/,$line);
311 ($arch,$trash) = split(/\-/,$arch);
312 $arch = trim($arch);
313 }
314 elsif ($line =~ /^Processor/)
315 {
316 $cpuFlag = 1;
317 next;
318 }
319 elsif ($line =~ /^Total Physical Memory:\s+(.*?)\s*$/)
320 {
321 $memory = $1;
322 }
323 elsif ($line =~ /Locale:/)
324 {
325 (my $trash, $locale) = split(/\:/,$line);
326 ($locale, $trash) = split(/\;/,$locale);
327 $locale = trim($locale);
328 }
329 elsif ($line =~ /Time Zone:\s+(.*?)\s*$/)
330 {
331 $timezone = $1;
332 }
333 }
334 }
335 }
336 else
337 {
338 confess "\n\nUnable to figure out OS!!\n\n";
339 }
340
341 if ($DEBUG)
342 {
343 print "cpu = $cpu\n";
344 print "os = $osType\n";
345 print "OS ver = $osVer\n";
346 print "Arch = $arch\n";
347 print "Kernel = $kernel\n";
348 print "memory = $memory\n";
349 print "locale = $locale\n";
350 print "Timezone = $timezone\n";
351 }
352}
353
354sub trim($)
355{
356 my $string = shift;
357 $string =~ s/^\s+//;
358 $string =~ s/\s+$//;
359 return $string;
75}360}
76361
771;3621;
78363
=== modified file 'lib/GenTest/XML/Report.pm'
--- lib/GenTest/XML/Report.pm 2010-03-04 13:51:59 +0000
+++ lib/GenTest/XML/Report.pm 2010-04-07 14:30:43 +0000
@@ -1,4 +1,4 @@
1# Copyright (C) 2008-2009 Sun Microsystems, Inc. All rights reserved.1# Copyright (c) 2008, 2010 Oracle and/or its affiliates. All rights reserved.
2# Use is subject to license terms.2# Use is subject to license terms.
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
@@ -30,10 +30,11 @@
30# test result XML report. Not all of them will be used30# test result XML report. Not all of them will be used
31#31#
3232
33use constant XMLREPORT_DATE => 0;33use constant XMLREPORT_DATE => 0;
34use constant XMLREPORT_BUILDINFO => 1;34use constant XMLREPORT_BUILDINFO => 1;
35use constant XMLREPORT_TESTS => 2;35use constant XMLREPORT_TESTS => 2;
36use constant XMLREPORT_ENVIRONMENT => 3;36use constant XMLREPORT_ENVIRONMENT => 3;
37use constant XMLREPORT_NAME => 4;
3738
381;391;
3940
@@ -44,62 +45,74 @@
44 environment => XMLREPORT_ENVIRONMENT,45 environment => XMLREPORT_ENVIRONMENT,
45 date => XMLREPORT_DATE,46 date => XMLREPORT_DATE,
46 buildinfo => XMLREPORT_BUILDINFO,47 buildinfo => XMLREPORT_BUILDINFO,
47 tests => XMLREPORT_TESTS48 tests => XMLREPORT_TESTS,
49 name => XMLREPORT_NAME
48 }, @_);50 }, @_);
4951
50 $report->[XMLREPORT_DATE] = isoUTCTimestamp() if not defined $report->[XMLREPORT_DATE];52 $report->[XMLREPORT_DATE] = isoTimestamp() if not defined $report->[XMLREPORT_DATE];
51 $report->[XMLREPORT_ENVIRONMENT] = GenTest::XML::Environment->new() if not defined $report->[XMLREPORT_ENVIRONMENT];53 $report->[XMLREPORT_ENVIRONMENT] = GenTest::XML::Environment->new() if not defined $report->[XMLREPORT_ENVIRONMENT];
5254
53 return $report;55 return $report;
54}56}
5557
56sub xml {58sub xml {
57 my $report = shift;59 my $report = shift;
5860
59 require XML::Writer;61 require XML::Writer;
6062
61 my $report_xml;63 my $report_xml;
6264
63 my $writer = XML::Writer->new(65 my $writer = XML::Writer->new(
64 OUTPUT => \$report_xml,66 OUTPUT => \$report_xml,
65 UNSAFE => 167 UNSAFE => 1 # required for use of 'raw()'
66 );68 );
6769
68 $writer->xmlDecl('ISO-8859-1');70 $writer->xmlDecl('ISO-8859-1');
69 $writer->startTag('report',71 $writer->startTag('report',
70 'xmlns' => "http://clustra.norway.sun.com/intraweb/organization/qa/cassiopeia",72 'xmlns' => "http://clustra.norway.sun.com/intraweb/organization/qa/cassiopeia",
71 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance",73 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance",
72 'xsi:schemaLocation' => "http://clustra.norway.sun.com/intraweb/organization/qa/cassiopeia http://clustra.norway.sun.com/intraweb/organization/qa/cassiopeia/cassiopeia-testresult.xsd"74 'xsi:schemaLocation' => "http://clustra.norway.sun.com/intraweb/organization/qa/cassiopeia http://clustra.norway.sun.com/intraweb/organization/qa/cassiopeia/testresult-schema-1-2.xsd",
73 );75 'version' => "1.2"
74 76 );
75 $writer->dataElement('date', $report->[XMLREPORT_DATE]);77
76 $writer->dataElement('version', 1);78 $writer->dataElement('date', $report->[XMLREPORT_DATE]);
77 $writer->dataElement('operator', $<);79 if (linux() || solaris())
7880 {
79 $writer->raw($report->[XMLREPORT_BUILDINFO]->xml()) if defined $report->[XMLREPORT_BUILDINFO];81 $writer->dataElement('operator', $ENV{'LOGNAME'});
80 $writer->raw($report->[XMLREPORT_ENVIRONMENT]->xml()) if defined $report->[XMLREPORT_BUILDINFO];82 }
8183 else
82 $writer->startTag('testsuites');84 {
83 $writer->startTag('testsuite', id => 0);85 $writer->dataElement('operator', $ENV{'USERNAME'});
84 $writer->dataElement('name', 'Random Query Generator');86 }
85 $writer->dataElement('environment_id', 0);87
86 $writer->dataElement('starttime', $report->[XMLREPORT_DATE]);88 $writer->raw($report->[XMLREPORT_ENVIRONMENT]->xml()) if defined $report->[XMLREPORT_BUILDINFO];
87 $writer->dataElement('endtime', isoUTCTimestamp());89 $writer->raw($report->[XMLREPORT_BUILDINFO]->xml()) if defined $report->[XMLREPORT_BUILDINFO];
88 $writer->dataElement('description', 'http://forge.mysql.com/wiki/RQG');90
89 $writer->startTag('tests');91 $writer->startTag('testsuites');
9092 $writer->startTag('testsuite', id => 0);
91 foreach my $test (@{$report->[XMLREPORT_TESTS]}) {93 $writer->dataElement('name', $report->[XMLREPORT_NAME]);
92 $writer->raw($test->xml());94 $writer->dataElement('environment_id', 0);
93 }95 $writer->dataElement('starttime', $report->[XMLREPORT_DATE]);
9496 $writer->dataElement('endtime', isoTimestamp());
95 $writer->endTag('tests');97 $writer->dataElement('description', 'http://forge.mysql.com/wiki/RQG');
96 $writer->endTag('testsuite');98 # TODO (if applicable):
97 $writer->endTag('testsuites');99 # test-suite specific descriptions (once we have defined testsuites)?
98 $writer->endTag('report');100 #<xsd:element name="logdir" type="xsd:string" minOccurs="0" form="qualified"/>
99101 #<xsd:element name="attributes" type="cassiopeia:Attributes" minOccurs="0" form="qualified"/> # pairs of (name, value)
100 $writer->end();102 $writer->startTag('tests');
101103
102 return $report_xml;104 foreach my $test (@{$report->[XMLREPORT_TESTS]}) {
105 $writer->raw($test->xml());
106 }
107
108 $writer->endTag('tests');
109 $writer->endTag('testsuite');
110 $writer->endTag('testsuites');
111 $writer->endTag('report');
112
113 $writer->end();
114
115 return $report_xml;
103}116}
104117
1051;1181;
106119
=== modified file 'lib/GenTest/XML/Test.pm'
--- lib/GenTest/XML/Test.pm 2010-03-04 13:51:59 +0000
+++ lib/GenTest/XML/Test.pm 2010-04-07 14:30:43 +0000
@@ -1,4 +1,4 @@
1# Copyright (C) 2008-2009 Sun Microsystems, Inc. All rights reserved.1# Copyright (c) 2008, 2010 Oracle and/or its affiliates. All rights reserved.
2# Use is subject to license terms.2# Use is subject to license terms.
3#3#
4# This program is free software; you can redistribute it and/or modify4# This program is free software; you can redistribute it and/or modify
@@ -28,101 +28,106 @@
28# test result XML report. Not all of them will be used28# test result XML report. Not all of them will be used
29#29#
3030
31use constant TEST_ID => 0;31use constant TEST_ID => 0;
32use constant TEST_NAME => 1;32use constant TEST_NAME => 1;
33use constant TEST_ENVIRONMENT_ID => 2;33use constant TEST_ENVIRONMENT_ID => 2;
34use constant TEST_STARTTIME => 3;34use constant TEST_STARTTIME => 3;
35use constant TEST_ENDTIME => 4;35use constant TEST_ENDTIME => 4;
36use constant TEST_LOGDIR => 5;36use constant TEST_LOGDIR => 5;
37use constant TEST_RESULT => 6;37use constant TEST_RESULT => 6;
38use constant TEST_DESCRIPTION => 7;38use constant TEST_DESCRIPTION => 7;
39use constant TEST_ATTRIBUTES => 8; 39use constant TEST_ATTRIBUTES => 8;
40use constant TEST_INCIDENTS => 9;40use constant TEST_INCIDENTS => 9;
4141
421;421;
4343
44sub new {44sub new {
45 my $class = shift;45 my $class = shift;
4646
47 my $test = $class->SUPER::new({47 my $test = $class->SUPER::new({
48 id => TEST_ID,48 id => TEST_ID,
49 name => TEST_NAME,49 name => TEST_NAME,
50 environment_id => TEST_ENVIRONMENT_ID,50 environment_id => TEST_ENVIRONMENT_ID,
51 starttime => TEST_STARTTIME,51 starttime => TEST_STARTTIME,
52 endtime => TEST_ENDTIME,52 endtime => TEST_ENDTIME,
53 logdir => TEST_LOGDIR,53 logdir => TEST_LOGDIR,
54 result => TEST_RESULT,54 result => TEST_RESULT,
55 description => TEST_DESCRIPTION,55 description => TEST_DESCRIPTION,
56 attributes => TEST_ATTRIBUTES,56 attributes => TEST_ATTRIBUTES,
57 incidents => TEST_INCIDENTS57 incidents => TEST_INCIDENTS
58 }, @_);58 }, @_);
5959
60 $test->[TEST_STARTTIME] = isoUTCTimestamp() if not defined $test->[TEST_STARTTIME];60 $test->[TEST_STARTTIME] = isoTimestamp() if not defined $test->[TEST_STARTTIME];
61 $test->[TEST_ENVIRONMENT_ID] = 0 if not defined $test->[TEST_ENVIRONMENT_ID];61 $test->[TEST_ENVIRONMENT_ID] = 0 if not defined $test->[TEST_ENVIRONMENT_ID];
6262
63 return $test;63 return $test;
64}64}
6565
66sub end {66sub end {
67 my ($test, $result) = @_;67 my ($test, $result) = @_;
68 $test->[TEST_ENDTIME] = isoUTCTimestamp(); 68 $test->[TEST_ENDTIME] = isoTimestamp();
69 $test->[TEST_RESULT] = $result;69 $test->[TEST_RESULT] = $result;
70}70}
7171
72sub xml {72sub xml {
73 require XML::Writer;73 require XML::Writer;
7474
75 my $test = shift;75 my $test = shift;
7676
77 $test->end() if not defined $test->[TEST_ENDTIME];77 $test->end() if not defined $test->[TEST_ENDTIME];
7878
79 my $test_xml;79 my $test_xml;
80 my $writer = XML::Writer->new(80 my $writer = XML::Writer->new(
81 OUTPUT => \$test_xml,81 OUTPUT => \$test_xml,
82 UNSAFE => 182 UNSAFE => 1
83 );83 );
8484
85 $writer->startTag('test', id => $test->[TEST_ID]);85 $writer->startTag('test', id => $test->[TEST_ID]);
8686
87 $writer->dataElement('name', $test->[TEST_NAME]);87 $writer->dataElement('name', $test->[TEST_NAME] ? $test->[TEST_NAME] : "NO_NAME");
88 $writer->dataElement('environment_id', $test->[TEST_ENVIRONMENT_ID]);88 $writer->dataElement('environment_id', $test->[TEST_ENVIRONMENT_ID]);
89 $writer->dataElement('starttime', $test->[TEST_STARTTIME]);89 $writer->dataElement('starttime', $test->[TEST_STARTTIME]);
90 $writer->dataElement('endtime', $test->[TEST_ENDTIME]);90 $writer->dataElement('endtime', $test->[TEST_ENDTIME]);
91 $writer->dataElement('logdir', $test->[TEST_LOGDIR]);91 $writer->dataElement('logdir', $test->[TEST_LOGDIR]);
92 $writer->dataElement('result', $test->[TEST_RESULT]);92 $writer->dataElement('result', $test->[TEST_RESULT]);
93 $writer->dataElement('description', $test->[TEST_DESCRIPTION]);93 $writer->dataElement('description', $test->[TEST_DESCRIPTION]);
94 94
95 if (defined $test->[TEST_ATTRIBUTES]) {95 if (defined $test->[TEST_ATTRIBUTES]) {
96 $writer->startTag('attributes');96 $writer->startTag('attributes');
97 while (my ($name, $value) = each %{$test->[TEST_ATTRIBUTES]}) {97 while (my ($name, $value) = each %{$test->[TEST_ATTRIBUTES]}) {
98 $writer->emptyTag('attribute', 'name' => $name, 'value' => $value);98 $writer->startTag('attribute');
99 }99 $writer->dataElement('name', $name);
100 $writer->endTag('attributes');100 $writer->dataElement('value', $value);
101 }101 $writer->endTag('attribute');
102102 }
103 if (defined $test->[TEST_INCIDENTS]) {103 $writer->endTag('attributes');
104 $writer->startTag('incidents');104 }
105 foreach my $incident (@{$test->[TEST_INCIDENTS]}) {105
106 $writer->raw($incident->xml());106 if (defined $test->[TEST_INCIDENTS]) {
107 }107 $writer->startTag('incidents');
108 $writer->endTag('incidents');108 foreach my $incident (@{$test->[TEST_INCIDENTS]}) {
109 }109 $writer->raw($incident->xml());
110110 }
111 $writer->endTag('test');111 $writer->endTag('incidents');
112112 }
113 $writer->end();113
114 114 # TODO: <metrics> (name, value, unit, attributes, timestamp)
115 return $test_xml;115
116 $writer->endTag('test');
117
118 $writer->end();
119
120 return $test_xml;
116}121}
117122
118sub setId {123sub setId {
119 $_[0]->[TEST_ID] = $_[1];124 $_[0]->[TEST_ID] = $_[1];
120}125}
121126
122sub addIncident {127sub addIncident {
123 my ($test, $incident) = @_;128 my ($test, $incident) = @_;
124 $test->[TEST_INCIDENTS] = [] if not defined $test->[TEST_INCIDENTS];129 $test->[TEST_INCIDENTS] = [] if not defined $test->[TEST_INCIDENTS];
125 push @{$test->[TEST_INCIDENTS]}, $incident;130 push @{$test->[TEST_INCIDENTS]}, $incident;
126}131}
127132
1281;1331;
129134
=== added file 'lib/GenTest/XML/Transporter.pm'
--- lib/GenTest/XML/Transporter.pm 1970-01-01 00:00:00 +0000
+++ lib/GenTest/XML/Transporter.pm 2010-04-07 14:30:43 +0000
@@ -0,0 +1,189 @@
1# Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
2# Use is subject to license terms.
3#
4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation; version 2 of the License.
7#
8# This program is distributed in the hope that it will be useful, but
9# WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11# General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program; if not, write to the Free Software
15# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
16# USA
17
18package GenTest::XML::Transporter;
19
20require Exporter;
21@ISA = qw(GenTest);
22
23#@EXPORT = ('XMLTRANSPORT_TYPE_SCP', 'XMLTRANSPORT_TYPE_MYSQL');
24
25use strict;
26use GenTest;
27use GenTest::Constants;
28use GenTest::Properties;
29
30
31use constant XMLTRANSPORT_TYPE => 0; # which transport type to use
32use constant XMLTRANSPORT_TYPE_MYSQL => 1; # db connections
33use constant XMLTRANSPORT_TYPE_SCP => 2; # secure copy
34use constant XMLTRANSPORT_TYPES => 3; # collection of types
35
36# Defaults:
37use constant XML_DEFAULT_TRANSPORT_TYPE => XMLTRANSPORT_TYPE_SCP;
38use constant XML_MYSQL_DEFAULT_DSN =>
39 'dbi:mysql:host=myhost:port=3306:user=xmldrop:password=test;database=test';
40use constant XML_SCP_DEFAULT_USER => 'qauser';
41use constant XML_SCP_DEFAULT_HOST => 'regin.norway.sun.com';
42use constant XML_SCP_DEFAULT_DEST_PATH => '/raid/xml_results/TestTool/xml/';
43
441; # so the require or use succeeds
45
46#
47# Use this class for transporting XML reports to a given destination.
48#
49# Usage example (using default settings):
50#
51# use GenTest::XML::Transporter;
52# my $xml_transporter = GenTest::XML::Transporter->new(
53# type => undef)
54# );
55# my $result = $xml_transporter->sendXML($xmlFileName);
56# if ($result != STATUS_OK) {
57# croak("Error from XML Transporter: $result");
58# }
59#
60#
61sub new {
62 my $class = shift;
63
64 my $self = $class->SUPER::new({
65 type => XMLTRANSPORT_TYPE
66 }, @_);
67
68 # Figure out transport type, which may be set as string value on
69 # command-line, or elsewhere. Use default if not set.
70 if (not defined $self->[XMLTRANSPORT_TYPE]) {
71 $self->[XMLTRANSPORT_TYPE] = XML_DEFAULT_TRANSPORT_TYPE;
72 say('XML Transport: Using default settings');
73 } elsif ($self->[XMLTRANSPORT_TYPE] =~ m{scp}io) {
74 # string match for "scp" (case insensitive)
75 $self->[XMLTRANSPORT_TYPE] = XMLTRANSPORT_TYPE_SCP;
76 } elsif ($self->[XMLTRANSPORT_TYPE] =~ m{mysql}io) {
77 # string match for "mysql" (case insensitive)
78 $self->[XMLTRANSPORT_TYPE] = XMLTRANSPORT_TYPE_MYSQL;
79 }
80
81 #${$self}[XMLTRANSPORT_TYPES] = ();
82
83 return $self;
84}
85
86
87#
88# Returns the type of transport mechanism this object represents.
89#
90sub type {
91 my $self = shift;
92 if (defined $self->[XMLTRANSPORT_TYPE]) {
93 return $self->[XMLTRANSPORT_TYPE];
94 } else {
95 return XML_DEFAULT_TRANSPORT_TYPE;
96 }
97}
98
99#
100# Constructs a default destination for the SCP transport type.
101# Suitable for use in an scp command-line such as:
102# scp myfile <defaultScpDestination>
103# where <defaultScpDestination> is <user>@<host>:<path>.
104#
105sub defaultScpDestination {
106 my $self = shift;
107 return XML_SCP_DEFAULT_USER.'@'.XML_SCP_DEFAULT_HOST.
108 ':'.XML_SCP_DEFAULT_DEST_PATH;
109}
110
111
112#
113# Sends XML data to a destination.
114# The transport mechanism to use (e.g. file copy, database insert, ftp, etc.)
115# and destination is determined by the "type" argument to the object's
116# constructor.
117#
118# Arguments:
119# arg1: xml - The xml data file name. TODO: Support XML as string?
120# arg2: dest - Destination for xml report. Defaults are used if omitted.
121#
122sub sendXML {
123 my ($self, $xml, $dest) = @_;
124
125 if ($self->type == XMLTRANSPORT_TYPE_MYSQL) {
126 say("XML Transport type: MySQL database connection");
127 $dest = XML_MYSQL_DEFAULT_DSN if not defined $dest;
128 return $self->mysql($xml, $dest);
129 } elsif ($self->type == XMLTRANSPORT_TYPE_SCP) {
130 say("XML Transport type: SCP");
131 $dest = $self->defaultScpDestination if not defined $dest;
132 return $self->scp($xml, $dest);
133 } else {
134 say("[ERROR] XML transport type '".$self->type."' not supported.");
135 return STATUS_ENVIRONMENT_FAILURE;
136 }
137
138
139
140}
141
142#
143# Sends the XML contents of file $xml to $dest.
144# If $dest is not defined, a default MySQL dsn will be used.
145#
146# TODO: - Support argument as string (real XML contents) instead of file name.
147# - Support non-default destination.
148#
149sub mysql() {
150 my ($self, $xml, $dest) = @_;
151
152 # TODO:
153 # 1. Establish dbh / connect
154 # 2. Execute query
155 # 3. Check for errors
156 # 4. Return appropriate status.
157 say("MySQL XML transport not implemented yet");
158 return STATUS_WONT_HANDLE;
159}
160
161#
162# Sends the file $xml by SCP (secure file copy) to $dest.
163#
164sub scp {
165 my ($self, $xml, $dest) = @_;
166
167 # For now, we assume $xml is a file name
168 # TODO: Support XML as string as well? Create temporary file?
169 my $xmlfile = $xml;
170
171 my $cmd;
172 if (windows()) {
173 $cmd = 'pscp.exe -q '.$xmlfile.' '.$dest;
174 } else {
175 $cmd = 'scp '.$xmlfile.' '.$dest;
176 }
177
178 say("SCP command is: ".$cmd);
179
180 # TODO: The scp command is interactive if keys and hosts are not set up.
181 # This may cause hangs in automated environments. Find a way to
182 # always run non-interactively, or kill the command after a timeout.
183 my $result == system($cmd);
184 if ($result != STATUS_OK) {
185 warn('XML Transport: scp failed. Command was: '.$cmd);
186 }
187
188 return $result >> 8;
189}
0190
=== modified file 'runall.pl'
--- runall.pl 2010-03-19 12:25:07 +0000
+++ runall.pl 2010-04-07 14:30:43 +0000
@@ -56,7 +56,8 @@
56 $engine, $help, $debug, $validators, $reporters, $grammar_file,56 $engine, $help, $debug, $validators, $reporters, $grammar_file,
57 $redefine_file, $seed, $mask, $mask_level, $mem, $rows,57 $redefine_file, $seed, $mask, $mask_level, $mem, $rows,
58 $varchar_len, $xml_output, $valgrind, $views, $start_dirty,58 $varchar_len, $xml_output, $valgrind, $views, $start_dirty,
59 $filter, $build_thread);59 $filter, $build_thread, $testname, $report_xml_tt, $report_xml_tt_type,
60 $report_xml_tt_dest);
6061
61my $threads = my $default_threads = 10;62my $threads = my $default_threads = 10;
62my $queries = my $default_queries = 1000;63my $queries = my $default_queries = 1000;
@@ -85,6 +86,9 @@
85 'debug' => \$debug,86 'debug' => \$debug,
86 'validators:s' => \$validators,87 'validators:s' => \$validators,
87 'reporters:s' => \$reporters,88 'reporters:s' => \$reporters,
89 'report-xml-tt' => \$report_xml_tt,
90 'report-xml-tt-type=s' => \$report_xml_tt_type,
91 'report-xml-tt-dest=s' => \$report_xml_tt_dest,
88 'gendata:s' => \$gendata,92 'gendata:s' => \$gendata,
89 'seed=s' => \$seed,93 'seed=s' => \$seed,
90 'mask=i' => \$mask,94 'mask=i' => \$mask,
@@ -97,7 +101,8 @@
97 'views' => \$views,101 'views' => \$views,
98 'start-dirty' => \$start_dirty,102 'start-dirty' => \$start_dirty,
99 'filter=s' => \$filter,103 'filter=s' => \$filter,
100 'mtr-build-thread=i' => \$build_thread104 'mtr-build-thread=i' => \$build_thread,
105 'testname=s' => \$testname
101);106);
102107
103if (!$opt_result || $help || $basedirs[0] eq '' || not defined $grammar_file) {108if (!$opt_result || $help || $basedirs[0] eq '' || not defined $grammar_file) {
@@ -333,9 +338,13 @@
333push @gentest_options, "--views" if defined $views;338push @gentest_options, "--views" if defined $views;
334push @gentest_options, "--varchar-length=$varchar_len" if defined $varchar_len;339push @gentest_options, "--varchar-length=$varchar_len" if defined $varchar_len;
335push @gentest_options, "--xml-output=$xml_output" if defined $xml_output;340push @gentest_options, "--xml-output=$xml_output" if defined $xml_output;
341push @gentest_options, "--report-xml-tt" if defined $report_xml_tt;
342push @gentest_options, "--report-xml-tt-type=$report_xml_tt_type" if defined $report_xml_tt_type;
343push @gentest_options, "--report-xml-tt-dest=$report_xml_tt_dest" if defined $report_xml_tt_dest;
336push @gentest_options, "--debug" if defined $debug;344push @gentest_options, "--debug" if defined $debug;
337push @gentest_options, "--filter=$filter" if defined $filter;345push @gentest_options, "--filter=$filter" if defined $filter;
338push @gentest_options, "--valgrind" if defined $valgrind;346push @gentest_options, "--valgrind" if defined $valgrind;
347push @gentest_options, "--testname=$testname" if defined $testname;
339348
340# Push the number of "worker" threads into the environment.349# Push the number of "worker" threads into the environment.
341# lib/GenTest/Generator/FromGrammar.pm will generate a corresponding grammar element.350# lib/GenTest/Generator/FromGrammar.pm will generate a corresponding grammar element.
@@ -443,7 +452,11 @@
443 --mask-level: Grammar mask level. Passed to gentest.pl452 --mask-level: Grammar mask level. Passed to gentest.pl
444 --rows : No of rows. Passed to gentest.pl453 --rows : No of rows. Passed to gentest.pl
445 --varchar-length: length of strings. passed to gentest.pl454 --varchar-length: length of strings. passed to gentest.pl
446 --xml-outputs: Passed to gentest.pl455 --xml-output: Passed to gentest.pl
456 --report-xml-tt: Passed to gentest.pl
457 --report-xml-tt-type: Passed to gentest.pl
458 --report-xml-tt-dest: Passed to gentest.pl
459 --testname : Name of test, used for reporting purposes.
447 --views : Generate views. Passed to gentest.pl460 --views : Generate views. Passed to gentest.pl
448 --valgrind : Passed to gentest.pl461 --valgrind : Passed to gentest.pl
449 --filter : Passed to gentest.pl462 --filter : Passed to gentest.pl