A re-worked version of the performance testing framework.

This commit is contained in:
j2blake 2011-12-14 22:01:35 +00:00
parent 031dc3e004
commit a009f582f3
52 changed files with 7017 additions and 0 deletions

View file

@ -0,0 +1,19 @@
The distros directory contains subdirectories, each with a VIVO distribution, as checked out from Subversion.
These can be read-only checkouts. Examples of such directories might be release1.3, release1.4, trunk, etc.
Each distro directory contains:
The vivo and vitro workspace areas, as checked out from Subversion
deploy_properties.template
This is a deploy properties file suitable for building the distrbution.
Some property values are placeholders that will be set when the _deploy script is run.
Examples of placeholders include:
Vitro.defaultNamespace = <%= @default_namespace %>
vitro.home.directory = /home/jeb228/LoadTesting/versions/<%= @version_name %>/data
This means that when _deploy is run, it must have values for the variables
@default_namespace and @version_name, which it will substitute into the template.
distro_properties.rb
A ruby source file which defines some values which apply to the distribution.
Currently, the only value is @test_suffix.
For example, release1.4 uses @test_suffix = "-1-4", so if we select "TestA",
the _runTest script will look for a file called TestA-1-4.jtl, and run that.

View file

@ -0,0 +1,163 @@
# -----------------------------------------------------------------------------
#
# VIVO deployment properties
#
# This file is provided as example.deploy.properties.
#
# Save a copy of this file as deploy.properties, and edit the properties as
# needed for your deployment.
#
# -----------------------------------------------------------------------------
#
# This namespace will be used when generating URIs for objects created in the
# editor. Change it to reflect your own domain. For example, Cornell's
# namespace is http://vivo.cornell.edu/individual/
#
# Note: it is essential that this namespace end with a trailing slash.
#
Vitro.defaultNamespace = <%= @default_namespace %>
#
# Where is the Vitro core directory?
# In most deployments, this is set to ./vitro-core (It is not uncommon for this
# setting to point elsewhere in development environments).
# Examples:
# vitro.core.dir = ./vitro-core
# vitro.core.dir = ../vitro
# vitro.core.dir = /usr/local/vitro/trunk
vitro.core.dir = ../vitro
#
# The base install directory for your Tomcat server. The VIVO application
# will be deployed in the /webapps directory below this base.
#
tomcat.home = /home/jeb228/LoadTesting/tomcat
#
# The name of the VIVO application. This will be used as the name of the
# subdirectory within your Tomcat server's /webapps directory. It also appears
# in the URL for the application. For example, http://my.vivo.server/vivo
#
webapp.name = vivo
#
# URL of Solr context used in local VIVO search. This will usually consist of:
# scheme + server_name + port + vivo_webapp_name + "solr"
# In the standard installation, the Solr context will be on the same server as VIVO,
# and in the same Tomcat instance. The path will be the VIVO webapp.name (specified
# above) + "solr"
# Example:
# vitro.local.solr.url = http://localhost:8080/vivosolr
vitro.local.solr.url = http://localhost:6080/vivosolr
#
# Restricts access to the Solr search platform. One or more regular expressions,
# separated by commas. When a request is made to Solr, the IP address of the
# requestor must match one of the patterns, or the request will be rejected.
# Examples:
# vitro.local.solr.ipaddress.mask = 127\.0\.0\.1
# vitro.local.solr.ipaddress.mask = 127\.0\.0\.1,0:0:0:0:0:0:0:1
# vitro.local.solr.ipaddress.mask = 169.254.*
vitro.local.solr.ipaddress.mask = 127\.0\.0\.1,0:0:0:0:0:0:0:1
#
# The location where the VIVO application will store the data that it creates.
# This includes uploaded files (usually images) and the search index.
#
vitro.home.directory = /home/jeb228/LoadTesting/versions/<%= @version_name %>/data
#
# SMTP host which the "Contact Us" form can use to send mail. If this is left
# empty, the "Contact Us" form will be disabled.
#
Vitro.smtpHost =
#
# The basic parameters for a database connection. Change the end of the
# URL to reflect your database name (if it is not "vitro"). Change the username
# and password to match the authorized database user you created. Increase the
# maximum size of the database connection pool if you need to serve a greater
# number of concurrent page requests.
#
VitroConnection.DataSource.url = jdbc:mysql://localhost/<%= @database_name %>
VitroConnection.DataSource.username = loadUser
VitroConnection.DataSource.password = loadPass
#
# The maximum number of active connections in the database connection pool.
# Increase this value to support a greater number of concurrent page requests
# with SDB. It is not necessary to adjust this value when using the
# RDB configuration.
#
VitroConnection.DataSource.pool.maxActive = 40
#
# The maximum number of database connections that will be allowed
# to remain idle in the connection pool. Default is 25%
# of the maximum number of active connections.
#
VitroConnection.DataSource.pool.maxIdle = 10
#
# Parameters to change in order to use VIVO with a database other than
# MySQL.
#
VitroConnection.DataSource.dbtype = MySQL
VitroConnection.DataSource.driver = com.mysql.jdbc.Driver
VitroConnection.DataSource.validationQuery = SELECT 1
#
# The email address of the root user for the VIVO application. The password
# for this user is initially set to "rootPassword", but you will be asked to
# change the password the first time you log in.
#
rootUser.emailAddress = <%= @root_user %>
#
# How is a logged-in user associated with a particular Individual? One way is
# for the Individual to have a property whose value is the username of the user.
# This value should be the URI for that property.
#
selfEditing.idMatchingProperty = http://vivoweb.org/ontology/core#scopusId
#
# If an external authentication system like Shibboleth or CUWebAuth is to be
# used, these properties say how the login button should be labeled, and which
# HTTP header will contain the user ID from the authentication system. If such
# a system is not to be used, leave these commented out. Consult the
# installation instructions for more details.
#
#externalAuth.buttonText = Log in using BearCat Shibboleth
#externalAuth.netIdHeaderName = remote_userID
#
# The temporal graph visualization can require extensive machine resources.
# This can have a particularly noticable impact on memory usage if
# - VIVO is configured to use Jena SDB,
# - The organization tree is deep,
# - The number of grants and publications is large.
# VIVO release 1.2 guards against this impact by disabling the temporal graph
# visualization unless the "visualization.temporal" flag is set to "enabled".
#
# visualization.temporal = enabled
#
# The temporal graph visualization is used to compare different organizations/people
# within an organization on parameters like number of publications or grants.
# By default, the app will attempt to make its best guess at the top level
# organization in your instance. If you're unhappy with this selection, uncomment out
# the property below and set it to the URI of the organization individual you want to
# identify as the top level organization. It will be used as the default whenever the
# temporal graph visualization is rendered without being passed an explicit org.
# For example, to use "Ponce School of Medicine" as the top organization:
# visualization.topLevelOrg = http://vivo.psm.edu/individual/n2862
#
# visualization.topLevelOrg = http://vivo.mydomain.edu/individual/topLevelOrgURI
#
# Default type(s) for Google Refine Reconciliation Service
# The format for this property is id, name; id1, name1; id2, name2 etc.
# See Service Metadata from this page http://code.google.com/p/google-refine/wiki/ReconciliationServiceApi
# for more information.
Vitro.reconcile.defaultTypeList = http://vivoweb.org/ontology/core#Course, Course; http://vivoweb.org/ontology/core#Grant, Grant; http://aims.fao.org/aos/geopolitical.owl, Location; http://xmlns.com/foaf/0.1/Organization, Organization; http://xmlns.com/foaf/0.1/Person, Person; http://purl.org/ontology/bibo/Article, Publication

View file

@ -0,0 +1,2 @@
# properties for this distribution
@test_suffix = '-1-3'

View file

@ -0,0 +1,179 @@
# -----------------------------------------------------------------------------
#
# VIVO deployment properties
#
# This file is provided as example.deploy.properties.
#
# Save a copy of this file as deploy.properties, and edit the properties as
# needed for your deployment.
#
# -----------------------------------------------------------------------------
#
# This namespace will be used when generating URIs for objects created in the
# editor. In order to serve linked data, the default namespace must be composed
# as follows (optional elements in parentheses):
#
# scheme + server_name (+ port) (+ servlet_context) + "/individual/"
#
# For example, Cornell's default namespace is:
#
# http://vivo.cornell.edu/individual/
#
Vitro.defaultNamespace = <%= @default_namespace %>
#
# Where is the Vitro core directory?
# In most deployments, this is set to ./vitro-core (It is not uncommon for this
# setting to point elsewhere in development environments).
# Examples:
# vitro.core.dir = ./vitro-core
# vitro.core.dir = ../vitro
# vitro.core.dir = /usr/local/vitro/trunk
vitro.core.dir = ../vitro
#
# The base install directory for your Tomcat server. The VIVO application
# will be deployed in the /webapps directory below this base.
#
tomcat.home = /home/jeb228/LoadTesting/tomcat
#
# The name of the VIVO application. This will be used as the name of the
# subdirectory within your Tomcat server's /webapps directory. It also appears
# in the URL for the application. For example, http://my.vivo.server/vivo
#
webapp.name = vivo
#
# URL of Solr context used in local VIVO search. This will usually consist of:
# scheme + server_name + port + vivo_webapp_name + "solr"
# In the standard installation, the Solr context will be on the same server as VIVO,
# and in the same Tomcat instance. The path will be the VIVO webapp.name (specified
# above) + "solr"
# Example:
# vitro.local.solr.url = http://localhost:8080/vivosolr
vitro.local.solr.url = http://localhost:6080/vivosolr
#
# Restricts access to the Solr search platform. One or more regular expressions,
# separated by commas. When a request is made to Solr, the IP address of the
# requestor must match one of the patterns, or the request will be rejected.
# Examples:
# vitro.local.solr.ipaddress.mask = 127\.0\.0\.1
# vitro.local.solr.ipaddress.mask = 127\.0\.0\.1,0:0:0:0:0:0:0:1
# vitro.local.solr.ipaddress.mask = 169.254.*
# If this expression doesn't match the IP address, you will see SolrExceptions
# in the log.
vitro.local.solr.ipaddress.mask = 127\.0\.0\.1,[0:]+:1[^:]*,
#
# The location where the VIVO application will store the data that it creates.
# This includes uploaded files (usually images) and the search index.
#
vitro.home.directory = /home/jeb228/LoadTesting/versions/<%= @version_name %>/data
#
# Email parameters which VIVO can use to send mail. If these are left empty,
# the "Contact Us" form will be disabled and users will not be notified of
# changes to their accounts.
#
email.smtpHost =
email.replyTo = vivoAdmin@mydomain.edu
#
# The basic parameters for a database connection. Change the end of the
# URL to reflect your database name (if it is not "vitrodb"). Change the username
# and password to match the authorized database user you created.
#
VitroConnection.DataSource.url = jdbc:mysql://localhost/<%= @database_name %>
VitroConnection.DataSource.username = loadUser
VitroConnection.DataSource.password = loadPass
#
# The maximum number of active connections in the database connection pool.
# Increase this value to support a greater number of concurrent page requests.
#
VitroConnection.DataSource.pool.maxActive = 40
#
# The maximum number of database connections that will be allowed
# to remain idle in the connection pool. Default is 25%
# of the maximum number of active connections.
#
VitroConnection.DataSource.pool.maxIdle = 10
#
# Parameters to change in order to use VIVO with a database other than
# MySQL.
#
VitroConnection.DataSource.dbtype = MySQL
VitroConnection.DataSource.driver = com.mysql.jdbc.Driver
VitroConnection.DataSource.validationQuery = SELECT 1
#
# The email address of the root user for the VIVO application. The password
# for this user is initially set to "rootPassword", but you will be asked to
# change the password the first time you log in.
#
rootUser.emailAddress = <%= @root_user %>
#
# How is a logged-in user associated with a particular Individual? One way is
# for the Individual to have a property whose value is the username of the user.
# This value should be the URI for that property.
#
selfEditing.idMatchingProperty = http://vivoweb.org/ontology/core#scopusId
#
# If an external authentication system like Shibboleth or CUWebAuth is to be
# used, these properties say how the login button should be labeled, and which
# HTTP header will contain the user ID from the authentication system. If such
# a system is not to be used, leave these commented out. Consult the
# installation instructions for more details.
#
#externalAuth.buttonText = Log in using BearCat Shibboleth
#externalAuth.netIdHeaderName = remote_userID
#
# The temporal graph visualization can require extensive machine resources.
# This can have a particularly noticeable impact on memory usage if
# - The organization tree is deep,
# - The number of grants and publications is large.
# VIVO 1.3 release mitigates this problem by the way of a caching mechanism &
# hence we can safely set this to be enabled by default.
#
visualization.temporal = enabled
#
# The temporal graph visualization is used to compare different organizations/people
# within an organization on parameters like number of publications or grants.
# By default, the app will attempt to make its best guess at the top level
# organization in your instance. If you're unhappy with this selection, uncomment out
# the property below and set it to the URI of the organization individual you want to
# identify as the top level organization. It will be used as the default whenever the
# temporal graph visualization is rendered without being passed an explicit org.
# For example, to use "Ponce School of Medicine" as the top organization:
# visualization.topLevelOrg = http://vivo.psm.edu/individual/n2862
#
# visualization.topLevelOrg = http://vivo.mydomain.edu/individual/topLevelOrgURI
#
# Absolute path on the server of the Harvester root directory.
# You must include the final slash.
# Setting a value for harvester.location indicates that the Harvester is installed at
# this path. This will enable the Harvester functions in the Ingest Tools page.
#
# harvester.location = /usr/local/vivo/harvester/
#
# Default type(s) for Google Refine Reconciliation Service
# The format for this property is id, name; id1, name1; id2, name2 etc.
# See Service Metadata from this page http://code.google.com/p/google-refine/wiki/ReconciliationServiceApi
# for more information.
Vitro.reconcile.defaultTypeList = http://vivoweb.org/ontology/core#Role, core:Role; http://vivoweb.org/ontology/core#AcademicDegree, core:Academic Degree; http://purl.org/NET/c4dm/event.owl#Event, event:Event; http://vivoweb.org/ontology/core#Agreement, core:Agreement; http://vivoweb.org/ontology/core#Location, core:Location; http://xmlns.com/foaf/0.1/Organization, foaf:Organization; http://xmlns.com/foaf/0.1/Person, foaf:Person; http://vivoweb.org/ontology/core#InformationResource, core:Information Resource
#
# Types of individual for which we can create proxy editors.
# If this is omitted, defaults to http://www.w3.org/2002/07/owl#Thing
proxy.eligibleTypeList = http://xmlns.com/foaf/0.1/Person, http://xmlns.com/foaf/0.1/Organization

View file

@ -0,0 +1,2 @@
# properties for this distribution
@test_suffix = '-1-4'

View file

@ -0,0 +1,6 @@
Contains a distribution of JMeter. The _runTest script looks here to find
the executable of JMeter, and also to find the XSL stylesheet used to convert *.jtl files to *.html files.
Currently, we're using JMeter 2.4, so the directory contains jakarta-jmeter-2.4.zip and
an unpacked version in the directory jakarta-jmeter-2.4

Binary file not shown.

View file

@ -0,0 +1,16 @@
Contains all sorts of data that is particular to each site.
MySQL dumps.
The ones we got from the drop box, and anything that we derived from them
that was worth capturing instead of rebuilding.
Zip of upload directory
Either obtained from the drop box, or what we created using UploadImageFaker
CSV files containing test data
We create CSV files that contina URIs of Persons, InfoResources, and Authors.
The tests use these files when deciding which pages to fetch. These are site
dependent.
Also contains the _patches_and_queries directory, which contains its own readme file.

View file

@ -0,0 +1,19 @@
Contains:
Patches - used to modify the model to make it ready for testing.
userAccountsPatch.n3
Ingest this into the user-accounts model. It contains RDF for testAdmin@mydomain.edu
and selfEditor@mydomain.edu. Each has logged in previously, and each has the
password of "Password".
Queries - used to extract data from the model, for the tests to use.
get_info_resource_uris.sparql
Execute this SPARQL query and get the results in CSV. Remove any
URIs that are not in the default namespace, and then remove the default namespace
from each remaining URI. save as infoResourceUris.csv in the
modelData/[sitename] directory.
get_person_uris.sparql
Like the previous, but saved as personUris.csv
image_file_query.sparql
Save the results without alteration as modelData/[sitename]/imageFileInfo.csv, to
be processed by the _fakeUploadedFiles script.

View file

@ -0,0 +1,9 @@
PREFIX core: <http://vivoweb.org/ontology/core#>
SELECT ?uri
WHERE
{
?uri a core:InformationResource .
}
limit 300

View file

@ -0,0 +1,9 @@
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX core: <http://vivoweb.org/ontology/core#>
SELECT ?uri
WHERE
{
?uri a foaf:Person ;
}
limit 300

View file

@ -0,0 +1,17 @@
#
# Run this sparql query and format the output as CSV to find a list of
# everywhere that VIVO expects to find an image file.
#
# Process the result file with ????? to insert dummy images in all of
# those locations.
#
PREFIX p.1: <http://vitro.mannlib.cornell.edu/ns/vitro/public#>
SELECT ?bytestreamUri ?filename
WHERE
{
?fileUri p.1:downloadLocation ?bytestreamUri;
p.1:filename ?filename.
}

View file

@ -0,0 +1,50 @@
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<http://vivo.scripps.edu/individual/uSelf>
a <http://vitro.mannlib.cornell.edu/ns/vitro/authorization#UserAccount> ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#emailAddress>
"selfEditor@mydomain.edu"^^xsd:string ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#externalAuthId>
"seditor"^^xsd:string ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#firstName>
"self"^^xsd:string ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#hasPermissionSet>
<http://permissionSet-1> ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#lastLoginTime>
"1322673007960"^^xsd:long ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#lastName>
"editor"^^xsd:string ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#loginCount>
"2"^^xsd:int ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#md5password>
"DC647EB65E6711E155375218212B3964"^^xsd:string ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#passwordLinkExpires>
"0"^^xsd:long ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#status>
"ACTIVE"^^xsd:string .
<http://vivo.scripps.edu/individual/uAdmin>
a <http://vitro.mannlib.cornell.edu/ns/vitro/authorization#UserAccount> ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#emailAddress>
"testAdmin@mydomain.edu"^^xsd:string ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#externalAuthId>
"tadmin"^^xsd:string ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#firstName>
"test"^^xsd:string ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#hasPermissionSet>
<http://permissionSet-50> ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#lastLoginTime>
"1322673030151"^^xsd:long ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#lastName>
"admin"^^xsd:string ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#loginCount>
"3"^^xsd:int ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#md5password>
"DC647EB65E6711E155375218212B3964"^^xsd:string ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#passwordLinkExpires>
"0"^^xsd:long ;
<http://vitro.mannlib.cornell.edu/ns/vitro/authorization#status>
"ACTIVE"^^xsd:string .

View file

@ -0,0 +1,35 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Copy the Tomcat logs into a time-stamped directory in the current "version"
directory, for possible inspection later.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
require 'date'
require "#{File.dirname(__FILE__)}/subscripts/loadParms"
def figure_time_stamp()
return DateTime.now.strftime("%Y-%m-%d_%H-%M-%S")
end
Dir.chdir("/home/jeb228/LoadTesting/versions/#{@version_name}") do |path|
@tomcat_logs_dir = "#{path}/tomcatLogs"
if (! File.directory?(@tomcat_logs_dir))
Dir.mkdir(@tomcat_logs_dir)
end
end
Dir.chdir(@tomcat_logs_dir) do |path|
@this_logs_dir = "#{path}/#{figure_time_stamp()}"
Dir.mkdir(@this_logs_dir)
end
Dir.chdir(@this_logs_dir) do |path|
system('cp ~/LoadTesting/tomcat/logs/* .')
end

View file

@ -0,0 +1,13 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
See whether our Tomcat is running (not the Tomcat that runs the national index).
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
puts system("ps -ef | grep tomcat | grep -v usr/local/tomcat")

View file

@ -0,0 +1,12 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Remove any Tomcat logs.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
puts system("rm ~/LoadTesting/tomcat/logs/*")

View file

@ -0,0 +1,39 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Build and deploy the currently selected version of VIVO.
Remove vivo from Tomcat, so we know we start with clean slate.
Create the deploy.properties file by substituting current values into the
template. Then run the build script.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
require "#{File.dirname(__FILE__)}/subscripts/loadParms"
require 'erb'
def build_deploy_properties
File.open(@deploy_properties_source) do |source_file|
File.open(@deploy_properties_target, 'w') do |target_file|
raw = source_file.read()
cooked = ERB.new(raw).result
target_file.write(cooked)
end
end
end
puts system("rm -r ~/LoadTesting/tomcat/webapps/vivo*")
puts system("rm -r ~/LoadTesting/tomcat/conf/Catalina/localhost/vivo*")
@deploy_properties_source = "/home/jeb228/LoadTesting/distros/#{@distro_name}/deploy.properties.template"
@deploy_properties_target = "/home/jeb228/LoadTesting/distros/#{@distro_name}/vivo/deploy.properties"
build_deploy_properties()
Dir.chdir("/home/jeb228/LoadTesting/distros/#{@distro_name}/vivo") do |path|
system "ant clean deploy"
end

View file

@ -0,0 +1,36 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Look through the uploads directory in the currently selected version, and insure
that an image file exists wherever the data model expects one.
This requires an imageFileInfo.csv, which was produced by a SPARQL query against
the data model.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
require "#{File.dirname(__FILE__)}/subscripts/loadParms"
require "#{File.dirname(__FILE__)}/subscripts/upload_file_faker"
properties = {}
properties["uploads_directory"] = "/home/jeb228/LoadTesting/versions/#{@version_name}/data/uploads"
properties["file_info_file"] = "/home/jeb228/LoadTesting/modelData/#{@site_name}/imageFileInfo.csv"
properties["template_file"] = "#{File.dirname(__FILE__)}/subscripts/dummy_image_file.jpg"
if ARGV.length == 1 && ARGV[0] == "doit"
properties["scan_only"] = "false"
else
puts "Just scanning unless you say: \"doit\""
properties["scan_only"] = "true"
end
uff = UploadFileFaker.new(properties)
uff.process
puts "UploadFileFaker was successful."

View file

@ -0,0 +1,12 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
View the VIVO log in Tomcat.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
puts system("less ~/LoadTesting/tomcat/logs/vivo.all.log")

View file

@ -0,0 +1,42 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Look through the test results for the currently-selected version, and merge them
into an HTML file so we can easily compare them.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
require "#{File.dirname(__FILE__)}/subscripts/loadParms"
require "#{File.dirname(__FILE__)}/subscripts/test_result_merger"
properties = {}
source_dir = "/home/jeb228/LoadTesting/testinfo/results/#{@site_name}"
properties["source_directory"] = source_dir
properties["target_directory"] = "/var/www/html/loadTesting/"
properties["site_name"] = "#{@site_name}"
suggestions = []
if File.directory?(source_dir)
Dir.chdir(source_dir) do |dir|
if File.file?("fileOrderSuggestions.txt")
File.open("fileOrderSuggestions.txt") do |f|
f.each_line() do |line|
suggestions.push(line.strip())
end
end
end
end
end
properties["file_order_suggestions"] = suggestions
trm = TestResultMerger.new(properties)
trm.merge
puts "TestResultMerger was successful."

View file

@ -0,0 +1,96 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Try to connect to the webapp. If we can't connect, then give up.
Run the JMeter test with appropriate parameters.
Use XSL to create an HTML version of the results.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
require "#{File.dirname(__FILE__)}/subscripts/loadParms"
def locate_files()
test_full_name = "#{@test_name}#{@test_suffix}"
test_source_dir = "/home/jeb228/LoadTesting/testinfo/tests/#{@test_name}"
@test_jmx_file = "#{test_source_dir}/#{test_full_name}.jmx"
raise "Test file doesn't exist: '#{@test_jmx_file}'." unless File.file?(@test_jmx_file)
result_dir = "/home/jeb228/LoadTesting/testinfo/results/#{@site_name}"
Dir.mkdir(result_dir) unless File.directory?(result_dir)
@test_jtl_file = "#{result_dir}/#{test_full_name}.jtl"
File.delete(@test_jtl_file) if File.file?(@test_jtl_file)
@test_log_file = "#{result_dir}/#{test_full_name}.log"
File.delete(@test_log_file) if File.file?(@test_log_file)
@test_html_file = "#{result_dir}/#{test_full_name}.html"
File.delete(@test_html_file) if File.file?(@test_html_file)
data_dir = "/home/jeb228/LoadTesting/modelData/#{@site_name}"
@person_uris_file = "#{data_dir}/personUris.csv"
raise "Person URIs file doesn't exist: '#{@person_uris_file}'" unless File.file?(@person_uris_file)
@infoResource_uris_file = "#{data_dir}/infoResourceUris.csv"
raise "InfoResource URIs file doesn't exist: '#{@infoResource_uris_file}'" unless File.file?(@infoResource_uris_file)
@author_uris_file = "#{data_dir}/authorUris.csv"
raise "Author URIs file doesn't exist: '#{@author_uris_file}'" unless File.file?(@author_uris_file)
@xsl_stylesheet_file = "/home/jeb228/LoadTesting/jmeter/jakarta-jmeter-2.4/extras/jmeter-results-report_21.xsl"
end
def prepare_jmeter_properties()
props = {}
# set parameters for the tests
props["webapp.host"] = "localhost"
props["webapp.port"] = "6080"
props["webapp.name"] = "vivo"
props["iterations"] = @test_iterations
props["threads"] = @test_threads
props["file.person.uris"] = @person_uris_file
props["file.infoResource.uris"] = @infoResource_uris_file
props["file.author.uris"] = @author_uris_file
props["default.namespace"] = @default_namespace
# set parameters for the output
props["jmeter.save.saveservice.output_format"] = "xml"
props["jmeter.save.saveservice.response_data.on_error"] = "true"
props["jmeter.save.saveservice.url"] = "true"
props["jmeter.save.saveservice.bytes"] = "true"
# show a summary line periodically, so we know it's running. -->
props["summariser.name"] = "summary"
props["summariser.out"] = "true"
props["summariser.log"] = "true"
props["summariser.interval"] = "10"
@jmeter_properties = ""
props.each() do |key, value|
@jmeter_properties << "-J#{key}=#{value} "
end
end
def test_the_webapp()
puts "BOGUS test_the_webapp()"
end
locate_files()
prepare_jmeter_properties()
test_the_webapp()
Dir.chdir("/home/jeb228/LoadTesting/jmeter/jakarta-jmeter-2.4/bin") do |path|
puts "RUNNING TESTS"
system "./jmeter -n -t #{@test_jmx_file} -l #{@test_jtl_file} -j #{@test_log_file} #{@jmeter_properties}"
puts "CONVERTING TO HTML"
system "xsltproc -o #{@test_html_file} #{@xsl_stylesheet_file} #{@test_jtl_file}"
end

View file

@ -0,0 +1,58 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Select the name of the test that we will be running, based on the directories
in testinfo/tests directory.
Record that selection, along with the desired number of iterations and threads.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
@test_parms_file = "#{File.dirname(__FILE__)}/subscripts/_current_test.rb"
# Find out what tests we have available
def build_test_list()
@test_names = []
Dir.foreach("/home/jeb228/LoadTesting/testinfo/tests") do |filename|
@test_names.push(filename) unless filename[0,1] == "."
end
@test_names.sort!
raise "Found no test directories." if @test_names.length == 0
end
# Write the current version to the file
def write_current_test(name, threads, iterations)
File.open(@test_parms_file, "w") do |file|
file.puts "# what is the current test, and how many times will it run?"
file.puts "@test_name = '#{name}'"
file.puts "@test_threads = '#{threads}'"
file.puts "@test_iterations = '#{iterations}'"
end
puts "test set to #{name}, #{threads} threads, #{iterations} iterations."
end
#
# ---------------------------------------------------------
# MAIN ROUTINE
# ---------------------------------------------------------
#
build_test_list()
puts "Enter test number: "
@test_names.each_index do |index|
puts " #{index+1} = #{@test_names[index]}"
end
number = STDIN.gets.chomp.to_i
if number <= 0 || number > @test_names.length
puts "UNRECOGNIZED TEST."
exit
end
write_current_test(@test_names[number - 1], 1, 1)

View file

@ -0,0 +1,54 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Choose a version from among the subdirectories in the versions directory and
record that choice.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
@version_parms_file = "#{File.dirname(__FILE__)}/subscripts/_current_version.rb"
# Find out what versions we have available
def build_version_list()
@version_names = []
Dir.foreach("/home/jeb228/LoadTesting/versions") do |filename|
@version_names.push(filename) unless (filename[0,1] == "_") || (filename[0,1] == ".")
end
@version_names.sort!
raise "Found no version directories." unless @version_names.length > 0
end
# Write the current version to the file
def write_current_version(name)
File.open(@version_parms_file, "w") do |file|
file.puts "# what is the current version under test?"
file.puts "@version_name = '#{name}'"
end
puts "version set to #{name}"
end
#
# ---------------------------------------------------------
# MAIN ROUTINE
# ---------------------------------------------------------
#
build_version_list()
puts "Enter version number: "
@version_names.each_index do |index|
puts " #{index+1} = #{@version_names[index]}"
end
number = STDIN.gets.chomp.to_i
if number <= 0 || number > @version_names.length
puts "UNRECOGNIZED VERSION."
exit
end
write_current_version(@version_names[number - 1])

View file

@ -0,0 +1,12 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Duh
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
puts system("~/LoadTesting/tomcat/bin/startup.sh")

View file

@ -0,0 +1,20 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Show the SVN status of the currently-selected distro, both VIVO and Vitro.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
require "#{File.dirname(__FILE__)}/subscripts/loadParms"
Dir.chdir("/home/jeb228/LoadTesting/distros/#{@distro_name}/vitro") do |path|
system "svn status -u"
end
Dir.chdir("/home/jeb228/LoadTesting/distros/#{@distro_name}/vivo") do |path|
system "svn status -u"
end

View file

@ -0,0 +1,13 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Duh
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
puts system("~/LoadTesting/tomcat/bin/shutdown.sh")

View file

@ -0,0 +1,12 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Start following the tails of all of the logs in Tomcat.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
puts system("tail -f ~/LoadTesting/tomcat/logs/*")

View file

@ -0,0 +1,21 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Use SVN to get the latest revisions to the currently-selected distro.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
require "#{File.dirname(__FILE__)}/subscripts/loadParms"
Dir.chdir("/home/jeb228/LoadTesting/distros/#{@distro_name}/vitro") do |path|
system "svn update"
end
Dir.chdir("/home/jeb228/LoadTesting/distros/#{@distro_name}/vivo") do |path|
system "svn update"
end

View file

@ -0,0 +1,15 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
What is the currently-selected test?
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
require "#{File.dirname(__FILE__)}/subscripts/loadParms"
puts "Current test is #{@test_name}, #{@test_threads} threads, #{@test_iterations} iterations"

View file

@ -0,0 +1,15 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
What is the currently-selected version?
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
require "#{File.dirname(__FILE__)}/subscripts/loadParms"
puts "Current version is #{@version_name}"

View file

@ -0,0 +1,4 @@
# what is the current test, and how many times will it run?
@test_name = 'SimpleTests'
@test_threads = '1'
@test_iterations = '40'

View file

@ -0,0 +1,2 @@
# what is the current version under test?
@version_name = 'cornell1.4'

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View file

@ -0,0 +1,6 @@
require "#{File.dirname(__FILE__)}/_current_version"
require "#{File.dirname(__FILE__)}/_current_test"
require "/home/jeb228/LoadTesting/versions/#{@version_name}/version_properties"
require "/home/jeb228/LoadTesting/distros/#{@distro_name}/distro_properties"
require "/home/jeb228/LoadTesting/sites/#{@site_name}/site_properties"

View file

@ -0,0 +1,39 @@
=begin
--------------------------------------------------------------------------------
A utility class that reads a properties file and returns a hash containing the
properties.
--------------------------------------------------------------------------------
=end
class PropertyFileReader
# Read a properties file and return a hash.
#
# Parameters: the path to the properties file
#
# The hash includes the special property "properties_file_path", which holds
# the path to the properties file.
#
def self.read(file_path)
properties = {}
properties["properties_file_path"] = File.expand_path(file_path)
File.open(file_path) do |file|
file.each_line do |line|
line.strip!
if line.length == 0 || line[0] == ?# || line[0] == ?!
# ignore blank lines, and lines starting with '#' or '!'.
elsif line =~ /(.*?)\s*[=:]\s*(.*)/
# key and value are separated by '=' or ':' and optional whitespace.
properties[$1.strip] = $2
else
# No '=' or ':' means that the value is empty.
properties[line] = ''
end
end
end
return properties
end
end

View file

@ -0,0 +1,102 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Parse a file of JMeter test results (*./jtl), summarize the times for each test,
and make the summaries easily available.
--------------------------------------------------------------------------------
=end
require "rexml/document"
include REXML
# ------------------------------------------------------------------------------------
# TestResultSummary class
# ------------------------------------------------------------------------------------
class TestResultSummary
attr_reader :label
attr_reader :how_many
attr_reader :failures
attr_reader :min_time
attr_reader :max_time
attr_reader :avg_time
def addResult(result_element)
@how_many += 1
@failures += 1 unless result_element.attributes["s"] == "true"
time = result_element.attributes["t"].to_i
@total_time += time
@min_time = [@min_time, time].min
@max_time = [@max_time, time].max
@avg_time = @total_time / how_many
end
def initialize(result_element)
@label = result_element.attributes["lb"]
@how_many = 0
@failures = 0
@min_time = 100000000
@max_time = 0
@total_time = 0
addResult(result_element)
end
end
# ------------------------------------------------------------------------------------
# TestResultFile class
# ------------------------------------------------------------------------------------
class TestResultFile
attr_reader :filename
attr_reader :timestamp
attr_reader :summaries
attr_reader :version
def parse_result_file()
@summaries = {}
@version = "_"
file = File.new( @file_path )
doc = Document.new file
XPath.each(doc, "/testResults/httpSample") do | result |
test_label = result.attributes["lb"]
if @summaries[test_label] == nil
@summaries[test_label] = TestResultSummary.new(result)
else
@summaries[test_label].addResult(result)
end
end
XPath.each(doc, "version") do | version |
@version = version.attributes["name"]
end
end
def initialize(filename, source_directory)
raise("filename must not be nil") if filename == nil
raise("source_directory must not be nil") if source_directory == nil
@filename = filename
@source_directory = source_directory
if !File.directory?(@source_directory)
raise "Directory does not exist: '#{@source_directory}'."
end
@file_path = File.expand_path(filename + ".jtl", @source_directory)
if !File.file?(@file_path)
raise "File doesn't exist: '#{@file_path}'."
end
@timestamp = File.mtime(@file_path)
parse_result_file()
end
end

View file

@ -0,0 +1,161 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Parse a file of JMeter test results (*./jtl), summarize the times for each test,
and make the summaries easily available.
--------------------------------------------------------------------------------
=end
# ------------------------------------------------------------------------------------
# TestResultMarshaller class
# ------------------------------------------------------------------------------------
class TestResultMarshaller
def marshall()
File.open(@output_filename, 'w') do | out |
write_html_header(out)
write_table_header(out)
write_table_lines(out)
write_table_footer(out)
write_html_footer(out)
end
end
def write_html_header(out)
out.puts <<"EOF"
<html>
<head>
<link REL='STYLESHEET' TYPE='text/css' HREF='./mergedResults.css'>
<title>Performance tests for #{@site_name}</title>
</head>
<body>
EOF
end
def write_table_header(out)
top_cells = ['<th>&nbsp</th>']
@test_results.each do | test |
top_cells.push("<th colspan='3'>#{test.version}<br/>#{test.filename}<br/>#{test.timestamp.strftime('%Y-%m-%d %H:%M:%S')}</th>")
end
bottom_cells = ['<th>Test Name</th>']
@test_results.each do | test |
bottom_cells.push('<th>Iterations</th>')
bottom_cells.push('<th>time<br/>(min/max)</th>')
bottom_cells.push("<th>compare</th>")
end
out.puts <<"EOF"
<table class='testData' cellspacing='0'>
<tr>
#{top_cells.join("\n ")}
</tr>
<tr>
#{bottom_cells.join("\n ")}
</tr>
EOF
end
def write_table_lines(out)
all_test_names().each do | test_name |
out.puts <<"EOF"
<tr>
<td class='left'>#{test_name}</td>
#{format_test_results(test_name)}
</tr>
EOF
end
end
def all_test_names
names = []
@test_results.each do | test |
names.concat(test.summaries.keys)
end
names.uniq.sort
end
def format_test_results(test_name)
results = []
@test_results.each do | test |
results.push(format_test_result(test_name, test))
end
results.join("\n ")
end
def format_test_result(test_name, test)
s = test.summaries[test_name]
if s
<<"EOF"
<td class='open'>#{s.how_many}</td>
<td>
<table class='oneResult close' cellspacing='0'>
<tr>
<td rowspan='2'>#{format_millis(s.avg_time)}</td>
<td class='minmax'>#{format_millis(s.min_time)}</td>
</tr>
<tr>
<td class='minmax'>#{format_millis(s.max_time)}</td>
</tr>
</table>
</td>
<td>#{performance_ratio(test_name, s.avg_time)}</td>
EOF
else
<<"EOF"
<td class='open'>&nbsp;</td>
<td>
<table class='oneResult close' cellspacing='0'>
<tr>
<td rowspan='2'>&nbsp;</td>
<td class='minmax'>&nbsp;</td>
</tr>
<tr>
<td class='minmax'>&nbsp;</td>
</tr>
</table>
</td>
<td>&nbsp;</td>
EOF
end
end
def format_millis(millis)
"%.3f" % [millis.to_f / 1000]
end
def performance_ratio(test_name, time)
return "&nbsp;" if @test_results.empty?
return "&nbsp;" unless @test_results[0].summaries.key?(test_name)
s = @test_results[0].summaries[test_name]
reference = s.avg_time
return "&nbsp;" if reference == 0
return "#{"%.0f" % [time * 100 / reference]}%"
end
def write_table_footer(out)
out.puts "</table>"
end
def write_html_footer(out)
out.puts <<"EOF"
</body>
</html>
EOF
end
def initialize(target_directory, site_name, test_results)
@target_directory = target_directory
@site_name = site_name
@test_results = test_results
filename = "#{site_name}-merged_#{Time.now.strftime('%Y-%m-%d_%H-%M-%S')}"
@output_filename = File.expand_path(filename, @target_directory)
end
end

View file

@ -0,0 +1,96 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Look through a directory of test results files (*.jtl), and produce an HTML file
that summarizes, merges, and compares the information.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
$: << File.dirname(File.expand_path(__FILE__))
require 'test_result_file'
require 'test_result_marshaller'
# ------------------------------------------------------------------------------------
# TestResultMerger class
# ------------------------------------------------------------------------------------
class TestResultMerger
#
# Do we have any chance of succeeding with these properties?
#
def sanity_checks_on_properties()
raise("Properties must contain a value for 'source_directory'") if @source_directory == nil
raise("Properties must contain a value for 'target_directory'") if @target_directory == nil
raise("Properties must contain a value for 'site_name'") if @site_name == nil
if !File.directory?(@source_directory)
raise "Not a directory: '#{@source_directory}'."
end
if !File.directory?(@target_directory)
raise "Not a directory: '#{@target_directory}'."
end
end
def parse_files()
test_result_files = build_file_list()
@test_results = []
test_result_files.each() do | test_result_file |
puts "Parsing #{test_result_file}"
@test_results.push(TestResultFile.new(test_result_file, @source_directory))
end
end
def build_file_list
existing_files = []
Dir.foreach(@source_directory) do | filename |
next unless File.extname(filename) == ".jtl"
existing_files.push(File.basename(filename, ".jtl"))
end
puts "BOGUS existing files = [#{existing_files.join(', ')}]"
file_list = []
@file_order_suggestions.each() do | suggestion|
if existing_files.include?(suggestion)
file_list.push(suggestion)
existing_files.delete(suggestion)
end
end
file_list.concat(existing_files)
puts "BOGUS file list = [#{file_list.join(', ')}]"
return file_list
end
def marshall()
marshaller = TestResultMarshaller.new(@target_directory, @site_name, @test_results)
marshaller.marshall()
end
def initialize(properties)
@source_directory = properties['source_directory']
@target_directory = properties['target_directory']
@site_name = properties['site_name']
@file_order_suggestions = properties['file_order_suggestions']
puts "source_directory = #{@source_directory}"
puts "target_directory = #{@target_directory}"
puts "site_name = #{@site_name}"
if (@file_order_suggestions == nil)
puts "file_order_suggestions = nil"
else
puts "file_order_suggestions = [#{@file_order_suggestions.join(', ')}]"
end
sanity_checks_on_properties
end
def merge()
parse_files()
marshall()
end
end

View file

@ -0,0 +1,246 @@
#! /usr/bin/ruby
=begin
--------------------------------------------------------------------------------
Take a file that MySQL produced listing the URIs and filenames of all expected
upload files. Scan through the uploads directory, creating such files wherever
they are needed.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
=end
$: << File.dirname(File.expand_path(__FILE__))
require 'date'
require 'fileutils'
require 'property_file_reader'
# ------------------------------------------------------------------------------------
# FileInfoFile class
# ------------------------------------------------------------------------------------
class FileInfoFile
attr_reader :default_namespace
attr_reader :data
def parse_info_line(line)
# Lines are in this form: "URI","filename"
match = line.match(/^"([^"]*)","([^"]*)"$/)
raise "Can't parse this line: '#{line}'" if !match
return match.captures[0], match.captures[1]
end
def parse_default_namespace(uri)
match = /^(.*)individual/.match(uri)
raise "Can't find default namespace: '#{uri}'" if match == nil
"#{match.captures[0]}individual/"
end
public
def initialize(filepath)
@data = []
File.open(filepath) do |f|
f.each() do |line|
@data.push(parse_info_line(line))
end
end
puts "parsed #{@data.length} lines."
@default_namespace = parse_default_namespace(@data[0][0])
puts "default namespace is '#{@default_namespace}'"
end
end
# ------------------------------------------------------------------------------------
# NamespacesFile class
#
# Read, query, modify and write the namespace-prefixes file.
# ------------------------------------------------------------------------------------
class NamespacesFile
NAMESPACES_FILENAME = 'file_storage_namespaces.properties'
public
def initialize(uploads_directory, scan_only)
@uploads_directory = uploads_directory
@scan_only = scan_only
Dir.chdir(@uploads_directory) do |dir|
@namespaces = {}
if File.file?(NAMESPACES_FILENAME)
@namespaces = PropertyFileReader.read(NAMESPACES_FILENAME)
@namespaces.delete("properties_file_path")
end
end
end
def add_namespace(namespace)
if @namespaces.has_value?(namespace)
puts "found prefix for #{namespace}"
return
end
'abcdefghijklmnopqrstuvwxyz'.split("").each do |this_char|
if (!@namespaces.has_key?(this_char))
@namespaces[this_char] = namespace
puts "assigned prefix = '#{this_char}'"
return
end
end
raise "all prefixes are used!"
end
def prefix(namespace)
@namespaces.each() do | key, value |
return key if value == namespace
end
raise "no prefix for '#{namespace}'"
end
def write()
if @scan_only
puts "Scan-only: not writing namespaces file"
else
Dir.chdir(@uploads_directory) do |dir|
File.open(NAMESPACES_FILENAME, "w") do |f|
@namespaces.each do |prefix, namespace|
f.puts "#{prefix} = #{namespace}"
end
end
end
end
end
end
# ------------------------------------------------------------------------------------
# Main class - UploadFileFaker
# ------------------------------------------------------------------------------------
class UploadFileFaker
#
# Do we have any chance of succeeding with these properties?
#
def sanity_checks_on_properties()
raise("Properties file must contain a value for 'uploads_directory'") if @uploads_directory == nil
raise("Properties file must contain a value for 'file_info_file'") if @file_info_file == nil
raise("Properties file must contain a value for 'template_file'") if @template_file == nil
if !File.directory?(@uploads_directory)
raise "Not a directory: '#{@uploads_directory}'."
end
if !File.file?(@file_info_file)
raise "File does not exist: '#{@file_info_file}'."
end
if !File.file?(@template_file)
raise "File does not exist: '#{@template_file}'."
end
end
#
# Check each location that should contain an image, and if we're not just
# scanning, put one there.
#
def create_image_files_where_needed()
@file_info.data.each do |line|
uri, filename = line
process_file_info(uri, filename)
end
end
def process_file_info(uri, filename)
full_path = figure_full_path(uri, filename)
if File.file?(full_path)
puts "File already exists at: '#{full_path}'"
elsif @scan_only
puts "Scan only - no file at: '#{full_path}'"
else
puts "Creating file at: '#{full_path}'"
FileUtils.mkpath(File.dirname(full_path))
FileUtils.cp(@template_file, full_path)
end
end
def figure_full_path(uri, filename)
prefixed_uri = substitute_prefix_for_namespace(uri)
construct_full_path(prefixed_uri, filename)
end
def substitute_prefix_for_namespace(uri)
if uri[0, @namespace.length] == @namespace
uri.sub(@namespace, "#{@prefix}~")
else
raise "Doesn't start with default namespace: '#{uri}'"
end
end
def construct_full_path(prefixed_uri, filename)
path = ""
0.step(prefixed_uri.size - 1, 3) do |i|
path = "#{path}/#{prefixed_uri[i, 3]}"
end
"#{@uploads_directory}/file_storage_root#{path}/#{filename}"
end
public
#
# Setup and get ready to process.
#
# properties is a map of keys to values, probably parsed from a properties file.
#
def initialize(properties)
scan_only_string = properties['scan_only']
@scan_only = 'false' != scan_only_string
@uploads_directory = properties['uploads_directory']
@file_info_file = properties['file_info_file']
@template_file = properties['template_file']
sanity_checks_on_properties()
end
#
# Start the scanning (and copying).
#
def process()
@file_info = FileInfoFile.new(@file_info_file)
@namespace = @file_info.default_namespace
namespaces_file = NamespacesFile.new(@uploads_directory, @scan_only)
namespaces_file.add_namespace(@namespace)
namespaces_file.write()
@prefix = namespaces_file.prefix(@namespace)
create_image_files_where_needed()
end
end
#
# ------------------------------------------------------------------------------------
# Standalone calling.
#
# Do this if this program was called from the command line. That is, if the command
# expands to the path of this file.
# ------------------------------------------------------------------------------------
#
if File.expand_path($0) == File.expand_path(__FILE__)
if ARGV.length == 0
raise("No arguments - usage is: UploadFileFaker.rb <property_file>")
end
if !File.file?(ARGV[0])
raise "File does not exist: '#{ARGV[0]}'."
end
properties = PropertyFileReader.read(ARGV[0])
uff = UploadFileFaker.new(properties)
uff.process
puts "UploadFileFaker was successful."
end

View file

@ -0,0 +1,7 @@
The sites directory contains sub-directories, one for each site whose data we are testing.
Each site directory (cornell, indiana, etc.) contains information specific to that site.
In particular, it contains a site_properties.rb file, which defines the default_namespace
and the email address of the root user, for inclusion in the deploy.properties file
by _deploy script.

View file

@ -0,0 +1,4 @@
# properties for this site
@default_namespace = 'http://vivo.cornell.edu/individual/'
@root_user = 'vivo_root@mydomain.edu'

View file

@ -0,0 +1,3 @@
# properties for this site
@default_namespace = 'http://vivo.iu.edu/individual/'
@root_user = 'vivo@indiana.edu'

View file

@ -0,0 +1,3 @@
# properties for this site
@default_namespace = 'http://vivo.scripps.edu/individual/'
@root_user = 'samtest@scripps.edu'

View file

@ -0,0 +1,15 @@
Contains both the JMeter source files for the tests, and the results of the tests.
The source files are stored hierarchically, so we can have multiple sources for each set of tests.
For example, the version of "SimpleTests" that is used with release 1.3 is stored in
testinfo/tests/SimpleTests/SimpleTests-1-3.jmx
That way _selectTest can determine what sets we have by the names of the subdirectories in tests,
and _runTest can use a distro-dependent version of the test set.
The results are stored in files that correspond the tests, and categorized by the site that
they run against, so if we run SimpleTests against cornell data on distro of release 1.3,
the results are stroed in
results/cornell/SimpleTests-1-3.jtl
results/cornell/SimpleTests-1-3.html
results/cornell/SimpleTests-1-3.log

View file

@ -0,0 +1,564 @@
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="2.1">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
<stringProp name="TestPlan.comments"></stringProp>
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="WEBAPP_HOST" elementType="Argument">
<stringProp name="Argument.name">WEBAPP_HOST</stringProp>
<stringProp name="Argument.value">${__property(webapp.host, , localhost)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="WEBAPP_PORT" elementType="Argument">
<stringProp name="Argument.name">WEBAPP_PORT</stringProp>
<stringProp name="Argument.value">${__property(webapp.port, , 8080)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="WEBAPP_NAME" elementType="Argument">
<stringProp name="Argument.name">WEBAPP_NAME</stringProp>
<stringProp name="Argument.value">${__property(webapp.name, , vivo)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="PERSON_URI_FILE" elementType="Argument">
<stringProp name="Argument.name">PERSON_URI_FILE</stringProp>
<stringProp name="Argument.value">${__property(file.person.uris, , PersonUris.csv)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="INFO_RESOURCE_URI_FILE" elementType="Argument">
<stringProp name="Argument.name">INFO_RESOURCE_URI_FILE</stringProp>
<stringProp name="Argument.value">${__property(file.infoResource.uris, , InfoResourceUris.csv)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="ITERATIONS" elementType="Argument">
<stringProp name="Argument.name">ITERATIONS</stringProp>
<stringProp name="Argument.value">${__property(iterations, , 10)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="DEFAULT_NAMESPACE" elementType="Argument">
<stringProp name="Argument.name">DEFAULT_NAMESPACE</stringProp>
<stringProp name="Argument.value">${__property(default.namespace, , http://vivo.mydomain.edu/individual/)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="THREADS" elementType="Argument">
<stringProp name="Argument.name">THREADS</stringProp>
<stringProp name="Argument.value">${__property(threads, , 1)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="TestPlan.user_define_classpath"></stringProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Main Thread Group" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
<stringProp name="LoopController.loops">${ITERATIONS}</stringProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">${THREADS}</stringProp>
<stringProp name="ThreadGroup.ramp_time">${THREADS}</stringProp>
<longProp name="ThreadGroup.start_time">1294759350000</longProp>
<longProp name="ThreadGroup.end_time">1294759350000</longProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
</ThreadGroup>
<hashTree>
<CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true">
<collectionProp name="CookieManager.cookies"/>
<boolProp name="CookieManager.clearEachIteration">false</boolProp>
<stringProp name="CookieManager.policy">rfc2109</stringProp>
</CookieManager>
<hashTree/>
<ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain">${WEBAPP_HOST}</stringProp>
<stringProp name="HTTPSampler.port">${WEBAPP_PORT}</stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path"></stringProp>
<boolProp name="HTTPSampler.image_parser">true</boolProp>
</ConfigTestElement>
<hashTree/>
<GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="Not logged in" enabled="true">
<stringProp name="TestPlan.comments">These pages are run while the user is not logged in.</stringProp>
</GenericController>
<hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Nobody: Home page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Nobody: About page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/about</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Nobody: Person profile page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${PERSON_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Nobody: InfoResource Profile Page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${INFO_RESOURCE_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="InfoResource URIs from CSV" enabled="true">
<stringProp name="filename">${INFO_RESOURCE_URI_FILE}</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="variableNames">INFO_RESOURCE_URI</stringProp>
<stringProp name="delimiter"></stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="shareMode">All threads</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
</hashTree>
<GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="Logged in as DBA" enabled="true"/>
<hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Login, release 1.2" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="username" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">testAdmin</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">username</stringProp>
</elementProp>
<elementProp name="password" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">Password</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">password</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/programLogin</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Site Admin" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/siteAdmin</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Person profile page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${PERSON_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: InfoResource Profile Page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${INFO_RESOURCE_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="InfoResource URIs from CSV" enabled="true">
<stringProp name="filename">${INFO_RESOURCE_URI_FILE}</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="variableNames">INFO_RESOURCE_URI</stringProp>
<stringProp name="delimiter"></stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="shareMode">All threads</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Auto-complete authorship" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="query" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">PREFIX core: &lt;http://vivoweb.org/ontology/core#&gt; SELECT ?pubUri WHERE {&lt;${DEFAULT_NAMESPACE}${PERSON_URI}&gt; core:authorInAuthorship ?authorshipUri . ?authorshipUri core:linkedInformationResource ?pubUri .}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">query</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/ajax/sparqlQuery</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
<collectionProp name="Asserion.test_strings">
<stringProp name="-977445585">pubUri</stringProp>
</collectionProp>
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
<boolProp name="Assertion.assume_success">false</boolProp>
<intProp name="Assertion.test_type">2</intProp>
</ResponseAssertion>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Auto-complete grant role" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="query" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">PREFIX core: &lt;http://vivoweb.org/ontology/core#&gt; SELECT ?grantUri WHERE {&lt;${DEFAULT_NAMESPACE}${PERSON_URI}&gt; &lt;http://vivoweb.org/ontology/core#hasPrincipalInvestigatorRole&gt; ?grantRole . ?grantRole core:roleIn ?grantUri .} </stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">query</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/ajax/sparqlQuery</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
<collectionProp name="Asserion.test_strings">
<stringProp name="99198640">grantUri</stringProp>
</collectionProp>
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
<boolProp name="Assertion.assume_success">false</boolProp>
<intProp name="Assertion.test_type">2</intProp>
</ResponseAssertion>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: logout" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/logout</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
</hashTree>
<GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="Logged in as SelfEditor" enabled="true"/>
<hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="SelfEditor: Login, release 1.2" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="username" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">dk15</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">username</stringProp>
</elementProp>
<elementProp name="password" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">Password</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">password</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/programLogin</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="SelfEditor: Person profile page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${PERSON_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="SelfEditor: InfoResource Profile Page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${INFO_RESOURCE_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="InfoResource URIs from CSV" enabled="true">
<stringProp name="filename">${INFO_RESOURCE_URI_FILE}</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="variableNames">INFO_RESOURCE_URI</stringProp>
<stringProp name="delimiter"></stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="shareMode">All threads</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="SelfEditor: logout" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/logout</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
</hashTree>
</hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>

View file

@ -0,0 +1,564 @@
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="2.1">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
<stringProp name="TestPlan.comments"></stringProp>
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="WEBAPP_HOST" elementType="Argument">
<stringProp name="Argument.name">WEBAPP_HOST</stringProp>
<stringProp name="Argument.value">${__property(webapp.host, , localhost)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="WEBAPP_PORT" elementType="Argument">
<stringProp name="Argument.name">WEBAPP_PORT</stringProp>
<stringProp name="Argument.value">${__property(webapp.port, , 8080)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="WEBAPP_NAME" elementType="Argument">
<stringProp name="Argument.name">WEBAPP_NAME</stringProp>
<stringProp name="Argument.value">${__property(webapp.name, , vivo)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="PERSON_URI_FILE" elementType="Argument">
<stringProp name="Argument.name">PERSON_URI_FILE</stringProp>
<stringProp name="Argument.value">${__property(file.person.uris, , PersonUris.csv)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="INFO_RESOURCE_URI_FILE" elementType="Argument">
<stringProp name="Argument.name">INFO_RESOURCE_URI_FILE</stringProp>
<stringProp name="Argument.value">${__property(file.infoResource.uris, , InfoResourceUris.csv)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="ITERATIONS" elementType="Argument">
<stringProp name="Argument.name">ITERATIONS</stringProp>
<stringProp name="Argument.value">${__property(iterations, , 10)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="DEFAULT_NAMESPACE" elementType="Argument">
<stringProp name="Argument.name">DEFAULT_NAMESPACE</stringProp>
<stringProp name="Argument.value">${__property(default.namespace, , http://vivo.mydomain.edu/individual/)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="THREADS" elementType="Argument">
<stringProp name="Argument.name">THREADS</stringProp>
<stringProp name="Argument.value">${__property(threads, , 1)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="TestPlan.user_define_classpath"></stringProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Main Thread Group" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
<stringProp name="LoopController.loops">${ITERATIONS}</stringProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">${THREADS}</stringProp>
<stringProp name="ThreadGroup.ramp_time">${THREADS}</stringProp>
<longProp name="ThreadGroup.start_time">1294759350000</longProp>
<longProp name="ThreadGroup.end_time">1294759350000</longProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
</ThreadGroup>
<hashTree>
<CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true">
<collectionProp name="CookieManager.cookies"/>
<boolProp name="CookieManager.clearEachIteration">false</boolProp>
<stringProp name="CookieManager.policy">rfc2109</stringProp>
</CookieManager>
<hashTree/>
<ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain">${WEBAPP_HOST}</stringProp>
<stringProp name="HTTPSampler.port">${WEBAPP_PORT}</stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path"></stringProp>
<boolProp name="HTTPSampler.image_parser">true</boolProp>
</ConfigTestElement>
<hashTree/>
<GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="Not logged in" enabled="true">
<stringProp name="TestPlan.comments">These pages are run while the user is not logged in.</stringProp>
</GenericController>
<hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Nobody: Home page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Nobody: About page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/about</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Nobody: Person profile page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${PERSON_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Nobody: InfoResource Profile Page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${INFO_RESOURCE_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="InfoResource URIs from CSV" enabled="true">
<stringProp name="filename">${INFO_RESOURCE_URI_FILE}</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="variableNames">INFO_RESOURCE_URI</stringProp>
<stringProp name="delimiter"></stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="shareMode">All threads</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
</hashTree>
<GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="Logged in as DBA" enabled="true"/>
<hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Login, release 1.2" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="username" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">testAdmin</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">username</stringProp>
</elementProp>
<elementProp name="password" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">Password</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">password</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/programLogin</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Site Admin" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/siteAdmin</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Person profile page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${PERSON_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: InfoResource Profile Page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${INFO_RESOURCE_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="InfoResource URIs from CSV" enabled="true">
<stringProp name="filename">${INFO_RESOURCE_URI_FILE}</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="variableNames">INFO_RESOURCE_URI</stringProp>
<stringProp name="delimiter"></stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="shareMode">All threads</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Auto-complete authorship" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="query" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">PREFIX core: &lt;http://vivoweb.org/ontology/core#&gt; SELECT ?pubUri WHERE {&lt;${DEFAULT_NAMESPACE}${PERSON_URI}&gt; core:authorInAuthorship ?authorshipUri . ?authorshipUri core:linkedInformationResource ?pubUri .}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">query</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/ajax/sparqlQuery</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
<collectionProp name="Asserion.test_strings">
<stringProp name="-977445585">pubUri</stringProp>
</collectionProp>
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
<boolProp name="Assertion.assume_success">false</boolProp>
<intProp name="Assertion.test_type">2</intProp>
</ResponseAssertion>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Auto-complete grant role" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="query" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">PREFIX core: &lt;http://vivoweb.org/ontology/core#&gt; SELECT ?grantUri WHERE {&lt;${DEFAULT_NAMESPACE}${PERSON_URI}&gt; &lt;http://vivoweb.org/ontology/core#hasPrincipalInvestigatorRole&gt; ?grantRole . ?grantRole core:roleIn ?grantUri .} </stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">query</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/ajax/sparqlQuery</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
<collectionProp name="Asserion.test_strings">
<stringProp name="99198640">grantUri</stringProp>
</collectionProp>
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
<boolProp name="Assertion.assume_success">false</boolProp>
<intProp name="Assertion.test_type">2</intProp>
</ResponseAssertion>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: logout" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/logout</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
</hashTree>
<GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="Logged in as SelfEditor" enabled="true"/>
<hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="SelfEditor: Login, release 1.2" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="username" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">dk15</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">username</stringProp>
</elementProp>
<elementProp name="password" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">Password</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">password</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/programLogin</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="SelfEditor: Person profile page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${PERSON_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="SelfEditor: InfoResource Profile Page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${INFO_RESOURCE_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="InfoResource URIs from CSV" enabled="true">
<stringProp name="filename">${INFO_RESOURCE_URI_FILE}</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="variableNames">INFO_RESOURCE_URI</stringProp>
<stringProp name="delimiter"></stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="shareMode">All threads</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="SelfEditor: logout" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/logout</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
</hashTree>
</hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>

View file

@ -0,0 +1,564 @@
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="2.1">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
<stringProp name="TestPlan.comments"></stringProp>
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="WEBAPP_HOST" elementType="Argument">
<stringProp name="Argument.name">WEBAPP_HOST</stringProp>
<stringProp name="Argument.value">${__property(webapp.host, , localhost)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="WEBAPP_PORT" elementType="Argument">
<stringProp name="Argument.name">WEBAPP_PORT</stringProp>
<stringProp name="Argument.value">${__property(webapp.port, , 8080)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="WEBAPP_NAME" elementType="Argument">
<stringProp name="Argument.name">WEBAPP_NAME</stringProp>
<stringProp name="Argument.value">${__property(webapp.name, , vivo)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="PERSON_URI_FILE" elementType="Argument">
<stringProp name="Argument.name">PERSON_URI_FILE</stringProp>
<stringProp name="Argument.value">${__property(file.person.uris, , PersonUris.csv)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="INFO_RESOURCE_URI_FILE" elementType="Argument">
<stringProp name="Argument.name">INFO_RESOURCE_URI_FILE</stringProp>
<stringProp name="Argument.value">${__property(file.infoResource.uris, , InfoResourceUris.csv)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="ITERATIONS" elementType="Argument">
<stringProp name="Argument.name">ITERATIONS</stringProp>
<stringProp name="Argument.value">${__property(iterations, , 10)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="DEFAULT_NAMESPACE" elementType="Argument">
<stringProp name="Argument.name">DEFAULT_NAMESPACE</stringProp>
<stringProp name="Argument.value">${__property(default.namespace, , http://vivo.mydomain.edu/individual/)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
<elementProp name="THREADS" elementType="Argument">
<stringProp name="Argument.name">THREADS</stringProp>
<stringProp name="Argument.value">${__property(threads, , 1)}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="TestPlan.user_define_classpath"></stringProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Main Thread Group" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
<stringProp name="LoopController.loops">${ITERATIONS}</stringProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">${THREADS}</stringProp>
<stringProp name="ThreadGroup.ramp_time">${THREADS}</stringProp>
<longProp name="ThreadGroup.start_time">1294759350000</longProp>
<longProp name="ThreadGroup.end_time">1294759350000</longProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
</ThreadGroup>
<hashTree>
<CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true">
<collectionProp name="CookieManager.cookies"/>
<boolProp name="CookieManager.clearEachIteration">false</boolProp>
<stringProp name="CookieManager.policy">rfc2109</stringProp>
</CookieManager>
<hashTree/>
<ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain">${WEBAPP_HOST}</stringProp>
<stringProp name="HTTPSampler.port">${WEBAPP_PORT}</stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path"></stringProp>
<boolProp name="HTTPSampler.image_parser">true</boolProp>
</ConfigTestElement>
<hashTree/>
<GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="Not logged in" enabled="true">
<stringProp name="TestPlan.comments">These pages are run while the user is not logged in.</stringProp>
</GenericController>
<hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Nobody: Home page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Nobody: About page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/about</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Nobody: Person profile page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${PERSON_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Nobody: InfoResource Profile Page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${INFO_RESOURCE_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="InfoResource URIs from CSV" enabled="true">
<stringProp name="filename">${INFO_RESOURCE_URI_FILE}</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="variableNames">INFO_RESOURCE_URI</stringProp>
<stringProp name="delimiter"></stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="shareMode">All threads</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
</hashTree>
<GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="Logged in as DBA" enabled="true"/>
<hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Login, release 1.2" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="username" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">testAdmin</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">username</stringProp>
</elementProp>
<elementProp name="password" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">Password</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">password</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/programLogin</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Site Admin" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/siteAdmin</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Person profile page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${PERSON_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: InfoResource Profile Page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${INFO_RESOURCE_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="InfoResource URIs from CSV" enabled="true">
<stringProp name="filename">${INFO_RESOURCE_URI_FILE}</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="variableNames">INFO_RESOURCE_URI</stringProp>
<stringProp name="delimiter"></stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="shareMode">All threads</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Auto-complete authorship" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="query" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">PREFIX core: &lt;http://vivoweb.org/ontology/core#&gt; SELECT ?pubUri WHERE {&lt;${DEFAULT_NAMESPACE}${PERSON_URI}&gt; core:authorInAuthorship ?authorshipUri . ?authorshipUri core:linkedInformationResource ?pubUri .}</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">query</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/ajax/sparqlQuery</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
<collectionProp name="Asserion.test_strings">
<stringProp name="-977445585">pubUri</stringProp>
</collectionProp>
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
<boolProp name="Assertion.assume_success">false</boolProp>
<intProp name="Assertion.test_type">2</intProp>
</ResponseAssertion>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: Auto-complete grant role" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="query" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">PREFIX core: &lt;http://vivoweb.org/ontology/core#&gt; SELECT ?grantUri WHERE {&lt;${DEFAULT_NAMESPACE}${PERSON_URI}&gt; &lt;http://vivoweb.org/ontology/core#hasPrincipalInvestigatorRole&gt; ?grantRole . ?grantRole core:roleIn ?grantUri .} </stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">query</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/ajax/sparqlQuery</stringProp>
<stringProp name="HTTPSampler.method">POST</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
<collectionProp name="Asserion.test_strings">
<stringProp name="99198640">grantUri</stringProp>
</collectionProp>
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
<boolProp name="Assertion.assume_success">false</boolProp>
<intProp name="Assertion.test_type">2</intProp>
</ResponseAssertion>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="DBA: logout" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/logout</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
</hashTree>
<GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="Logged in as SelfEditor" enabled="true"/>
<hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="SelfEditor: Login, release 1.2" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments">
<elementProp name="username" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">dk15</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">username</stringProp>
</elementProp>
<elementProp name="password" elementType="HTTPArgument">
<boolProp name="HTTPArgument.always_encode">false</boolProp>
<stringProp name="Argument.value">Password</stringProp>
<stringProp name="Argument.metadata">=</stringProp>
<boolProp name="HTTPArgument.use_equals">true</boolProp>
<stringProp name="Argument.name">password</stringProp>
</elementProp>
</collectionProp>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/programLogin</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="SelfEditor: Person profile page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${PERSON_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Person URIs from CSV" enabled="true">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="filename">${PERSON_URI_FILE}</stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">All threads</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">PERSON_URI</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="SelfEditor: InfoResource Profile Page" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/display/${INFO_RESOURCE_URI}</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree>
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="InfoResource URIs from CSV" enabled="true">
<stringProp name="filename">${INFO_RESOURCE_URI_FILE}</stringProp>
<stringProp name="fileEncoding">utf8</stringProp>
<stringProp name="variableNames">INFO_RESOURCE_URI</stringProp>
<stringProp name="delimiter"></stringProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="shareMode">All threads</stringProp>
</CSVDataSet>
<hashTree/>
</hashTree>
<HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="SelfEditor: logout" enabled="true">
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain"></stringProp>
<stringProp name="HTTPSampler.port"></stringProp>
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
<stringProp name="HTTPSampler.response_timeout"></stringProp>
<stringProp name="HTTPSampler.protocol"></stringProp>
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
<stringProp name="HTTPSampler.path">${WEBAPP_NAME}/logout</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.monitor">false</boolProp>
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
</HTTPSampler>
<hashTree/>
</hashTree>
</hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,3 @@
Contains a standard Tomcat distribution. Currently we have no provision
for testing on multiple versions of Tomcat.

View file

@ -0,0 +1,11 @@
Contains data that is specific to both a particular site and a particular distribution of VIVO,
so subdirectories might be named "scripps1.3" or "indiana1.4"
Each subdirectory contains a VIVO home directory called "data", and the file storage
area should be populated with appropriate images so the tests won't throw errors if the
data-model is expecting an image file.
Of course, the Solr index for each "version" will be stored in its home directory.
The version directory is also a place to capture the tomcat logs, so we can inspect them later.