1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-02-24 23:14:14 +00:00
cde/src/cmd/ksh93/tests/readonly.sh
Martijn Dekker 3667aa4f71 Make readonly variables exportable again (re: 264ba48b)
$ /usr/local/bin/ksh -c 'readonly v=1; export v'
/usr/local/bin/ksh: export: v: is read only

Every POSIX shell (even zsh, as of 5.8) allows this. So did ksh,
until the referenced commit.

src/cmd/ksh93/bltins/typeset.c: setall():
- Allow setting attributes on a readonly variable if any of
  NV_ASSIGN (== NV_NOFREE), NV_EXPORT or NV_RDONLY are the only
  flag bits that are set. This allows readonly, export, typeset -r,
  typeset -x, and typeset -rx on variable arguments without an
  assignment. Note that NV_ASSIGN is set for the first variable
  argument even though it is not an assignment, so we must allow
  it. The logic (or lack thereof) of that is yet to be worked out.

src/cmd/ksh93/tests/readonly.sh:
- Tests.

Resolves: https://github.com/ksh93/ksh/issues/258
2021-04-08 06:40:25 +01:00

344 lines
9.7 KiB
Bash
Executable file

########################################################################
# #
# This file is part of the ksh 93u+m package #
# Copyright (c) 1982-2012 AT&T Intellectual Property #
# Copyright (c) 2021 Contributors to ksh 93u+m #
# <https://github.com/ksh93/ksh> #
# and is licensed under the #
# Eclipse Public License, Version 1.0 #
# #
# A copy of the License is available at #
# http://www.eclipse.org/org/documents/epl-v10.html #
# (with md5 checksum b35adb5213ca9657e911e9befb180842) #
# #
# hyenias #
# #
########################################################################
. "${SHTESTS_COMMON:-${0%/*}/_common}"
rtests=(
(
ini='typeset -ri x=900'
chg='typeset -R1 x'
res='typeset -p x'
exp='typeset -r -i x=900'
)
(
ini='typeset -ri x=900'
chg='typeset -X x; typeset -L1 x; typeset -i x'
res='typeset -p x'
exp='typeset -r -i x=900'
)
(
ini='typeset -L3 x=0123; readonly x'
chg='typeset -Z5 x'
res='typeset -p x'
exp='typeset -r -L 3 x=012'
)
(
ini='typeset -rL3 x=0123'
chg='typeset -R5 x'
res='typeset -p x'
exp='typeset -r -L 3 x=012'
)
(
ini='typeset -rL3 x=0123'
chg='typeset -L5 x'
res='typeset -p x'
exp='typeset -r -L 3 x=012'
)
(
ini='typeset -R3 x; typeset -r x'
chg='x=0'
res='typeset -p x'
exp='typeset -r -R 3 x'
)
(
ini='set -A arr[0] a b c; readonly arr'
chg='arr[1]=1'
res='typeset -p arr'
exp='typeset -r -a arr=((a b c) )'
)
(
ini='set -A arr[0] a b c; readonly arr'
chg='arr[0][1]=d'
res='typeset -p arr'
exp='typeset -r -a arr=((a b c) )'
)
(
ini='set -A arr[0] a b c; readonly arr'
chg='set +A arr 1'
res='typeset -p arr'
exp='typeset -r -a arr=((a b c) )'
)
(
ini='typeset -a arr=((a b c) 1); readonly arr'
chg='arr[1]=d'
res='typeset -p arr'
exp='typeset -r -a arr=((a b c) 1)'
)
(
ini='typeset -ra arr=((a b c) 1)'
chg='arr[1]=d'
res='typeset -p arr'
exp='typeset -r -a arr=((a b c) 1)'
)
(
ini='typeset -ra arr=((a b c) 1)'
chg='arr[1]=()'
res='typeset -p arr'
exp='typeset -r -a arr=((a b c) 1)'
)
(
ini='typeset -r -a arr=((a b c) 1)'
chg='arr[0][1]=d'
res='typeset -p arr'
exp='typeset -r -a arr=((a b c) 1)'
)
(
ini='typeset -r -a arr=((a b c) 1)'
chg='arr[0][1]=()'
res='typeset -p arr'
exp='typeset -r -a arr=((a b c) 1)'
)
(
ini='typeset -r -a arr=((a b c) 1)'
chg='arr[0][1]=(d)'
res='typeset -p arr'
exp='typeset -r -a arr=((a b c) 1)'
)
(# For a move, the unset should be blocked but copy succeeds.
ini='readonly old=RDONLY'
chg='typeset -m new=old'
res='typeset -p old new'
exp=$'typeset -r old=RDONLY\nnew=RDONLY'
)
(
ini='typeset -C arr=(typeset -r -a alphas=(a b c);name=x)'
chg='arr.name=y; arr.alphas[1]=b'
res='typeset -p arr'
exp='typeset -C arr=(typeset -r -a alphas=(a b c);name=y)'
)
(
ini='typeset -C arr=(typeset -r -a alphas=(a b c);name=x)'
chg='arr.name=y; arr.alphas[1]=()'
res='typeset -p arr'
exp='typeset -C arr=(typeset -r -a alphas=(a b c);name=y)'
)
(
ini='typeset -C arr=(typeset -r -a alphas=(a b c);name=x)'
chg='arr.name=y; arr.alphas[1]=(b)'
res='typeset -p arr'
exp='typeset -C arr=(typeset -r -a alphas=(a b c);name=y)'
)
(
ini='arr=(alphas=(a b c);name=x); readonly arr.alphas'
chg='arr.alphas[1]=([b]=5)'
res='typeset -p arr arr.alphas'
exp=$'typeset -C arr=(typeset -r -a alphas=(a b c);name=x)\ntypeset -r -a arr.alphas=(a b c)'
)
(
ini='arr=(alphas=(a b c);name=x); readonly arr.alphas'
chg='arr.alphas[1]=(b)'
res='typeset -p arr arr.alphas'
exp=$'typeset -C arr=(typeset -r -a alphas=(a b c);name=x)\ntypeset -r -a arr.alphas=(a b c)'
)
(
ini='typeset -ra -E arr=(0 1 2 3)'
chg='arr[1]=()'
res='typeset -p arr'
exp='typeset -r -a -E arr=(0 1 2 3)'
)
(
ini='typeset -T FB_t=(typeset x=foo y=bar; typeset -r z=${_.y}; create() { _.y=bam; }; )'
chg='FB_t fb; fb.z=foo'
res='typeset -p fb'
exp='FB_t fb=(x=foo;y=bam;typeset -r z=bar)'
)
(
ini='typeset -ra arr=((a b c) 1)'
chg='arr+=(2)'
res='typeset -p arr'
exp='typeset -r -a arr=((a b c) 1)'
)
(
ini='typeset -ra arr=((a b c) 1)'
chg='arr[0]+=(d)'
res='typeset -p arr'
exp='typeset -r -a arr=((a b c) 1)'
)
(
ini='typeset -ra -i arr=((10 11 12) 3 4)'
chg='(( arr[1] += 2 ))'
res='typeset -p arr'
exp='typeset -r -a -i arr=((10 11 12) 3 4)'
)
(
ini='typeset -ra -i arr=((10 11 12) 3 4)'
chg='(( arr[1] -= 2 ))'
res='typeset -p arr'
exp='typeset -r -a -i arr=((10 11 12) 3 4)'
)
(
ini='typeset -ra -i arr=((10 11 12) 3 4)'
chg='(( arr[1] *= 2 ))'
res='typeset -p arr'
exp='typeset -r -a -i arr=((10 11 12) 3 4)'
)
(
ini='typeset -ra -i arr=((10 11 12) 3 4)'
chg='(( arr[1] /= 2 ))'
res='typeset -p arr'
exp='typeset -r -a -i arr=((10 11 12) 3 4)'
)
(
ini='typeset -ra -i arr=((10 11 12) 3 4)'
chg='(( arr[0][1] += 2 ))'
res='typeset -p arr'
exp='typeset -r -a -i arr=((10 11 12) 3 4)'
)
(
ini='typeset -ra -i arr=((10 11 12) 3 4)'
chg='(( arr[0][1] -= 2 ))'
res='typeset -p arr'
exp='typeset -r -a -i arr=((10 11 12) 3 4)'
)
(
ini='typeset -ra -i arr=((10 11 12) 3 4)'
chg='(( arr[0][1] *= 2 ))'
res='typeset -p arr'
exp='typeset -r -a -i arr=((10 11 12) 3 4)'
)
(
ini='typeset -ra -i arr=((10 11 12) 3 4)'
chg='(( arr[0][1] /= 2 ))'
res='typeset -p arr'
exp='typeset -r -a -i arr=((10 11 12) 3 4)'
)
(
ini='typeset -r -A arr=([a]=10 [b]=20 [c]=30)'
chg='arr[b]=40'
res='typeset -p arr'
exp='typeset -r -A arr=([a]=10 [b]=20 [c]=30)'
)
(
ini='typeset -r -A arr=([a]=10 [b]=20 [c]=30)'
chg='arr[b]=()'
res='typeset -p arr'
exp='typeset -r -A arr=([a]=10 [b]=20 [c]=30)'
)
(
ini='typeset -r -A arr=([a]=10 [b]=20 [c]=30)'
chg='arr[b]=(40)'
res='typeset -p arr'
exp='typeset -r -A arr=([a]=10 [b]=20 [c]=30)'
)
(
ini='typeset -r -A arr=([a]=([10]=X [11]=XI [12]=XII) [b]=20)'
chg='arr[c]=30'
res='typeset -p arr'
exp='typeset -r -A arr=([a]=([10]=X [11]=XI [12]=XII) [b]=20)'
)
(
ini='typeset -r -A arr=([a]=([10]=X [11]=XI [12]=XII) [b]=20)'
chg='arr[c]+=30'
res='typeset -p arr'
exp='typeset -r -A arr=([a]=([10]=X [11]=XI [12]=XII) [b]=20)'
)
(
ini='typeset -r -A arr=([a]=([10]=X [11]=XI [12]=XII) [b]=20)'
chg='arr[a][11]=0xb'
res='typeset -p arr'
exp='typeset -r -A arr=([a]=([10]=X [11]=XI [12]=XII) [b]=20)'
)
(
ini='typeset -r -A arr=([a]=([10]=X [11]=XI [12]=XII) [b]=20)'
chg='arr[a][11]+=0xb'
res='typeset -p arr'
exp='typeset -r -A arr=([a]=([10]=X [11]=XI [12]=XII) [b]=20)'
)
(
ini='typeset -r -A arr=([a]=([10]=X [11]=XI [12]=XII) [b]=20)'
chg='arr[a][13]=XIII'
res='typeset -p arr'
exp='typeset -r -A arr=([a]=([10]=X [11]=XI [12]=XII) [b]=20)'
)
(
ini='typeset -r -A -i arr=([a]=10 [b]=20 [c]=30)'
chg='(( arr[b] += 5 ))'
res='typeset -p arr'
exp='typeset -r -A -i arr=([a]=10 [b]=20 [c]=30)'
)
(
ini='typeset -r -A -i arr=([a]=10 [b]=20 [c]=30)'
chg='(( arr[b] -= 5 ))'
res='typeset -p arr'
exp='typeset -r -A -i arr=([a]=10 [b]=20 [c]=30)'
)
(
ini='typeset -r -A -i arr=([a]=10 [b]=20 [c]=30)'
chg='(( arr[b] *= 5 ))'
res='typeset -p arr'
exp='typeset -r -A -i arr=([a]=10 [b]=20 [c]=30)'
)
(
ini='typeset -r -A -i arr=([a]=10 [b]=20 [c]=30)'
chg='(( arr[b] /= 5 ))'
res='typeset -p arr'
exp='typeset -r -A -i arr=([a]=10 [b]=20 [c]=30)'
)
(
ini='typeset -r -A -i arr=([a]=([X]=10 [XI]=11 [XII]=12) [b]=20)'
chg='(( arr[a][XI] += 5 ))'
res='typeset -p arr'
exp='typeset -r -A -i arr=([a]=([X]=10 [XI]=11 [XII]=12) [b]=20)'
)
(
ini='typeset -r -A -i arr=([a]=([X]=10 [XI]=11 [XII]=12) [b]=20)'
chg='(( arr[a][XI] -= 5 ))'
res='typeset -p arr'
exp='typeset -r -A -i arr=([a]=([X]=10 [XI]=11 [XII]=12) [b]=20)'
)
(
ini='typeset -r -A -i arr=([a]=([X]=10 [XI]=11 [XII]=12) [b]=20)'
chg='(( arr[a][XI] *= 5 ))'
res='typeset -p arr'
exp='typeset -r -A -i arr=([a]=([X]=10 [XI]=11 [XII]=12) [b]=20)'
)
(
ini='typeset -r -A -i arr=([a]=([X]=10 [XI]=11 [XII]=12) [b]=20)'
chg='(( arr[a][XI] /= 5 ))'
res='typeset -p arr'
exp='typeset -r -A -i arr=([a]=([X]=10 [XI]=11 [XII]=12) [b]=20)'
)
)
typeset -i i
n=${#rtests[@]}
for ((i=0; i<$n; i++))
do
got=$(
trap "${rtests[$i].res}" EXIT
eval "${rtests[$i].ini}"
eval "${rtests[$i].chg}" 2>&1
)
[[ $got == *$': is read only\n'* ]] || err_exit "Readonly variable did not warn for rtests[$i]: "\
"setup='${rtests[$i].ini}', change='${rtests[$i].chg}'"
got=${got#*$': is read only\n'}
[[ ${rtests[$i].exp} == "$got" ]] || err_exit "Readonly variable changed on rtests[$i]: "\
"expected '${rtests[$i].exp}', got '$got'"
done
unset i n got rtests
# ======
# readonly variables should still accept setting the readonly or export attributes
# https://github.com/ksh93/ksh/issues/258
(readonly v=1; readonly v) 2>/dev/null || err_exit "readonly variable cannot be set readonly (1)"
(readonly v=1; typeset -r v) 2>/dev/null || err_exit "readonly variable cannot be set readonly (2)"
(readonly v=1; export v) 2>/dev/null || err_exit "readonly variable cannot be exported (1)"
(readonly v=1; typeset -x v) 2>/dev/null || err_exit "readonly variable cannot be exported (2)"
(readonly v=1; typeset -rx v) 2>/dev/null || err_exit "readonly variable cannot be set readonly and exported"
# ======
exit $((Errors<125?Errors:125))