diff --git a/utilities/LoadTesting/distros/README.txt b/utilities/LoadTesting/distros/README.txt new file mode 100644 index 00000000..cf9abb83 --- /dev/null +++ b/utilities/LoadTesting/distros/README.txt @@ -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. + diff --git a/utilities/LoadTesting/distros/release1.3/deploy.properties.template b/utilities/LoadTesting/distros/release1.3/deploy.properties.template new file mode 100644 index 00000000..02338a44 --- /dev/null +++ b/utilities/LoadTesting/distros/release1.3/deploy.properties.template @@ -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 diff --git a/utilities/LoadTesting/distros/release1.3/distro_properties.rb b/utilities/LoadTesting/distros/release1.3/distro_properties.rb new file mode 100644 index 00000000..9f72035a --- /dev/null +++ b/utilities/LoadTesting/distros/release1.3/distro_properties.rb @@ -0,0 +1,2 @@ +# properties for this distribution +@test_suffix = '-1-3' diff --git a/utilities/LoadTesting/distros/release1.4/deploy.properties.template b/utilities/LoadTesting/distros/release1.4/deploy.properties.template new file mode 100644 index 00000000..4b0b931d --- /dev/null +++ b/utilities/LoadTesting/distros/release1.4/deploy.properties.template @@ -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 diff --git a/utilities/LoadTesting/distros/release1.4/distro_properties.rb b/utilities/LoadTesting/distros/release1.4/distro_properties.rb new file mode 100644 index 00000000..88ed03fe --- /dev/null +++ b/utilities/LoadTesting/distros/release1.4/distro_properties.rb @@ -0,0 +1,2 @@ +# properties for this distribution +@test_suffix = '-1-4' diff --git a/utilities/LoadTesting/jmeter/README.txt b/utilities/LoadTesting/jmeter/README.txt new file mode 100644 index 00000000..89db6eb7 --- /dev/null +++ b/utilities/LoadTesting/jmeter/README.txt @@ -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 + diff --git a/utilities/LoadTesting/jmeter/jakarta-jmeter-2.4.zip b/utilities/LoadTesting/jmeter/jakarta-jmeter-2.4.zip new file mode 100644 index 00000000..b6f55e7b Binary files /dev/null and b/utilities/LoadTesting/jmeter/jakarta-jmeter-2.4.zip differ diff --git a/utilities/LoadTesting/modelData/README.txt b/utilities/LoadTesting/modelData/README.txt new file mode 100644 index 00000000..d2c3eff9 --- /dev/null +++ b/utilities/LoadTesting/modelData/README.txt @@ -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. + diff --git a/utilities/LoadTesting/modelData/_patches_and_queries/README.txt b/utilities/LoadTesting/modelData/_patches_and_queries/README.txt new file mode 100644 index 00000000..ead6dcd8 --- /dev/null +++ b/utilities/LoadTesting/modelData/_patches_and_queries/README.txt @@ -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. diff --git a/utilities/LoadTesting/modelData/_patches_and_queries/get_info_resource_uris.sparql b/utilities/LoadTesting/modelData/_patches_and_queries/get_info_resource_uris.sparql new file mode 100644 index 00000000..44af48ec --- /dev/null +++ b/utilities/LoadTesting/modelData/_patches_and_queries/get_info_resource_uris.sparql @@ -0,0 +1,9 @@ +PREFIX core: + +SELECT ?uri +WHERE +{ + ?uri a core:InformationResource . +} +limit 300 + diff --git a/utilities/LoadTesting/modelData/_patches_and_queries/get_person_uris.sparql b/utilities/LoadTesting/modelData/_patches_and_queries/get_person_uris.sparql new file mode 100644 index 00000000..57e6c14b --- /dev/null +++ b/utilities/LoadTesting/modelData/_patches_and_queries/get_person_uris.sparql @@ -0,0 +1,9 @@ +PREFIX foaf: +PREFIX core: + +SELECT ?uri +WHERE +{ + ?uri a foaf:Person ; +} +limit 300 diff --git a/utilities/LoadTesting/modelData/_patches_and_queries/image_file_query.sparql b/utilities/LoadTesting/modelData/_patches_and_queries/image_file_query.sparql new file mode 100644 index 00000000..9e11dc85 --- /dev/null +++ b/utilities/LoadTesting/modelData/_patches_and_queries/image_file_query.sparql @@ -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: + +SELECT ?bytestreamUri ?filename +WHERE +{ + ?fileUri p.1:downloadLocation ?bytestreamUri; + p.1:filename ?filename. +} + diff --git a/utilities/LoadTesting/modelData/_patches_and_queries/userAccountsPatch.n3 b/utilities/LoadTesting/modelData/_patches_and_queries/userAccountsPatch.n3 new file mode 100644 index 00000000..2d0cacd8 --- /dev/null +++ b/utilities/LoadTesting/modelData/_patches_and_queries/userAccountsPatch.n3 @@ -0,0 +1,50 @@ +@prefix rdfs: . +@prefix xsd: . +@prefix owl: . +@prefix rdf: . + + + a ; + + "selfEditor@mydomain.edu"^^xsd:string ; + + "seditor"^^xsd:string ; + + "self"^^xsd:string ; + + ; + + "1322673007960"^^xsd:long ; + + "editor"^^xsd:string ; + + "2"^^xsd:int ; + + "DC647EB65E6711E155375218212B3964"^^xsd:string ; + + "0"^^xsd:long ; + + "ACTIVE"^^xsd:string . + + + a ; + + "testAdmin@mydomain.edu"^^xsd:string ; + + "tadmin"^^xsd:string ; + + "test"^^xsd:string ; + + ; + + "1322673030151"^^xsd:long ; + + "admin"^^xsd:string ; + + "3"^^xsd:int ; + + "DC647EB65E6711E155375218212B3964"^^xsd:string ; + + "0"^^xsd:long ; + + "ACTIVE"^^xsd:string . diff --git a/utilities/LoadTesting/scripts/_captureTomcatLogs b/utilities/LoadTesting/scripts/_captureTomcatLogs new file mode 100755 index 00000000..e5ddbbaf --- /dev/null +++ b/utilities/LoadTesting/scripts/_captureTomcatLogs @@ -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 + diff --git a/utilities/LoadTesting/scripts/_checkTomcat b/utilities/LoadTesting/scripts/_checkTomcat new file mode 100755 index 00000000..2d696717 --- /dev/null +++ b/utilities/LoadTesting/scripts/_checkTomcat @@ -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") + diff --git a/utilities/LoadTesting/scripts/_clearTomcatLogs b/utilities/LoadTesting/scripts/_clearTomcatLogs new file mode 100755 index 00000000..51062961 --- /dev/null +++ b/utilities/LoadTesting/scripts/_clearTomcatLogs @@ -0,0 +1,12 @@ +#! /usr/bin/ruby + +=begin +-------------------------------------------------------------------------------- + +Remove any Tomcat logs. + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +=end + +puts system("rm ~/LoadTesting/tomcat/logs/*") diff --git a/utilities/LoadTesting/scripts/_deploy b/utilities/LoadTesting/scripts/_deploy new file mode 100755 index 00000000..2457d5ad --- /dev/null +++ b/utilities/LoadTesting/scripts/_deploy @@ -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 + diff --git a/utilities/LoadTesting/scripts/_fakeUploadedFiles b/utilities/LoadTesting/scripts/_fakeUploadedFiles new file mode 100755 index 00000000..d813b577 --- /dev/null +++ b/utilities/LoadTesting/scripts/_fakeUploadedFiles @@ -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." + diff --git a/utilities/LoadTesting/scripts/_lessVivoLog b/utilities/LoadTesting/scripts/_lessVivoLog new file mode 100755 index 00000000..9043b914 --- /dev/null +++ b/utilities/LoadTesting/scripts/_lessVivoLog @@ -0,0 +1,12 @@ +#! /usr/bin/ruby + +=begin +-------------------------------------------------------------------------------- + +View the VIVO log in Tomcat. + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +=end + +puts system("less ~/LoadTesting/tomcat/logs/vivo.all.log") diff --git a/utilities/LoadTesting/scripts/_mergeTestResults b/utilities/LoadTesting/scripts/_mergeTestResults new file mode 100755 index 00000000..176bfec1 --- /dev/null +++ b/utilities/LoadTesting/scripts/_mergeTestResults @@ -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." + + diff --git a/utilities/LoadTesting/scripts/_runTest b/utilities/LoadTesting/scripts/_runTest new file mode 100755 index 00000000..c73156db --- /dev/null +++ b/utilities/LoadTesting/scripts/_runTest @@ -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 + diff --git a/utilities/LoadTesting/scripts/_setTest b/utilities/LoadTesting/scripts/_setTest new file mode 100755 index 00000000..7aa1d27c --- /dev/null +++ b/utilities/LoadTesting/scripts/_setTest @@ -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) + diff --git a/utilities/LoadTesting/scripts/_setVersion b/utilities/LoadTesting/scripts/_setVersion new file mode 100755 index 00000000..c715176e --- /dev/null +++ b/utilities/LoadTesting/scripts/_setVersion @@ -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]) + diff --git a/utilities/LoadTesting/scripts/_startTomcat b/utilities/LoadTesting/scripts/_startTomcat new file mode 100755 index 00000000..d511dc4a --- /dev/null +++ b/utilities/LoadTesting/scripts/_startTomcat @@ -0,0 +1,12 @@ +#! /usr/bin/ruby + +=begin +-------------------------------------------------------------------------------- + +Duh + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +=end +puts system("~/LoadTesting/tomcat/bin/startup.sh") + diff --git a/utilities/LoadTesting/scripts/_status b/utilities/LoadTesting/scripts/_status new file mode 100755 index 00000000..1e36e9c1 --- /dev/null +++ b/utilities/LoadTesting/scripts/_status @@ -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 + diff --git a/utilities/LoadTesting/scripts/_stopTomcat b/utilities/LoadTesting/scripts/_stopTomcat new file mode 100755 index 00000000..13faf73f --- /dev/null +++ b/utilities/LoadTesting/scripts/_stopTomcat @@ -0,0 +1,13 @@ +#! /usr/bin/ruby + +=begin +-------------------------------------------------------------------------------- + +Duh + +-------------------------------------------------------------------------------- +-------------------------------------------------------------------------------- +=end + +puts system("~/LoadTesting/tomcat/bin/shutdown.sh") + diff --git a/utilities/LoadTesting/scripts/_tailTomcatLogs b/utilities/LoadTesting/scripts/_tailTomcatLogs new file mode 100755 index 00000000..7c04c69c --- /dev/null +++ b/utilities/LoadTesting/scripts/_tailTomcatLogs @@ -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/*") diff --git a/utilities/LoadTesting/scripts/_update b/utilities/LoadTesting/scripts/_update new file mode 100755 index 00000000..fcae8f09 --- /dev/null +++ b/utilities/LoadTesting/scripts/_update @@ -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 + diff --git a/utilities/LoadTesting/scripts/_whichTest b/utilities/LoadTesting/scripts/_whichTest new file mode 100755 index 00000000..079da541 --- /dev/null +++ b/utilities/LoadTesting/scripts/_whichTest @@ -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" + diff --git a/utilities/LoadTesting/scripts/_whichVersion b/utilities/LoadTesting/scripts/_whichVersion new file mode 100755 index 00000000..c2004aeb --- /dev/null +++ b/utilities/LoadTesting/scripts/_whichVersion @@ -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}" + diff --git a/utilities/LoadTesting/scripts/subscripts/_current_test.rb b/utilities/LoadTesting/scripts/subscripts/_current_test.rb new file mode 100644 index 00000000..e959c45f --- /dev/null +++ b/utilities/LoadTesting/scripts/subscripts/_current_test.rb @@ -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' diff --git a/utilities/LoadTesting/scripts/subscripts/_current_version.rb b/utilities/LoadTesting/scripts/subscripts/_current_version.rb new file mode 100644 index 00000000..df99bc07 --- /dev/null +++ b/utilities/LoadTesting/scripts/subscripts/_current_version.rb @@ -0,0 +1,2 @@ +# what is the current version under test? +@version_name = 'cornell1.4' diff --git a/utilities/LoadTesting/scripts/subscripts/dummy_image_file.jpg b/utilities/LoadTesting/scripts/subscripts/dummy_image_file.jpg new file mode 100644 index 00000000..2cfbfbc3 Binary files /dev/null and b/utilities/LoadTesting/scripts/subscripts/dummy_image_file.jpg differ diff --git a/utilities/LoadTesting/scripts/subscripts/loadParms.rb b/utilities/LoadTesting/scripts/subscripts/loadParms.rb new file mode 100755 index 00000000..ba161043 --- /dev/null +++ b/utilities/LoadTesting/scripts/subscripts/loadParms.rb @@ -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" + diff --git a/utilities/LoadTesting/scripts/subscripts/property_file_reader.rb b/utilities/LoadTesting/scripts/subscripts/property_file_reader.rb new file mode 100644 index 00000000..8b3c29b5 --- /dev/null +++ b/utilities/LoadTesting/scripts/subscripts/property_file_reader.rb @@ -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 diff --git a/utilities/LoadTesting/scripts/subscripts/test_result_file.rb b/utilities/LoadTesting/scripts/subscripts/test_result_file.rb new file mode 100644 index 00000000..bb691fa8 --- /dev/null +++ b/utilities/LoadTesting/scripts/subscripts/test_result_file.rb @@ -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 + diff --git a/utilities/LoadTesting/scripts/subscripts/test_result_marshaller.rb b/utilities/LoadTesting/scripts/subscripts/test_result_marshaller.rb new file mode 100644 index 00000000..e4088888 --- /dev/null +++ b/utilities/LoadTesting/scripts/subscripts/test_result_marshaller.rb @@ -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" + + + + Performance tests for #{@site_name} + + +EOF + end + + def write_table_header(out) + top_cells = [' '] + @test_results.each do | test | + top_cells.push("#{test.version}
#{test.filename}
#{test.timestamp.strftime('%Y-%m-%d %H:%M:%S')}") + end + + bottom_cells = ['Test Name'] + @test_results.each do | test | + bottom_cells.push('Iterations') + bottom_cells.push('time
(min/max)') + bottom_cells.push("compare") + end + + out.puts <<"EOF" + + + #{top_cells.join("\n ")} + + + #{bottom_cells.join("\n ")} + +EOF + end + + def write_table_lines(out) + all_test_names().each do | test_name | + out.puts <<"EOF" + + + #{format_test_results(test_name)} + +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" + + + +EOF + else + <<"EOF" + + + +EOF + end + end + + def format_millis(millis) + "%.3f" % [millis.to_f / 1000] + end + + def performance_ratio(test_name, time) + return " " if @test_results.empty? + return " " unless @test_results[0].summaries.key?(test_name) + + s = @test_results[0].summaries[test_name] + reference = s.avg_time + return " " if reference == 0 + + return "#{"%.0f" % [time * 100 / reference]}%" + end + + def write_table_footer(out) + out.puts "
#{test_name}
#{s.how_many} + + + + + + + + +
#{format_millis(s.avg_time)}#{format_millis(s.min_time)}
#{format_millis(s.max_time)}
+
#{performance_ratio(test_name, s.avg_time)}  + + + + + + + + +
  
 
+
 
" + end + + def write_html_footer(out) + out.puts <<"EOF" + + +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 + diff --git a/utilities/LoadTesting/scripts/subscripts/test_result_merger.rb b/utilities/LoadTesting/scripts/subscripts/test_result_merger.rb new file mode 100644 index 00000000..2da1137d --- /dev/null +++ b/utilities/LoadTesting/scripts/subscripts/test_result_merger.rb @@ -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 + diff --git a/utilities/LoadTesting/scripts/subscripts/upload_file_faker.rb b/utilities/LoadTesting/scripts/subscripts/upload_file_faker.rb new file mode 100644 index 00000000..8d56d12c --- /dev/null +++ b/utilities/LoadTesting/scripts/subscripts/upload_file_faker.rb @@ -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 ") + 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 + diff --git a/utilities/LoadTesting/sites/README.txt b/utilities/LoadTesting/sites/README.txt new file mode 100644 index 00000000..3d82bdba --- /dev/null +++ b/utilities/LoadTesting/sites/README.txt @@ -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. diff --git a/utilities/LoadTesting/sites/cornell/site_properties.rb b/utilities/LoadTesting/sites/cornell/site_properties.rb new file mode 100644 index 00000000..720e586f --- /dev/null +++ b/utilities/LoadTesting/sites/cornell/site_properties.rb @@ -0,0 +1,4 @@ +# properties for this site +@default_namespace = 'http://vivo.cornell.edu/individual/' +@root_user = 'vivo_root@mydomain.edu' + diff --git a/utilities/LoadTesting/sites/indiana/site_properties.rb b/utilities/LoadTesting/sites/indiana/site_properties.rb new file mode 100644 index 00000000..8ab2f759 --- /dev/null +++ b/utilities/LoadTesting/sites/indiana/site_properties.rb @@ -0,0 +1,3 @@ +# properties for this site +@default_namespace = 'http://vivo.iu.edu/individual/' +@root_user = 'vivo@indiana.edu' diff --git a/utilities/LoadTesting/sites/scripps/site_properties.rb b/utilities/LoadTesting/sites/scripps/site_properties.rb new file mode 100644 index 00000000..356eea82 --- /dev/null +++ b/utilities/LoadTesting/sites/scripps/site_properties.rb @@ -0,0 +1,3 @@ +# properties for this site +@default_namespace = 'http://vivo.scripps.edu/individual/' +@root_user = 'samtest@scripps.edu' diff --git a/utilities/LoadTesting/testinfo/README.txt b/utilities/LoadTesting/testinfo/README.txt new file mode 100644 index 00000000..ab2e70dd --- /dev/null +++ b/utilities/LoadTesting/testinfo/README.txt @@ -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 diff --git a/utilities/LoadTesting/testinfo/tests/SecondTests/SecondTests-rel-1-2.jmx b/utilities/LoadTesting/testinfo/tests/SecondTests/SecondTests-rel-1-2.jmx new file mode 100644 index 00000000..f00afc72 --- /dev/null +++ b/utilities/LoadTesting/testinfo/tests/SecondTests/SecondTests-rel-1-2.jmx @@ -0,0 +1,564 @@ + + + + + + false + false + + + + WEBAPP_HOST + ${__property(webapp.host, , localhost)} + = + + + WEBAPP_PORT + ${__property(webapp.port, , 8080)} + = + + + WEBAPP_NAME + ${__property(webapp.name, , vivo)} + = + + + PERSON_URI_FILE + ${__property(file.person.uris, , PersonUris.csv)} + = + + + INFO_RESOURCE_URI_FILE + ${__property(file.infoResource.uris, , InfoResourceUris.csv)} + = + + + ITERATIONS + ${__property(iterations, , 10)} + = + + + DEFAULT_NAMESPACE + ${__property(default.namespace, , http://vivo.mydomain.edu/individual/)} + = + + + THREADS + ${__property(threads, , 1)} + = + + + + + + + + continue + + false + ${ITERATIONS} + + ${THREADS} + ${THREADS} + 1294759350000 + 1294759350000 + false + + + + + + + false + rfc2109 + + + + + + + ${WEBAPP_HOST} + ${WEBAPP_PORT} + + + + + + true + + + + These pages are run while the user is not logged in. + + + + + + + + + + + + + ${WEBAPP_NAME}/ + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/about + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + + + + false + testAdmin + = + true + username + + + false + Password + = + true + password + + + + + + + + + + ${WEBAPP_NAME}/programLogin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/siteAdmin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + false + PREFIX core: <http://vivoweb.org/ontology/core#> SELECT ?pubUri WHERE {<${DEFAULT_NAMESPACE}${PERSON_URI}> core:authorInAuthorship ?authorshipUri . ?authorshipUri core:linkedInformationResource ?pubUri .} + = + true + query + + + + + + + + + + ${WEBAPP_NAME}/ajax/sparqlQuery + POST + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + pubUri + + Assertion.response_data + false + 2 + + + + + + + + false + PREFIX core: <http://vivoweb.org/ontology/core#> SELECT ?grantUri WHERE {<${DEFAULT_NAMESPACE}${PERSON_URI}> <http://vivoweb.org/ontology/core#hasPrincipalInvestigatorRole> ?grantRole . ?grantRole core:roleIn ?grantUri .} + = + true + query + + + + + + + + + + ${WEBAPP_NAME}/ajax/sparqlQuery + POST + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + grantUri + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + ${WEBAPP_NAME}/logout + GET + true + false + true + false + false + + + + + + + + + + + false + dk15 + = + true + username + + + false + Password + = + true + password + + + + + + + + + + ${WEBAPP_NAME}/programLogin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + + + + + + + ${WEBAPP_NAME}/logout + GET + true + false + true + false + false + + + + + + + + diff --git a/utilities/LoadTesting/testinfo/tests/SecondTests/SecondTests-rel-1-3.jmx b/utilities/LoadTesting/testinfo/tests/SecondTests/SecondTests-rel-1-3.jmx new file mode 100644 index 00000000..f00afc72 --- /dev/null +++ b/utilities/LoadTesting/testinfo/tests/SecondTests/SecondTests-rel-1-3.jmx @@ -0,0 +1,564 @@ + + + + + + false + false + + + + WEBAPP_HOST + ${__property(webapp.host, , localhost)} + = + + + WEBAPP_PORT + ${__property(webapp.port, , 8080)} + = + + + WEBAPP_NAME + ${__property(webapp.name, , vivo)} + = + + + PERSON_URI_FILE + ${__property(file.person.uris, , PersonUris.csv)} + = + + + INFO_RESOURCE_URI_FILE + ${__property(file.infoResource.uris, , InfoResourceUris.csv)} + = + + + ITERATIONS + ${__property(iterations, , 10)} + = + + + DEFAULT_NAMESPACE + ${__property(default.namespace, , http://vivo.mydomain.edu/individual/)} + = + + + THREADS + ${__property(threads, , 1)} + = + + + + + + + + continue + + false + ${ITERATIONS} + + ${THREADS} + ${THREADS} + 1294759350000 + 1294759350000 + false + + + + + + + false + rfc2109 + + + + + + + ${WEBAPP_HOST} + ${WEBAPP_PORT} + + + + + + true + + + + These pages are run while the user is not logged in. + + + + + + + + + + + + + ${WEBAPP_NAME}/ + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/about + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + + + + false + testAdmin + = + true + username + + + false + Password + = + true + password + + + + + + + + + + ${WEBAPP_NAME}/programLogin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/siteAdmin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + false + PREFIX core: <http://vivoweb.org/ontology/core#> SELECT ?pubUri WHERE {<${DEFAULT_NAMESPACE}${PERSON_URI}> core:authorInAuthorship ?authorshipUri . ?authorshipUri core:linkedInformationResource ?pubUri .} + = + true + query + + + + + + + + + + ${WEBAPP_NAME}/ajax/sparqlQuery + POST + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + pubUri + + Assertion.response_data + false + 2 + + + + + + + + false + PREFIX core: <http://vivoweb.org/ontology/core#> SELECT ?grantUri WHERE {<${DEFAULT_NAMESPACE}${PERSON_URI}> <http://vivoweb.org/ontology/core#hasPrincipalInvestigatorRole> ?grantRole . ?grantRole core:roleIn ?grantUri .} + = + true + query + + + + + + + + + + ${WEBAPP_NAME}/ajax/sparqlQuery + POST + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + grantUri + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + ${WEBAPP_NAME}/logout + GET + true + false + true + false + false + + + + + + + + + + + false + dk15 + = + true + username + + + false + Password + = + true + password + + + + + + + + + + ${WEBAPP_NAME}/programLogin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + + + + + + + ${WEBAPP_NAME}/logout + GET + true + false + true + false + false + + + + + + + + diff --git a/utilities/LoadTesting/testinfo/tests/SecondTests/SecondTests-rel-1-4.jmx b/utilities/LoadTesting/testinfo/tests/SecondTests/SecondTests-rel-1-4.jmx new file mode 100644 index 00000000..f00afc72 --- /dev/null +++ b/utilities/LoadTesting/testinfo/tests/SecondTests/SecondTests-rel-1-4.jmx @@ -0,0 +1,564 @@ + + + + + + false + false + + + + WEBAPP_HOST + ${__property(webapp.host, , localhost)} + = + + + WEBAPP_PORT + ${__property(webapp.port, , 8080)} + = + + + WEBAPP_NAME + ${__property(webapp.name, , vivo)} + = + + + PERSON_URI_FILE + ${__property(file.person.uris, , PersonUris.csv)} + = + + + INFO_RESOURCE_URI_FILE + ${__property(file.infoResource.uris, , InfoResourceUris.csv)} + = + + + ITERATIONS + ${__property(iterations, , 10)} + = + + + DEFAULT_NAMESPACE + ${__property(default.namespace, , http://vivo.mydomain.edu/individual/)} + = + + + THREADS + ${__property(threads, , 1)} + = + + + + + + + + continue + + false + ${ITERATIONS} + + ${THREADS} + ${THREADS} + 1294759350000 + 1294759350000 + false + + + + + + + false + rfc2109 + + + + + + + ${WEBAPP_HOST} + ${WEBAPP_PORT} + + + + + + true + + + + These pages are run while the user is not logged in. + + + + + + + + + + + + + ${WEBAPP_NAME}/ + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/about + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + + + + false + testAdmin + = + true + username + + + false + Password + = + true + password + + + + + + + + + + ${WEBAPP_NAME}/programLogin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/siteAdmin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + false + PREFIX core: <http://vivoweb.org/ontology/core#> SELECT ?pubUri WHERE {<${DEFAULT_NAMESPACE}${PERSON_URI}> core:authorInAuthorship ?authorshipUri . ?authorshipUri core:linkedInformationResource ?pubUri .} + = + true + query + + + + + + + + + + ${WEBAPP_NAME}/ajax/sparqlQuery + POST + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + pubUri + + Assertion.response_data + false + 2 + + + + + + + + false + PREFIX core: <http://vivoweb.org/ontology/core#> SELECT ?grantUri WHERE {<${DEFAULT_NAMESPACE}${PERSON_URI}> <http://vivoweb.org/ontology/core#hasPrincipalInvestigatorRole> ?grantRole . ?grantRole core:roleIn ?grantUri .} + = + true + query + + + + + + + + + + ${WEBAPP_NAME}/ajax/sparqlQuery + POST + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + grantUri + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + ${WEBAPP_NAME}/logout + GET + true + false + true + false + false + + + + + + + + + + + false + dk15 + = + true + username + + + false + Password + = + true + password + + + + + + + + + + ${WEBAPP_NAME}/programLogin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + + + + + + + ${WEBAPP_NAME}/logout + GET + true + false + true + false + false + + + + + + + + diff --git a/utilities/LoadTesting/testinfo/tests/SimpleTests/SimpleTests-1-2.jmx b/utilities/LoadTesting/testinfo/tests/SimpleTests/SimpleTests-1-2.jmx new file mode 100644 index 00000000..746627c4 --- /dev/null +++ b/utilities/LoadTesting/testinfo/tests/SimpleTests/SimpleTests-1-2.jmx @@ -0,0 +1,1209 @@ + + + + + + false + false + + + + WEBAPP_HOST + ${__property(webapp.host, , localhost)} + = + + + WEBAPP_PORT + ${__property(webapp.port, , 8080)} + = + + + WEBAPP_NAME + ${__property(webapp.name, , vivo)} + = + + + PERSON_URI_FILE + ${__property(file.person.uris, , PersonUris.csv)} + = + + + INFO_RESOURCE_URI_FILE + ${__property(file.infoResource.uris, , InfoResourceUris.csv)} + = + + + AUTHOR_URI_FILE + ${__property(file.author.uris, , AuthorUris.csv)} + = + + + ITERATIONS + ${__property(iterations, , 10)} + = + + + DEFAULT_NAMESPACE + ${__property(default.namespace, , http://vivo.mydomain.edu/individual/)} + = + + + THREADS + ${__property(threads, , 1)} + = + + + + + + + + continue + + false + ${ITERATIONS} + + ${THREADS} + ${THREADS} + 1294759350000 + 1294759350000 + false + + + + + + + false + rfc2109 + + + + + + + ${WEBAPP_HOST} + ${WEBAPP_PORT} + + + + + + true + + + + These pages are run while the user is not logged in. + + + + + + + + + + + + + ${WEBAPP_NAME}/ + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/about + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/browse + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/individuallist?vclassId=http%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2FPerson + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/search?flag1=1&querytext=faculty + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + + + + false + testAdmin + = + true + username + + + false + Password + = + true + password + + + + + + + + + + ${WEBAPP_NAME}/programLogin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/siteAdmin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/browse + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/individuallist?vclassId=http%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2FPerson + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/search?flag1=1&querytext=faculty + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + false + PREFIX core: <http://vivoweb.org/ontology/core#> SELECT ?pubUri WHERE {<${DEFAULT_NAMESPACE}${PERSON_URI}> core:authorInAuthorship ?authorshipUri . ?authorshipUri core:linkedInformationResource ?pubUri .} + = + true + query + + + + + + + + + + ${WEBAPP_NAME}/ajax/sparqlQuery + POST + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + pubUri + + Assertion.response_data + false + 2 + + + + + + + + false + PREFIX core: <http://vivoweb.org/ontology/core#> SELECT ?grantUri WHERE {<${DEFAULT_NAMESPACE}${PERSON_URI}> <http://vivoweb.org/ontology/core#hasPrincipalInvestigatorRole> ?grantRole . ?grantRole core:roleIn ?grantUri .} + = + true + query + + + + + + + + + + ${WEBAPP_NAME}/ajax/sparqlQuery + POST + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + grantUri + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + ${WEBAPP_NAME}/logout + GET + true + false + true + false + false + + + + + + + + + + + false + selfEditor + = + true + username + + + false + Password + = + true + password + + + + + + + + + + ${WEBAPP_NAME}/programLogin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/browse + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/individuallist?vclassId=http%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2FPerson + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/search?flag1=1&querytext=faculty + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + + + + + + + ${WEBAPP_NAME}/logout + GET + true + false + true + false + false + + + + + + doesn't matter whether we are logged in or not + + + + + + + true + ${DEFAULT_NAMESPACE}${AUTHOR_URI} + = + true + uri + + + false + dynamic + = + true + render_mode + + + false + person_pub_count + = + true + vis + + + false + short + = + true + vis_mode + + + false + vis_container_coauthor + = + true + container + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${AUTHOR_URI_FILE} + false + true + All threads + false + AUTHOR_URI + + + + + drawPubCountVisualization + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + PROFILE_INFO + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + {.+} + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + SHOW_GRANTS_LINK + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + {.+} + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + PROFILE_URL + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + individual + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + PERSON_LEVEL_URL + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + visualization + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + SHOW_AUTHORSHIP_LINK + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + numOfPublications + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + COPI_URL + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + visualization + + Assertion.response_data + false + 2 + + + + + + + + diff --git a/utilities/LoadTesting/testinfo/tests/SimpleTests/SimpleTests-1-3.jmx b/utilities/LoadTesting/testinfo/tests/SimpleTests/SimpleTests-1-3.jmx new file mode 100644 index 00000000..9ee57d4b --- /dev/null +++ b/utilities/LoadTesting/testinfo/tests/SimpleTests/SimpleTests-1-3.jmx @@ -0,0 +1,1209 @@ + + + + + + false + false + + + + WEBAPP_HOST + ${__property(webapp.host, , localhost)} + = + + + WEBAPP_PORT + ${__property(webapp.port, , 8080)} + = + + + WEBAPP_NAME + ${__property(webapp.name, , vivo)} + = + + + PERSON_URI_FILE + ${__property(file.person.uris, , PersonUris.csv)} + = + + + INFO_RESOURCE_URI_FILE + ${__property(file.infoResource.uris, , InfoResourceUris.csv)} + = + + + AUTHOR_URI_FILE + ${__property(file.author.uris, , AuthorUris.csv)} + = + + + ITERATIONS + ${__property(iterations, , 10)} + = + + + DEFAULT_NAMESPACE + ${__property(default.namespace, , http://vivo.mydomain.edu/individual/)} + = + + + THREADS + ${__property(threads, , 1)} + = + + + + + + + + continue + + false + ${ITERATIONS} + + ${THREADS} + ${THREADS} + 1294759350000 + 1294759350000 + false + + + + + + + false + rfc2109 + + + + + + + ${WEBAPP_HOST} + ${WEBAPP_PORT} + + + + + + true + + + + These pages are run while the user is not logged in. + + + + + + + + + + + + + ${WEBAPP_NAME}/ + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/about + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/browse + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/individuallist?vclassId=http%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2FPerson + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/search?flag1=1&querytext=faculty + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + + + + false + testAdmin@mydomain.edu + = + true + email + + + false + Password + = + true + password + + + + + + + + + + ${WEBAPP_NAME}/programLogin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/siteAdmin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/browse + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/individuallist?vclassId=http%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2FPerson + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/search?flag1=1&querytext=faculty + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + false + PREFIX core: <http://vivoweb.org/ontology/core#> SELECT ?pubUri WHERE {<${DEFAULT_NAMESPACE}${PERSON_URI}> core:authorInAuthorship ?authorshipUri . ?authorshipUri core:linkedInformationResource ?pubUri .} + = + true + query + + + + + + + + + + ${WEBAPP_NAME}/ajax/sparqlQuery + POST + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + pubUri + + Assertion.response_data + false + 2 + + + + + + + + false + PREFIX core: <http://vivoweb.org/ontology/core#> SELECT ?grantUri WHERE {<${DEFAULT_NAMESPACE}${PERSON_URI}> <http://vivoweb.org/ontology/core#hasPrincipalInvestigatorRole> ?grantRole . ?grantRole core:roleIn ?grantUri .} + = + true + query + + + + + + + + + + ${WEBAPP_NAME}/ajax/sparqlQuery + POST + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + grantUri + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + ${WEBAPP_NAME}/logout + GET + true + false + true + false + false + + + + + + + + + + + false + selfEditor@mydomain.edu + = + true + email + + + false + Password + = + true + password + + + + + + + + + + ${WEBAPP_NAME}/programLogin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/browse + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/individuallist?vclassId=http%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2FPerson + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/search?flag1=1&querytext=faculty + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + + + + + + + ${WEBAPP_NAME}/logout + GET + true + false + true + false + false + + + + + + doesn't matter whether we are logged in or not + + + + + + + true + ${DEFAULT_NAMESPACE}${AUTHOR_URI} + = + true + uri + + + false + dynamic + = + true + render_mode + + + false + person_pub_count + = + true + vis + + + false + short + = + true + vis_mode + + + false + vis_container_coauthor + = + true + container + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${AUTHOR_URI_FILE} + false + true + All threads + false + AUTHOR_URI + + + + + drawPubCountVisualization + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + PROFILE_INFO + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + {.+} + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + SHOW_GRANTS_LINK + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + {.+} + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + PROFILE_URL + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + individual + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + PERSON_LEVEL_URL + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + visualization + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + SHOW_AUTHORSHIP_LINK + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + numOfPublications + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + COPI_URL + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + visualization + + Assertion.response_data + false + 2 + + + + + + + + diff --git a/utilities/LoadTesting/testinfo/tests/SimpleTests/SimpleTests-1-4.jmx b/utilities/LoadTesting/testinfo/tests/SimpleTests/SimpleTests-1-4.jmx new file mode 100644 index 00000000..9ee57d4b --- /dev/null +++ b/utilities/LoadTesting/testinfo/tests/SimpleTests/SimpleTests-1-4.jmx @@ -0,0 +1,1209 @@ + + + + + + false + false + + + + WEBAPP_HOST + ${__property(webapp.host, , localhost)} + = + + + WEBAPP_PORT + ${__property(webapp.port, , 8080)} + = + + + WEBAPP_NAME + ${__property(webapp.name, , vivo)} + = + + + PERSON_URI_FILE + ${__property(file.person.uris, , PersonUris.csv)} + = + + + INFO_RESOURCE_URI_FILE + ${__property(file.infoResource.uris, , InfoResourceUris.csv)} + = + + + AUTHOR_URI_FILE + ${__property(file.author.uris, , AuthorUris.csv)} + = + + + ITERATIONS + ${__property(iterations, , 10)} + = + + + DEFAULT_NAMESPACE + ${__property(default.namespace, , http://vivo.mydomain.edu/individual/)} + = + + + THREADS + ${__property(threads, , 1)} + = + + + + + + + + continue + + false + ${ITERATIONS} + + ${THREADS} + ${THREADS} + 1294759350000 + 1294759350000 + false + + + + + + + false + rfc2109 + + + + + + + ${WEBAPP_HOST} + ${WEBAPP_PORT} + + + + + + true + + + + These pages are run while the user is not logged in. + + + + + + + + + + + + + ${WEBAPP_NAME}/ + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/about + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/browse + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/individuallist?vclassId=http%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2FPerson + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/search?flag1=1&querytext=faculty + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + + + + false + testAdmin@mydomain.edu + = + true + email + + + false + Password + = + true + password + + + + + + + + + + ${WEBAPP_NAME}/programLogin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/siteAdmin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/browse + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/individuallist?vclassId=http%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2FPerson + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/search?flag1=1&querytext=faculty + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + false + PREFIX core: <http://vivoweb.org/ontology/core#> SELECT ?pubUri WHERE {<${DEFAULT_NAMESPACE}${PERSON_URI}> core:authorInAuthorship ?authorshipUri . ?authorshipUri core:linkedInformationResource ?pubUri .} + = + true + query + + + + + + + + + + ${WEBAPP_NAME}/ajax/sparqlQuery + POST + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + pubUri + + Assertion.response_data + false + 2 + + + + + + + + false + PREFIX core: <http://vivoweb.org/ontology/core#> SELECT ?grantUri WHERE {<${DEFAULT_NAMESPACE}${PERSON_URI}> <http://vivoweb.org/ontology/core#hasPrincipalInvestigatorRole> ?grantRole . ?grantRole core:roleIn ?grantUri .} + = + true + query + + + + + + + + + + ${WEBAPP_NAME}/ajax/sparqlQuery + POST + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + grantUri + + Assertion.response_data + false + 2 + + + + + + + + + + + + + + ${WEBAPP_NAME}/logout + GET + true + false + true + false + false + + + + + + + + + + + false + selfEditor@mydomain.edu + = + true + email + + + false + Password + = + true + password + + + + + + + + + + ${WEBAPP_NAME}/programLogin + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/browse + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/individuallist?vclassId=http%3A%2F%2Fxmlns.com%2Ffoaf%2F0.1%2FPerson + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/search?flag1=1&querytext=faculty + GET + true + false + true + false + false + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${PERSON_URI} + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + + + + + + + + + + ${WEBAPP_NAME}/display/${INFO_RESOURCE_URI} + GET + true + false + true + false + false + + + + + ${INFO_RESOURCE_URI_FILE} + utf8 + INFO_RESOURCE_URI + + false + true + false + All threads + + + + + + + + + + + + + + ${WEBAPP_NAME}/logout + GET + true + false + true + false + false + + + + + + doesn't matter whether we are logged in or not + + + + + + + true + ${DEFAULT_NAMESPACE}${AUTHOR_URI} + = + true + uri + + + false + dynamic + = + true + render_mode + + + false + person_pub_count + = + true + vis + + + false + short + = + true + vis_mode + + + false + vis_container_coauthor + = + true + container + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${AUTHOR_URI_FILE} + false + true + All threads + false + AUTHOR_URI + + + + + drawPubCountVisualization + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + PROFILE_INFO + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + {.+} + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + SHOW_GRANTS_LINK + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + {.+} + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + PROFILE_URL + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + individual + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + PERSON_LEVEL_URL + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + visualization + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + SHOW_AUTHORSHIP_LINK + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + numOfPublications + + Assertion.response_data + false + 2 + + + + + + + + true + ${DEFAULT_NAMESPACE}${PERSON_URI} + = + true + uri + + + false + utilities + = + true + vis + + + false + COPI_URL + = + true + vis_mode + + + + + + + + + + ${WEBAPP_NAME}/visualizationAjax + GET + true + false + true + false + false + + + + + , + utf8 + ${PERSON_URI_FILE} + false + true + All threads + false + PERSON_URI + + + + + visualization + + Assertion.response_data + false + 2 + + + + + + + + diff --git a/utilities/LoadTesting/tomcat/README.txt b/utilities/LoadTesting/tomcat/README.txt new file mode 100644 index 00000000..d9d3aebe --- /dev/null +++ b/utilities/LoadTesting/tomcat/README.txt @@ -0,0 +1,3 @@ +Contains a standard Tomcat distribution. Currently we have no provision +for testing on multiple versions of Tomcat. + diff --git a/utilities/LoadTesting/versions/README.txt b/utilities/LoadTesting/versions/README.txt new file mode 100644 index 00000000..e3c052a8 --- /dev/null +++ b/utilities/LoadTesting/versions/README.txt @@ -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. +