blob: 1ef56d0c7c8be95ecba7bbb830f969dedb22a9a9 [file] [log] [blame]
# Net::ZooKeeper - Perl extension for Apache ZooKeeper
#
# 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.
use Config;
use File::Spec;
use Test::More;
BEGIN {
if ($Config{'useithreads'}) {
plan tests => 10;
}
else {
plan skip_all => 'no thread support';
}
}
use threads;
BEGIN { use_ok('Net::ZooKeeper', qw(:all)) };
my $test_dir;
(undef, $test_dir, undef) = File::Spec->splitpath($0);
require File::Spec->catfile($test_dir, 'util.pl');
my($hosts, $root_path, $node_path) = zk_test_setup(0);
my $zkh = Net::ZooKeeper->new($hosts);
SKIP: {
skip 'no valid handle', 9 unless (defined($zkh));
my($thread) = threads->new(\&thread_test, $zkh);
SKIP: {
skip 'no valid thread', 3 unless (defined($thread));
my(@ret) = $thread->join;
ok((@ret == 3 and $ret[0]),
'CLONE_SKIP(): handle reference after spawning thread');
ok((@ret == 3 and $ret[1]),
'CLONE_SKIP(): scalar handle reference after spawning thread');
ok((@ret == 3 and $ret[2]),
'CLONE_SKIP(): undef handle reference after spawning thread');
}
my $stat = $zkh->stat();
($thread) = threads->new(\&thread_test, $stat);
SKIP: {
skip 'no valid thread', 3 unless (defined($thread));
my(@ret) = $thread->join;
ok((@ret == 3 and $ret[0]),
'stat CLONE_SKIP(): stat handle reference after spawning thread');
ok((@ret == 3 and $ret[1]),
'stat CLONE_SKIP(): scalar stat handle reference after ' .
'spawning thread');
ok((@ret == 3 and $ret[2]),
'stat CLONE_SKIP(): undef stat handle reference after ' .
'spawning thread');
}
my $watch = $zkh->watch();
($thread) = threads->new(\&thread_test, $watch);
SKIP: {
skip 'no valid thread', 3 unless (defined($thread));
my(@ret) = $thread->join;
ok((@ret == 3 and $ret[0]),
'watch CLONE_SKIP(): watch handle reference after spawning thread');
ok((@ret == 3 and $ret[1]),
'watch CLONE_SKIP(): scalar watch handle reference after ' .
'spawning thread');
ok((@ret == 3 and $ret[2]),
'watch CLONE_SKIP(): undef watch handle reference after ' .
'spawning thread');
}
}
sub thread_test
{
my $zkh = shift;
my @ret;
$ret[0] = ref($zkh) ? 1 : 0;
$ret[1] = ($ret[0] and ref($zkh) eq 'SCALAR') ? 1 : 0;
$ret[2] = ($ret[1] and !defined(${$zkh})) ? 1 : 0;
return @ret;
}