#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

# General properties

MAX_WAIT_TIME_IN_MS=60000
MAX_PROJECT_WAIT_TIME_IN_MS=120000

WAIT_TRIES=80

# Users

ADMIN_USERNAME=admin
ADMIN_FULLNAME=admin
ADMIN_PASSWORD=admin123
ADMIN_MAIL=admin@mail.com

# Maven 2 projects to load

MAVEN2_POM_URL=http://localhost:${continuum.port}/example-projects/simple-example/pom.xml
MAVEN2_POM_USERNAME=
MAVEN2_POM_PASSWORD=
MAVEN2_POM_PROJECT_NAME=Continuum Simple Example Project
# values used for "Defined by POM" - tests should clean up this group afterwards if added
MAVEN2_POM_PROJECT_GROUP_NAME=Continuum Simple Example Project
MAVEN2_POM_PROJECT_GROUP_ID=org.apache.continuum.examples.simple
MAVEN2_POM_PROJECT_GROUP_DESCRIPTION=
MAVEN2_POM_PROJECT_GROUP_SCM_ROOT_URL=scm:svn:${svn.base.url}/trunk/simple-example

MAVEN2_PROJECT_WITH_TAG_POM_URL=http://localhost:${continuum.port}/example-projects/continuum-2437-example/pom.xml
MAVEN2_PROJECT_WITH_TAG_POM_PROJECT_NAME=Continuum 2437 Example Project
# values used for "Defined by POM" - tests should clean up this group afterwards if added
MAVEN2_PROJECT_WITH_TAG_POM_PROJECT_GROUP_NAME=Continuum 2437 Example Project
MAVEN2_PROJECT_WITH_TAG_POM_PROJECT_GROUP_ID=org.apache.continuum.examples
MAVEN2_PROJECT_WITH_TAG_POM_PROJECT_GROUP_DESCRIPTION=

MAVEN2_FAILING_PROJECT_POM_URL=http://localhost:${continuum.port}/example-projects/continuum-failing-project/pom.xml
# values used for "Defined by POM" - tests should clean up this group afterwards if added
MAVEN2_FAILING_PROJECT_POM_PROJECT_GROUP_NAME=Continuum Sample Failing Project
MAVEN2_FAILING_PROJECT_POM_PROJECT_GROUP_ID=org.apache.continuum.failing.project
MAVEN2_FAILING_PROJECT_POM_PROJECT_GROUP_DESCRIPTION=Sample project that has a build failure

MAVEN2_QUEUE_TEST_POM_URL=http://localhost:${continuum.port}/example-projects/continuum-build-queue-test-data/pom.xml
MAVEN2_QUEUE_TEST_POM_USERNAME=
MAVEN2_QUEUE_TEST_POM_PASSWORD=
# values used for "Defined by POM" - tests should clean up this group afterwards if added
MAVEN2_QUEUE_TEST_POM_PROJECT_GROUP_NAME=ContinuumBuildQueueTestData
MAVEN2_QUEUE_TEST_POM_PROJECT_GROUP_ID=org.apache.continuum
MAVEN2_QUEUE_TEST_POM_PROJECT_GROUP_DESCRIPTION=Project for testing continuum build queue

# Ant projects to load

ANT_NAME=Sample Ant Project
ANT_DESCRIPTION=This is a sample Ant Project used for testing
ANT_VERSION=1.0.0-SNAPSHOT
ANT_TAG=
ANT_SCM_URL=http://localhost:${continuum.port}/example-projects/ant/
ANT_SCM_USERNAME=
ANT_SCM_PASSWORD=

# Maven 1 projects to load

MAVEN1_POM_URL=http://localhost:${continuum.port}/example-projects/maven-one-projects/valid-project.xml
MAVEN1_POM_USERNAME=
MAVEN1_POM_PASSWORD=

# Shell projects to load

SHELL_PROJECT_NAME=Test Shell Project
SHELL_PROJECT_DESCRIPTION=This is a sample Shell Project used for testing
SHELL_PROJECT_VERSION=1.0.0-SNAPSHOT
SHELL_PROJECT_TAG=
SHELL_PROJECT_SCM_URL=scm:svn:${svn.base.url}/trunk/shell/
SHELL_PROJECT_SCM_USERNAME=
SHELL_PROJECT_SCM_PASSWORD=

# Default project group

DEFAULT_PROJECT_GROUP_NAME=Default Project Group
DEFAULT_PROJECT_GROUP_ID=default
DEFAULT_PROJECT_GROUP_DESCRIPTION=Contains all projects that do not have a group of their own

# Schedule detail data
SCHEDULE_DESCRIPTION=schedule_description
SCHEDULE_EXPR_SECOND=10
SCHEDULE_EXPR_MINUTE=10
SCHEDULE_EXPR_HOUR=20
SCHEDULE_EXPR_DAY_MONTH=*
SCHEDULE_EXPR_MONTH=*
SCHEDULE_EXPR_DAY_WEEK=?
SCHEDULE_EXPR_YEAR=2009
SCHEDULE_MAX_TIME=60000
SCHEDULE_PERIOD=36000

### The following properties should not be shared across groups ###

# Notifier test properties

NOTIFIER_PROJECT_GROUP_NAME=Notifier Project Group
NOTIFIER_PROJECT_GROUP_ID=com.example.notifiers
NOTIFIER_PROJECT_GROUP_DESCRIPTION=Sample projects for testing notifiers
MAIL_NOTIFIER_ADDRESS=test@test.com
IRC_NOTIFIER_HOST=test.com
IRC_NOTIFIER_CHANNEL=test_channel
JABBER_NOTIFIER_HOST=test
JABBER_NOTIFIER_LOGIN=test_login
JABBER_NOTIFIER_PASSWORD=hello
JABBER_NOTIFIER_ADDRESS=test@address.com
MSN_NOTIFIER_ADDRESS=test@address.com
MSN_NOTIFIER_LOGIN=test
MSN_NOTIFIER_PASSWORD=hello
WAGON_NOTIFIER_URL=http://svn.apache.org/repos/asf/maven/pom/trunk/maven/pom.xml
WAGON_SERVER_ID=wagoId

# Maven 1 test properties

MAVEN1_PROJECT_GROUP_NAME=Maven One Project
MAVEN1_PROJECT_GROUP_ID=maven-one-project
MAVEN1_PROJECT_GROUP_DESCRIPTION=This is a sample Maven One Project

MAVEN1_MISSING_REPO_POM_URL=http://localhost:${continuum.port}/example-projects/maven-one-projects/missing-repository-element-project.xml
MAVEN1_EXTENDED_POM_URL=http://localhost:${continuum.port}/example-projects/maven-one-projects/extend-element-project.xml
MAVEN1_UNPARSEABLE_POM_URL=http://localhost:${continuum.port}/example-projects/maven-one-projects/unparseable-content-project.xml

# Maven 2 test properties

MAVEN2_SAME_LETTER_FLAT_POM_URL=http://localhost:${continuum.port}/example-projects/flat-example/flat-parent/pom.xml
MAVEN2_SAME_LETTER_FLAT_PROJECT_GROUP_NAME=Flat Example
MAVEN2_SAME_LETTER_FLAT_PROJECT_GROUP_ID=com.example.flat
MAVEN2_SAME_LETTER_FLAT_PROJECT_GROUP_DESCRIPTION=
MAVEN2_SAME_LETTER_FLAT_PROJECT_GROUP_SCM_ROOT_URL=scm:svn:${svn.base.url}/trunk/flat-example

MAVEN2_NON_DEFAULT_PROJECT_GROUP_NAME=Maven Non-Default Project Group Name
MAVEN2_NON_DEFAULT_PROJECT_GROUP_ID=org.apache.continuum.examples.maven2.nondefaultgroup
MAVEN2_NON_DEFAULT_PROJECT_GROUP_DESCRIPTION=

MAVEN2_MOVE_PROJECT_TARGET_PROJECT_GROUP_NAME=Maven Move Project Target Group Name
MAVEN2_MOVE_PROJECT_TARGET_PROJECT_GROUP_ID=org.apache.continuum.examples.maven2.moveproject
MAVEN2_MOVE_PROJECT_TARGET_PROJECT_GROUP_DESCRIPTION=

# SCM element is missing from pom
MAVEN2_NO_SCM_POM_URL=http://localhost:${continuum.port}/example-projects/maven-two-projects/missing-scm-element-pom.xml
MAVEN2_MISS_CONNECTION_POM_URL=http://localhost:${continuum.port}/example-projects/maven-two-projects/missing-connection-element-pom.xml
MAVEN2_MISS_PARENT_POM_URL=http://localhost:${continuum.port}/example-projects/maven-two-projects/missing-parent-pom.xml
MAVEN2_MISS_SUBPRO_POM_URL=http://localhost:${continuum.port}/example-projects/maven-two-projects/missing-modules-pom.xml

# Ant test properties

ANT_PROJECT_GROUP_NAME=Ant Project Group
ANT_PROJECT_GROUP_ID=com.example.ant
ANT_PROJECT_GROUP_DESCRIPTION=Group for Ant test projects

# Distributed build properties

DISTRIBUTED_PROJECT_GROUP_NAME=Distributed Build Test Project Group
DISTRIBUTED_PROJECT_GROUP_ID=org.apache.continuum.examples.distributed
DISTRIBUTED_PROJECT_GROUP_DESCRIPTION=

DISTRIBUTED_BUILD_ENV_NAME=Distributed Build Env
DISTRIBUTED_BUILD_AGENT_GROUP_NAME=Distributed Build Agent Group
DISTRIBUTED_DUPLICATE_BUILD_ENV=Distributed Duplicate Build Env

# Distributed Release test properties

DIST_RELEASE_PROJECT_GROUP_NAME=Distributed Release Test Project Group
DIST_RELEASE_PROJECT_GROUP_ID=com.example.release
DIST_RELEASE_PROJECT_TAGBASE=${svn.base.url}/tags
DIST_RELEASE_PROJECT_TAG=simple-example-1.0
DIST_RELEASE_PROJECT_VERSION=1.0
DIST_RELEASE_PROJECT_DEVELOPMENT_VERSION=1.1-SNAPSHOT
DIST_RELEASE_PROJECT_SCM_URL=scm:svn:${svn.base.url}/trunk/simple-example

DIST_RELEASE_BUILD_ENV=RELEASE_BUILD_ENV
DIST_RELEASE_BUILD_AGENT_GROUP=RELEASE_BUILDAGENT_GROUP
DIST_RELEASE_NO_AGENT_MESSAGE=Unable to prepare release because build agent

# Release test properties

RELEASE_PROJECT_GROUP_NAME=Release Test Project Group
RELEASE_PROJECT_GROUP_ID=com.example.release.local
RELEASE_PROJECT_TAGBASE=${svn.base.url}/tags
RELEASE_PROJECT_TAG=simple-example-10.0
RELEASE_PROJECT_VERSION=10.0
RELEASE_PROJECT_DEVELOPMENT_VERSION=10.1-SNAPSHOT
RELEASE_PROJECT_SCM_URL=scm:svn:${svn.base.url}/trunk/simple-example

# Report test properties

REPORT_PROJECT_GROUP_NAME=Report Test Project Group
REPORT_PROJECT_GROUP_ID=org.apache.continuum.examples.report
REPORT_PROJECT_GROUP_DESCRIPTION=

# Build definition tests

BUILD_DEFINITION_PROJECT_GROUP_NAME=Build Definition Test Project Group
BUILD_DEFINITION_PROJECT_GROUP_ID=org.apache.continuum.examples.builddefinition
BUILD_DEFINITION_PROJECT_GROUP_DESCRIPTION=Test project group for the build definition project group tests

BUILD_DEFINITION_POM_NAME=pom.xml
BUILD_DEFINITION_GOALS=test
BUILD_DEFINITION_ARGUMENTS=--batch-mode --non-recursive -P!dev
BUILD_DEFINITION_DESCRIPTION=Maven Build Definition Description

BUILD_DEFINITION_ANT_PROJECT_NAME=Build Definition Test Ant Project

# Build queue tests

BUILD_QUEUE_NAME=name_build_queue
QUEUE_SCHEDULE_NAME=queue_schedule

# Build result tests

BUILD_RESULT_PROJECT_GROUP_NAME=Build Result Test Project Group
BUILD_RESULT_PROJECT_GROUP_ID=org.apache.continuum.examples.buildresult
BUILD_RESULT_PROJECT_GROUP_DESCRIPTION=Test project group for the build result project group tests

#####

DEFAULT_PROJ_GRP_NAME=Default Project Group
DEFAULT_PROJ_GRP_ID=default
DEFAULT_PROJ_GRP_DESCRIPTION=Contains all projects that do not have a group of their own

########################
# mavenTwoProject group 
########################

# Properties for testAddMavenTwoProject
M2_POM_URL=http://localhost:${continuum.port}/example-projects/continuum-build-queue-test-data/pom.xml
M2_POM_USERNAME=
M2_POM_PASSWORD=

# Properties for testDeleteMavenTwoProject
M2_DELETE_POM_URL=http://localhost:${continuum.port}/example-projects/simple-example/pom.xml
M2_DELETE_PROJ_GRP_NAME=Continuum Simple Example Project
M2_DELETE_PROJ_GRP_ID=org.apache.continuum.examples.simple

########################
# shellProject group 
########################

SHELL_NAME=Shell Project
SHELL_DESCRIPTION=This is a sample Shell Project used for testing
SHELL_VERSION=1.0.0-SNAPSHOT
SHELL_TAG=
SHELL_SCM_URL=http://localhost:${continuum.port}/example-projects/shell/
SHELL_SCM_USERNAME=
SHELL_SCM_PASSWORD=

SHELL_PROJECT_GROUP_NAME=Shell Test Project Group
SHELL_PROJECT_GROUP_ID=shell.group
SHELL_PROJECT_GROUP_DESCRIPTION=She sells seashells by the seashore

########################
# projectGroup group 
########################
TEST_PROJ_GRP_NAME=Test Project Group Name
TEST_PROJ_GRP_ID=Test Project Group Id
TEST_PROJ_GRP_DESCRIPTION=Test Project Group Description

# Test properties for testDeleteProjectGroup
TEST_DELETE_GRP_NAME=Add then Delete Project Group
TEST_DELETE_GRP_ID=test.delete.project.group
TEST_DELETE_GRP_DESCRIPTION=Test Delete Project Group Description

# Test properties for testProjectGroupMembers
TEST_PROJ_GRP_NAME_ONE=Group
TEST_PROJ_GRP_ID_ONE=Group Id
TEST_PROJ_GRP_DESCRIPTION_ONE=First project group for members test
TEST_PROJ_GRP_NAME_TWO=Group My
TEST_PROJ_GRP_ID_TWO=Group Id My
TEST_PROJ_GRP_DESCRIPTION_TWO=Second project group for members test
TEST_PROJ_GRP_NAME_THREE = My Group
TEST_PROJ_GRP_ID_THREE=My Group Id
TEST_PROJ_GRP_DESCRIPTION_THREE=Third project group for members test

########################
# purge group 
########################
PURGE_REPOSITORY_DESCRIPTION=repository_description
PURGE_REPOSITORY_DAYS=100
PURGE_REPOSITORY_RETETION=3
PURGE_DIRECTORY_DESCRIPTION=directory_description
PURGE_DIRECTORY_DAYS=90
PURGE_DIRECTORY_RETETION=4

########################
# local repository group 
########################
LOCAL_REPOSITORY_NAME=repository_name
LOCAL_REPOSITORY_LOCATION=/usr/m2/repository

########################
# schedules group 
########################
SCHEDULE_NAME=schedule_name

########################
# installations group 
########################
# Correct location for JDK
INSTALL_TOOL_JDK_NAME=JDK6
INSTALL_TOOL_JDK_PATH=${java.home}
# Correct location for maven 2
INSTALL_TOOL_MAVEN_NAME=M9_HOME
INSTALL_TOOL_MAVEN_PATH=${maven.home}
# Not neccesary correct location
INSTALL_VAR_NAME=JDK5
INSTALL_VAR_VARIABLE_NAME=JAVA5_HOME
INSTALL_VAR_PATH=/usr/lib/jvm/java-5-sun-1.5.0.12

########################
# buildEnvironment group 
########################
BUILD_ENV_NAME=APPLICATION_JDK4

########################
# buildTemplate group 
########################
TEMPLATE_NAME=PROJECT_MAVEN_TEMPLATE
TEMPLATE_BUILD_POM_NAME=pom.xml
TEMPLATE_BUILD_GOALS=test
TEMPLATE_BUILD_ARGUMENTS=--batch-mode --non-recursive
TEMPLATE_BUILD_DESCRIPTION=Template Maven Test

########################
# userRoles group
########################
# General
USERROLE_EMAIL=user@localhost.localdomain
USERROLE_PASSWORD=pass123
NEW_USERROLE_PASSWORD=pass12345
# Guest Role
GUEST_USERNAME=guest1
GUEST_FULLNAME=Guest
# Registered User Role
REGISTERED_USERNAME=reg_user
REGISTERED_FULLNAME=Registered User
# System Administrator
SYSAD_USERNAME=sys_admin
SYSAD_FULLNAME=System Administrator
# User Administrator
USERADMIN_USERNAME=user_admin
USERADMIN_FULLNAME=User Administrator
# Continuum Group Project Administrator
GROUPPROJECTADMIN_USERNAME=groupprojectadmin
GROUPPROJECTADMIN_FULLNAME=Continuum Group Project Administrator
# Continuum Group Project Developer
GROUPPROJECTDEVELOPER_USERNAME=groupprojectdev
GROUPPROJECTDEVELOPER_FULLNAME=Continuum Group Project Developer
# Continuum Group Project User
GROUPPROJECTUSER_USERNAME=groupprojectuser
GROUPPROJECTUSER_FULLNAME=Continuum Group Project User
# Continuum Manage Build Environment
MANAGEBUILDENVIRONMENT_USERNAME=managebuildenv
MANAGEBUILDENVIRONMENT_FULLNAME=Continuum Manage Build Environments
# Continuum Manage Build Templates
MANAGEBUILDTEMPLATES_USERNAME=managebuildtemp
MANAGEBUILDTEMPLATES_FULLNAME=Continuum Manage Build Templates
# Continuum Manage Installations
MANAGEINSTALLATIONS_USERNAME=manageinstallations
MANAGEINSTALLATIONS_FULLNAME=Continuum Manage Installations
# Continuum Manage Local Repositories
MANAGELOCALREPOS_USERNAME=managelocalrepo
MANAGELOCALREPOS_FULLNAME=Continuum Manage Local Repositories
# Continuum Manage Purging
MANAGEPURGING_USERNAME=managepurging
MANAGEPURGING_FULLNAME=Continuum Manage Purging
# Continuum Manage Queues
MANAGEQUEUES_USERNAME=managequeues
MANAGEQUEUES_FULLNAME=Continuum Manage Queues
# Continuum Manage Scheduling
MANAGESCHEDULING_USERNAME=manageschedule
MANAGESCHEDULING_FULLNAME=Continuum Manage Scheduling
# Project Administrator
PROJECTADMINISTRATOR_DEFAULTPROJECTGROUP_USERNAME=projectadmin
PROJECTADMINISTRATOR_DEFAULTPROJECTGROUP_FULLNAME=Project Administrator - Default Project Group
# Project Developer
PROJECTDEVELOPER_DEFAULTPROJECTGROUP_USERNAME=projectdev
PROJECTDEVELOPER_DEFAULTPROJECTGROUP_FULLNAME=Project Developer - Default Project Group
# Project User
PROJECTUSER_DEFAULTPROJECTGROUP_USERNAME=projectuser
PROJECTUSER_DEFAULTPROJECTGROUP_FULLNAME=Project User - Default Project Group

########################
# buildAgents group 
########################
BUILD_AGENT_DESCRIPTION=Agent_description
BUILD_AGENT_GROUPNAME=agent_groupname

########################
# appearance
########################
APPEARANCE_SAVE_FOOTER_URL=${baseUrl}/admin/saveFooter.action
