Date: Thursday, July 31, 2014 @ 13:42:34 Author: guillaume Revision: 218445
Revamp script 'archlinux-java' Modified: java-common/trunk/PKGBUILD java-common/trunk/bin_archlinux-java java-common/trunk/test_archlinux-java ---------------------+ PKGBUILD | 6 - bin_archlinux-java | 90 +++++++++++--------- test_archlinux-java | 216 ++++++++++++++++++++++++++------------------------ 3 files changed, 170 insertions(+), 142 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2014-07-31 11:20:42 UTC (rev 218444) +++ PKGBUILD 2014-07-31 11:42:34 UTC (rev 218445) @@ -1,7 +1,7 @@ # Maintainer: Guillaume ALAUX <guilla...@archlinux.org> pkgname=java-common pkgver=1 -pkgrel=1 +pkgrel=2 pkgdesc='Common files for Java Environments' arch=('any') url='www.archlinux.org' @@ -21,8 +21,8 @@ sha256sums=('9f0032e47705ce55a615ab3b942720b8447f490d1ff430b214038b81c3019ac2' '8dbafa311f34d23c5bbef71fa942b97b224ebeb330b36195f22a1836285bbb83' - 'd54f54e79ee8104783a12fa7e55f9826f80c26142b1d89a34ffe2529ed78d962' - '90c1ca2f32aedf684048e1c072e03eff6b919a10b9b0e83b182186e7572d11c6' + 'bf614a14c769c28923866e5d0b0b5836ea2111f39a60f74f5b7ac325157a6c1a' + '718c5fc1b7182da6b85b2e5e302c0e418fd2f4a93731c24b8fbd0ee338ae81b3' '622927af9ec374140a878993936f7fdd4206fe069dddfcefc6d4e15fa6d67f39' '65a313a76fd5cc1c58c9e19fbc80fc0e418a4cbfbd46d54b35ed5b6e0025d4ee') Modified: bin_archlinux-java =================================================================== --- bin_archlinux-java 2014-07-31 11:20:42 UTC (rev 218444) +++ bin_archlinux-java 2014-07-31 11:42:34 UTC (rev 218445) @@ -58,6 +58,7 @@ } set_bin_links() { + # TODO this 'unlink' part should be in its own function find -L ${BIN_PATH} -samefile ${WRAPPER_PATH} \ | while read lpath; do if [ ! -x "${DEFAULT_PATH}/bin/$(basename ${lpath})" ]; then @@ -72,19 +73,24 @@ } # $1: Java environment name to set as default -set_default_to() { - check_root +set_default_link_to() { + # FIXME if we do not "unlink", then test_force_set_default_with_default fails + unlink ${DEFAULT_PATH} 2>/dev/null ln -sf $1 ${DEFAULT_PATH} +} + +# $1: Java environment name to set as default +set_java_to() { + set_default_link_to $1 set_bin_links - parent_dir=$(dirname $1) - if is_java_valid ${parent_dir}; then - echo "Warning: '${parent_dir}' looks like a valid JDK whereas you are only setting '$1' as default" - echo "Fix this with 'archlinux-java --force-set ${parent_dir}'" - fi +# parent_dir=$(dirname $1) +# if is_java_valid ${parent_dir}; then +# echo "Warning: '${parent_dir}' looks like a valid JDK whereas you are only setting '$1' as default" +# echo "Fix this with 'archlinux-java --force-set ${parent_dir}'" +# fi } -unset_default() { - check_root +unset_java() { find ${DEFAULT_PATH}/bin ! -type d -perm /a=x \ | while read bpath; do unlink ${BIN_PATH}/$(basename ${bpath}) 2>/dev/null @@ -116,36 +122,42 @@ # $1: Java environment name to try to set try_set_default() { - default_java=$(get_default_java) - if ! is_java_valid ${default_java} || [ "x${default_java}" = "x$1/jre" ]; then - force_set_default $1 - else - echo "The default Java environment is already set to ${default_java}" - echo "Please use 'archlinux-java --force-set $1' if you want to force it" + if is_java_valid $1; then + default_java=$(get_default_java) + if [ "${default_java}" = "$1/jre" ] \ + || ( [ "x${default_java}" != "x" ] && ! is_java_valid ${default_java} ); then + unset_java + fi + if [ "x$(get_default_java)" = "x" ]; then + set_default_link_to $1 + fi + set_bin_links fi + if [ "x$(get_default_java)" != "x$1" ]; then + exit 1 + fi } # $1: Java environment name to set as default force_set_default() { - check_root - if is_java_valid $1; then - if [ "x$(get_default_java ${DEFAULT_PATH})" != "x" ]; then - unset_default - fi - set_default_to $1 - else + if ! is_java_valid $1; then echo "'${JVM_DIR}/$1' is not a valid Java environment path" - exit 3 + exit 1 fi + default=$(get_default_java) + if [ "x$1" != "x${default}" ] || ! is_java_valid ${default}; then + set_default_link_to $1 + fi + set_bin_links } # $1: Java environment name to try to unset try_unset_default() { - default=$(get_default_java) - if [ "x${default}" != "x" -a "x${default}" = "x$1" ]; then - unset_default - else - echo "'$1' is not set as default Java environment" + # This function should be used by pacman '.install' scripts. Its goal is: + # "if the current Java env is set to $1, then remove it" + # So no need to report a failure if current Java is not equal to the one passed as param + if [ "x$1" != "x" -a "x$(get_default_java)" = "x$1" ]; then + unset_java fi } @@ -153,17 +165,17 @@ default=$(get_default_java) if is_java_valid ${default}; then if is_java_valid $(dirname ${default}); then - unset_default - set_default_to $(dirname ${default}) + unset_java + set_java_to $(dirname ${default}) fi else if [ "x${default}" != "x" ]; then - unset_default + unset_java fi to_check=('java-7-openjdk' 'java-7-openjdk/jre' $(get_installed_javas)) for java in ${to_check[@]}; do if ! is_java_valid $(get_default_java) && is_java_valid ${java}; then - set_default_to ${java} + set_java_to ${java} fi done fi @@ -178,18 +190,18 @@ echo "$(basename $0) [ --status | --try-set <JAVA_ENV> | --force-set <JAVA_ENV> | --try-unset <JAVA_ENV> | --fix ]" echo -e "\n\t<JAVA_ENV> must be the name of a Java environment directory available in ${JVM_DIR}\n" echo -e '\t--status\t\tList installed Java environments and enabled one' - echo -e '\t--try-set <JAVA_ENV>\tIf no Java environments is already set as default, set this one' + echo -e '\t--try-set <JAVA_ENV>\tIf no valid Java environments is already set as default, then set this one' echo -e '\t--force-set <JAVA_ENV>\tForce <JAVA_ENV> as default' - echo -e '\t--try-unset <JAVA_ENV>\tIf <JAVA_ENV> is set as default, unset it' - echo -e '\t--fix\t\t\tFix an invalid default Java environment' + echo -e '\t--try-unset <JAVA_ENV>\tIf <JAVA_ENV> is set as default, then unset it' + echo -e '\t--fix\t\t\tFix an invalid default Java environment configuration' } ## Main case $1 in '--status') give_status;; - '--try-set') check_param_count $# 2; try_set_default $2;; - '--force-set') check_param_count $# 2; force_set_default $2;; - '--try-unset') check_param_count $# 2; try_unset_default $2;; - '--fix') fix_default;; + '--try-set') check_root; check_param_count $# 2; try_set_default $2;; + '--force-set') check_root; check_param_count $# 2; force_set_default $2;; + '--try-unset') check_root; check_param_count $# 2; try_unset_default $2;; + '--fix') check_root; fix_default;; *) usage;; esac Modified: test_archlinux-java =================================================================== --- test_archlinux-java 2014-07-31 11:20:42 UTC (rev 218444) +++ test_archlinux-java 2014-07-31 11:42:34 UTC (rev 218445) @@ -45,23 +45,31 @@ # $1: path of Java environment to create create_valid_jre_env() { mkdir -p ${JVM_DIR}/$1/bin - touch ${JVM_DIR}/$1/bin/java - chmod +x ${JVM_DIR}/$1/bin/java + for binary in java keytool orbd; do + touch ${JVM_DIR}/$1/bin/${binary} + chmod +x ${JVM_DIR}/$1/bin/${binary} + done } # $1: path of Java environment to create create_valid_jdk_env() { create_valid_jre_env "$1" - touch ${JVM_DIR}/$1/bin/javac - chmod +x ${JVM_DIR}/$1/bin/javac + for binary in javac javah jhat; do + touch ${JVM_DIR}/$1/bin/${binary} + chmod +x ${JVM_DIR}/$1/bin/${binary} + done create_valid_jre_env "$1/jre" } set_default_for_test() { ln -s $1 ${DEFAULT_PATH} - ln -s ${WRAPPER_PATH} ${BIN_PATH}/java - if [ -x ${DEFAULT_PATH}/bin/javac ]; then - ln -s ${WRAPPER_PATH} ${BIN_PATH}/javac + for binary in java keytool orbd; do + ln -s ${WRAPPER_PATH} ${BIN_PATH}/${binary} + done + if [ -d ${DEFAULT_PATH}/jre ]; then + for binary in javac javah jhat; do + ln -s ${WRAPPER_PATH} ${BIN_PATH}/${binary} + done fi } @@ -72,79 +80,24 @@ } assertDefaultSetTo() { - assertEquals "Default is not set to $1" "$1" "$(readlink ${DEFAULT_PATH})" - assertEquals "PATH has no java binary" "${WRAPPER_PATH}" "$(readlink ${BIN_PATH}/java)" - if [ -d ${DEFAULT_PATH}/jre ]; then - assertEquals "PATH has no javac binary" "${WRAPPER_PATH}" "$(readlink ${BIN_PATH}/javac)" - fi + new_java=$1 + assertEquals "Default points at wrong Java env" "${new_java}" "$(readlink ${DEFAULT_PATH})" + # For all links in /usr/bin that point at the wrapper + for lpath in $(find -L ${BIN_PATH} -samefile ${WRAPPER_PATH}); do + # There is a binary in the JVM bin dir + assertTrue 'Wrong /usr/bin link' "test -x ${JVM_DIR}/${new_java}/bin/$(basename ${lpath})" + done + # For all executable binaries provided by the Java env + for binary in $(find ${JVM_DIR}/${new_java}/bin -type f -perm /a=x); do + # There is a link in /usr/bin + bin_link=${BIN_PATH}/$(basename ${binary}) + assertEquals 'No link in /usr/bin' "${WRAPPER_PATH}" "$(readlink ${bin_link})" + done } -test_valid_java_env_valid() { - create_valid_jre_env "${JAVA_NAME}/jre" - assertTrue 'Does not detect valid Java env' "is_java_valid ${JAVA_NAME}/jre" -} +# give_status -test_valid_java_env_not_valid() { - create_valid_jre_env "non_existing" - assertFalse 'Does not detect invalid Java env' "is_java_valid ${JAVA_NAME}/jre" -} - -test_get_default_java() { - create_valid_jre_env "${JAVA_NAME}/jre" - set_default_for_test "${JAVA_NAME}/jre" - assertEquals 'Wrong default Java found' "${JAVA_NAME}/jre" "$(get_default_java)" -} - -test_get_default_java_no_default() { - create_valid_jre_env "${JAVA_NAME}/jre" - assertNull 'Wrong default Java found' "$(get_default_java)" -} - -test_get_installed_javas() { - JAVA_NAME_FIRST_ALPHA="a$(get_rand_str)" - JAVA_NAME_SECON_ALPHA="b$(get_rand_str)" - JAVA_NAME_THIRD_ALPHA="c$(get_rand_str)" - create_valid_jre_env "${JAVA_NAME_FIRST_ALPHA}/jre" - create_valid_jre_env "${JAVA_NAME_SECON_ALPHA}/jre" - create_valid_jdk_env "${JAVA_NAME_THIRD_ALPHA}" - list=($(get_installed_javas | sort)) - expected=("${JAVA_NAME_FIRST_ALPHA}/jre" "${JAVA_NAME_SECON_ALPHA}/jre" "${JAVA_NAME_THIRD_ALPHA}") - assertTrue "Did not find installed Java environments" "[ '${expected[*]}' == '${list[*]}' ]" -} - -test_get_installed_javas_no_env() { - list=($(get_installed_javas)) - expected=() - assertEquals "List of installed Java envs is not 0" 0 "${#list[@]}" -} - -test_set_default_to() { - create_valid_jre_env "${JAVA_NAME}/jre" - set_default_to "${JAVA_NAME}/jre" - assertEquals 'Success does not yield 0' 0 $? - assertDefaultSetTo "${JAVA_NAME}/jre" -} - -test_set_default_to_jre_but_jdk() { - create_valid_jdk_env "${JAVA_NAME}" - output=$(set_default_to "${JAVA_NAME}/jre") - mess="Warning: '${JAVA_NAME}' looks like a valid JDK" - mess+=" whereas you are only setting '${JAVA_NAME}/jre' as default" - mess+="\nFix this with 'archlinux-java --force-set ${JAVA_NAME}'" - expected=$(echo -e ${mess}) - assertEquals 'Wrong message' "${expected}" "${output}" - assertDefaultSetTo "${JAVA_NAME}/jre" -} - -tests_unset_default() { - create_valid_jre_env "${JAVA_NAME}/jre" - set_default_for_test "${JAVA_NAME}/jre" - unset_default - assertEquals 'Success does not yield 0' 0 $? - assertTrue 'Link was not unset' "[ ! -e ${DEFAULT_PATH} ]" -} - test_give_status() { JAVA_NAME_1="a$(get_rand_str)" JAVA_NAME_2="b$(get_rand_str)" @@ -173,66 +126,126 @@ assertEquals 'Wrong status output' 'No compatible Java environment installed' "${output}" } + +# try_set_default + test_try_set_default_no_default() { + create_valid_jdk_env "${JAVA_NAME}" + output=$(try_set_default "${JAVA_NAME}") + assertEquals 'Wrong status returned' 0 $? + assertDefaultSetTo "${JAVA_NAME}" +} + +test_try_set_default_invalid_default_link() { create_valid_jre_env "${JAVA_NAME}/jre" - try_set_default "${JAVA_NAME}/jre" + set_default_for_test "non_existing" + output=$(try_set_default "${JAVA_NAME}/jre") + assertEquals 'Wrong status returned' 0 $? assertDefaultSetTo "${JAVA_NAME}/jre" } -test_try_set_default_default_exists() { +test_try_set_default_invalid_bin_link() { create_valid_jre_env "${JAVA_NAME}/jre" set_default_for_test "${JAVA_NAME}/jre" + unlink "${BIN_PATH}/java" output=$(try_set_default "${JAVA_NAME}/jre") - mess="The default Java environment is already set to ${JAVA_NAME}/jre" - mess+="\nPlease use 'archlinux-java --force-set ${JAVA_NAME}/jre' if you want to force it" - expected=$(echo -e "${mess}") - assertEquals 'Wrong message' "${expected}" "${output}" + assertEquals 'Wrong status returned' 0 $? assertDefaultSetTo "${JAVA_NAME}/jre" } -test_try_set_default_default_invalid() { +test_try_set_default_default_already_set() { create_valid_jre_env "${JAVA_NAME}/jre" - set_default_for_test "non_existing" - try_set_default "${JAVA_NAME}/jre" + set_default_for_test "${JAVA_NAME}/jre" + output=$(try_set_default "${JAVA_NAME}/jre") + assertEquals 'Wrong status returned' 0 $? assertDefaultSetTo "${JAVA_NAME}/jre" } +test_try_set_default_other_java_set() { + JAVA_NAME_2="$(get_rand_str)" + create_valid_jre_env "${JAVA_NAME}/jre" + create_valid_jdk_env "${JAVA_NAME_2}" + set_default_for_test "${JAVA_NAME_2}" + output=$(try_set_default "${JAVA_NAME}/jre") + assertEquals 'Wrong status returned' 1 $? + assertDefaultSetTo "${JAVA_NAME_2}" +} + test_try_set_default_jdk_where_jre_is_default() { create_valid_jdk_env "${JAVA_NAME}" set_default_for_test "${JAVA_NAME}/jre" - try_set_default "${JAVA_NAME}" + output=$(try_set_default "${JAVA_NAME}") + assertEquals 'Wrong status returned' 0 $? assertDefaultSetTo "${JAVA_NAME}" } -test_force_set_default_no_default() { - create_valid_jre_env "${JAVA_NAME}/jre" - force_set_default "${JAVA_NAME}/jre" - assertDefaultSetTo "${JAVA_NAME}/jre" +test_try_set_default_new_is_invalid() { + output=$(try_set_default "INVALID") + assertEquals 'Wrong status returned' 1 $? + assertDefaultNotSet } + +# force_set_default + +test_force_set_default_new_invalid() { + create_valid_jdk_env "${JAVA_NAME}" + set_default_for_test "${JAVA_NAME}" + output=$(force_set_default "INVALID") + assertEquals 'Wrong status returned' 1 $? + assertEquals 'Wrong message' "'${JVM_DIR}/INVALID' is not a valid Java environment path" "${output}" + assertDefaultSetTo "${JAVA_NAME}" +} + +test_force_set_default_current_invalid() { + create_valid_jdk_env "${JAVA_NAME}" + set_default_for_test "INVALID" + output=$(force_set_default "${JAVA_NAME}") + assertEquals 'Wrong status returned' 0 $? + assertDefaultSetTo "${JAVA_NAME}" +} + +test_force_set_default_same_java() { + create_valid_jdk_env "${JAVA_NAME}" + set_default_for_test "${JAVA_NAME}" + unlink ${BIN_PATH}/java + output=$(force_set_default "${JAVA_NAME}") + assertEquals 'Wrong status returned' 0 $? + assertDefaultSetTo "${JAVA_NAME}" +} + test_force_set_default_with_default() { create_valid_jre_env "${JAVA_NAME}/jre" set_default_for_test "${JAVA_NAME}/jre" JAVA_NAME_2="$(get_rand_str)" create_valid_jre_env "${JAVA_NAME_2}/jre" - force_set_default "${JAVA_NAME_2}/jre" + output=$(force_set_default "${JAVA_NAME_2}/jre") + assertEquals 'Wrong status returned' 0 $? assertDefaultSetTo "${JAVA_NAME_2}/jre" } +test_force_set_default_no_default() { + create_valid_jre_env "${JAVA_NAME}/jre" + output=$(force_set_default "${JAVA_NAME}/jre") + assertEquals 'Wrong status returned' 0 $? + assertDefaultSetTo "${JAVA_NAME}/jre" +} + test_force_set_default_target_invalid() { create_valid_jre_env "${JAVA_NAME}/jre" - output=$(force_set_default "non_existing") - expected="'${JVM_DIR}/non_existing' is not a valid Java environment path" + output=$(force_set_default "INVALID") + assertEquals 'Wrong status returned' 1 $? + expected="'${JVM_DIR}/INVALID' is not a valid Java environment path" assertEquals 'Wrong message' "${expected}" "${output}" assertDefaultNotSet } -#no_default + +# try_unset_default + test_try_unset_default_no_default() { create_valid_jdk_env "${JAVA_NAME}" - output=$(try_unset_default "${JAVA_NAME}") - expected="'${JAVA_NAME}' is not set as default Java environment" - assertEquals 'Wrong message' "${expected}" "${output}" + try_unset_default "${JAVA_NAME}" assertDefaultNotSet } @@ -239,9 +252,9 @@ test_try_unset_default_default_not_target() { create_valid_jre_env "${JAVA_NAME}/jre" set_default_for_test "${JAVA_NAME}/jre" - output=$(try_unset_default "other_java") - expected="'other_java' is not set as default Java environment" - assertEquals 'Wrong message' "${expected}" "${output}" + JAVA_NAME_2=$(get_rand_str) + create_valid_jdk_env "${JAVA_NAME_2}" + try_unset_default "${JAVA_NAME_2}" assertDefaultSetTo "${JAVA_NAME}/jre" } @@ -252,6 +265,9 @@ assertDefaultNotSet } + +# fix_default + test_fix_default_default_valid() { create_valid_jre_env "${JAVA_NAME}/jre" set_default_for_test "${JAVA_NAME}/jre"