]> git.vpit.fr Git - perl/modules/autovivification.git/commitdiff
Add a basic thread safety test in t/50-threads.t
authorVincent Pit <vince@profvince.com>
Tue, 1 Jun 2010 16:08:12 +0000 (18:08 +0200)
committerVincent Pit <vince@profvince.com>
Tue, 1 Jun 2010 16:08:12 +0000 (18:08 +0200)
MANIFEST
t/50-threads.t [new file with mode: 0644]

index 0658bcd4a8af861ac2e59772fd5618771303bfd7..28df70afd12ccf99eaa1c76e673ab810f45e4b53 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -18,6 +18,7 @@ t/33-array-tied.t
 t/40-scope.t
 t/41-padsv.t
 t/42-deparse.t
+t/50-threads.t
 t/51-threads-teardown.t
 t/91-pod.t
 t/92-pod-coverage.t
diff --git a/t/50-threads.t b/t/50-threads.t
new file mode 100644 (file)
index 0000000..99aa1ad
--- /dev/null
@@ -0,0 +1,81 @@
+#!perl -T
+
+use strict;
+use warnings;
+
+use Config qw/%Config/;
+
+BEGIN {
+ if (!$Config{useithreads}) {
+  require Test::More;
+  Test::More->import;
+  plan(skip_all => 'This perl wasn\'t built to support threads');
+ }
+}
+
+use threads;
+
+use Test::More;
+
+BEGIN {
+ require autovivification;
+ if (autovivification::A_THREADSAFE()) {
+  plan tests => 10 * 2 * 3 * (1 + 2);
+  defined and diag "Using threads $_" for $threads::VERSION;
+ } else {
+  plan skip_all => 'This autovivification isn\'t thread safe';
+ }
+}
+
+{
+ no autovivification;
+
+ sub try {
+  my $tid = threads->tid();
+
+  for my $run (1 .. 2) {
+   {
+    my $x;
+    my $y = $x->{foo};
+    is $x, undef, "fetch does not autovivify at thread $tid run $run";
+   }
+   {
+    my $x;
+    my $y = exists $x->{foo};
+    is $x, undef, "exists does not autovivify at thread $tid run $run";
+   }
+   {
+    my $x;
+    my $y = delete $x->{foo};
+    is $x, undef, "delete does not autovivify at thread $tid run $run";
+   }
+
+SKIP:
+   {
+    skip 'Hints aren\'t propagated into eval STRING below perl 5.10' => 3 * 2
+                                                             unless $] >= 5.010;
+    {
+     my $x;
+     eval 'my $y = $x->{foo}';
+     is $@, '',    "fetch in eval does not croak at thread $tid run $run";
+     is $x, undef, "fetch in eval does not autovivify at thread $tid run $run";
+    }
+    {
+     my $x;
+     eval 'my $y = exists $x->{foo}';
+     is $@, '',    "exists in eval does not croak at thread $tid run $run";
+     is $x, undef, "exists in eval does not autovivify at thread $tid run $run";
+    }
+    {
+     my $x;
+     eval 'my $y = delete $x->{foo}';
+     is $@, '',    "delete in eval does not croak at thread $tid run $run";
+     is $x, undef, "delete in eval does not autovivify at thread $tid run $run";
+    }
+   }
+  }
+ }
+}
+
+my @t = map threads->create(\&try), 1 .. 10;
+$_->join for @t;