1# See the file LICENSE for redistribution information.
2#
3# Copyright (c) 1996,2008 Oracle.  All rights reserved.
4#
5# $Id: rpc005.tcl,v 12.7 2008/01/08 20:58:53 bostic Exp $
6#
7# TEST	rpc005
8# TEST	Test RPC server handle ID sharing
9proc rpc005 { } {
10	global __debug_on
11	global __debug_print
12	global errorInfo
13	global rpc_svc
14	global is_hp_test
15	source ./include.tcl
16
17	puts "Rpc005: RPC server handle sharing"
18	puts "Rpc005: Using $rpc_svc"
19	set dpid [rpc_server_start]
20	puts "\tRpc005.a: Started server, pid $dpid"
21
22	#
23	# Wrap the test in a catch statement so we can still kill
24	# the rpc server even if the test fails.
25	#
26	set status [catch {
27		tclsleep 2
28		remote_cleanup $rpc_server $rpc_testdir $testdir
29		puts "\tRpc005.b: Creating environment"
30
31		set testfile "rpc005.db"
32		set testfile1 "rpc005a.db"
33		set subdb1 "subdb1"
34		set subdb2 "subdb2"
35		set home [file tail $rpc_testdir]
36
37		set env [eval {berkdb_env -create -mode 0644 -home $home \
38		    -server $rpc_server -txn}]
39		error_check_good lock_env:open [is_valid_env $env] TRUE
40
41		# You can't open two handles on the same env in
42		# HP-UX, so skip this piece.
43		if { $is_hp_test == 1 } {
44			puts "\tRpc005.c: Skipping for HP-UX."
45		} else {
46			puts "\tRpc005.c: Compare identical and different \
47			    configured envs"
48			set env_ident [eval {berkdb_env -home $home \
49			    -server $rpc_server -txn}]
50			error_check_good \
51			    lock_env:open [is_valid_env $env_ident] TRUE
52
53			set env_diff [eval {berkdb_env -home $home \
54			    -server $rpc_server -txn nosync}]
55			error_check_good \
56			    lock_env:open [is_valid_env $env_diff] TRUE
57
58			error_check_good \
59			    ident:id [$env rpcid] [$env_ident rpcid]
60			error_check_bad \
61			    diff:id [$env rpcid] [$env_diff rpcid]
62
63			error_check_good envclose [$env_diff close] 0
64			error_check_good envclose [$env_ident close] 0
65		}
66
67		puts "\tRpc005.d: Opening a database"
68		set db [eval {berkdb_open -auto_commit -create -btree \
69		    -mode 0644} -env $env $testfile]
70		error_check_good dbopen [is_valid_db $db] TRUE
71
72		puts "\tRpc005.e: Compare identical and different \
73		    configured dbs"
74		set db_ident [eval {berkdb_open -btree} -env $env $testfile]
75		error_check_good dbopen [is_valid_db $db_ident] TRUE
76
77		set db_diff [eval {berkdb_open -btree} -env $env -rdonly \
78		    $testfile]
79		error_check_good dbopen [is_valid_db $db_diff] TRUE
80
81		set db_diff2 [eval {berkdb_open -btree} -env $env -rdonly \
82		    $testfile]
83		error_check_good dbopen [is_valid_db $db_diff2] TRUE
84
85		error_check_good ident:id [$db rpcid] [$db_ident rpcid]
86		error_check_bad diff:id [$db rpcid] [$db_diff rpcid]
87		error_check_good ident2:id [$db_diff rpcid] [$db_diff2 rpcid]
88
89		error_check_good db_close [$db_ident close] 0
90		error_check_good db_close [$db_diff close] 0
91		error_check_good db_close [$db_diff2 close] 0
92		error_check_good db_close [$db close] 0
93
94		puts "\tRpc005.f: Compare with a database and subdatabases"
95		set db [eval {berkdb_open -auto_commit -create -btree \
96		    -mode 0644} -env $env $testfile1 $subdb1]
97		error_check_good dbopen [is_valid_db $db] TRUE
98		set dbid [$db rpcid]
99
100		set db2 [eval {berkdb_open -auto_commit -create -btree \
101		    -mode 0644} -env $env $testfile1 $subdb2]
102		error_check_good dbopen [is_valid_db $db2] TRUE
103		set db2id [$db2 rpcid]
104		error_check_bad 2subdb:id $dbid $db2id
105
106		set db_ident [eval {berkdb_open -btree} -env $env \
107		    $testfile1 $subdb1]
108		error_check_good dbopen [is_valid_db $db_ident] TRUE
109		set identid [$db_ident rpcid]
110
111		set db_ident2 [eval {berkdb_open -btree} -env $env \
112		    $testfile1 $subdb2]
113		error_check_good dbopen [is_valid_db $db_ident2] TRUE
114		set ident2id [$db_ident2 rpcid]
115
116		set db_diff1 [eval {berkdb_open -btree} -env $env -rdonly \
117		    $testfile1 $subdb1]
118		error_check_good dbopen [is_valid_db $db_diff1] TRUE
119		set diff1id [$db_diff1 rpcid]
120
121		set db_diff2 [eval {berkdb_open -btree} -env $env -rdonly \
122		    $testfile1 $subdb2]
123		error_check_good dbopen [is_valid_db $db_diff2] TRUE
124		set diff2id [$db_diff2 rpcid]
125
126		set db_diff [eval {berkdb_open -unknown} -env $env -rdonly \
127		    $testfile1]
128		error_check_good dbopen [is_valid_db $db_diff] TRUE
129		set diffid [$db_diff rpcid]
130
131		set db_diff2a [eval {berkdb_open -btree} -env $env -rdonly \
132		    $testfile1 $subdb2]
133		error_check_good dbopen [is_valid_db $db_diff2a] TRUE
134		set diff2aid [$db_diff2a rpcid]
135
136		error_check_good ident:id $dbid $identid
137		error_check_good ident2:id $db2id $ident2id
138		error_check_bad diff:id $dbid $diffid
139		error_check_bad diff2:id $db2id $diffid
140		error_check_bad diff3:id $diff2id $diffid
141		error_check_bad diff4:id $diff1id $diffid
142		error_check_good diff2a:id $diff2id $diff2aid
143
144		error_check_good db_close [$db_ident close] 0
145		error_check_good db_close [$db_ident2 close] 0
146		error_check_good db_close [$db_diff close] 0
147		error_check_good db_close [$db_diff1 close] 0
148		error_check_good db_close [$db_diff2 close] 0
149		error_check_good db_close [$db_diff2a close] 0
150		error_check_good db_close [$db2 close] 0
151		error_check_good db_close [$db close] 0
152		error_check_good env_close [$env close] 0
153	} res]
154	if { $status != 0 } {
155		puts $res
156	}
157	tclkill $dpid
158}
159