summaryrefslogtreecommitdiff
path: root/cpan/Tie-File/t/33_defer_vs.t
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2009-10-02 17:00:06 +0100
committerNicholas Clark <nick@ccl4.org>2009-10-02 17:00:50 +0100
commita03926b2cd3c47c0a9631ed10568cfe6401527f1 (patch)
tree3fda070268d007c8bc5871a7c64ad270bdae376a /cpan/Tie-File/t/33_defer_vs.t
parent183097aac13f47703f3b0cefdd5ef50f710b01fd (diff)
downloadperl-a03926b2cd3c47c0a9631ed10568cfe6401527f1.tar.gz
Move Tie::File from ext/ to cpan/
Diffstat (limited to 'cpan/Tie-File/t/33_defer_vs.t')
-rw-r--r--cpan/Tie-File/t/33_defer_vs.t125
1 files changed, 125 insertions, 0 deletions
diff --git a/cpan/Tie-File/t/33_defer_vs.t b/cpan/Tie-File/t/33_defer_vs.t
new file mode 100644
index 0000000000..071af77a68
--- /dev/null
+++ b/cpan/Tie-File/t/33_defer_vs.t
@@ -0,0 +1,125 @@
+#!/usr/bin/perl
+#
+# Deferred caching of varying size records
+#
+# 30_defer.t always uses records that are 8 bytes long
+# (9 on \r\n machines.) We might miss some sort of
+# length-calculation bug as a result. This file will run some of the same
+# tests, but with with varying-length records.
+#
+
+use POSIX 'SEEK_SET';
+my $file = "tf$$.txt";
+# print "1..0\n"; exit;
+$: = Tie::File::_default_recsep();
+my $data = "$:1$:22$:";
+my ($o, $n);
+
+print "1..30\n";
+
+my $N = 1;
+use Tie::File;
+print "ok $N\n"; $N++;
+
+open F, "> $file" or die $!;
+binmode F;
+print F $data;
+close F;
+$o = tie @a, 'Tie::File', $file;
+print $o ? "ok $N\n" : "not ok $N\n";
+$N++;
+
+# (3-6) Deferred storage
+$o->defer;
+$a[3] = "333";
+check_contents($data); # nothing written yet
+$a[4] = "4444";
+check_contents($data); # nothing written yet
+
+# (7-8) Flush
+$o->flush;
+check_contents($data . "333$:4444$:"); # now it's written
+
+# (9-12) Deferred writing disabled?
+$a[3] = "999999999";
+check_contents("${data}999999999$:4444$:");
+$a[4] = "88888888";
+check_contents("${data}999999999$:88888888$:");
+
+# (13-18) Now let's try two batches of records
+$#a = 2;
+$o->defer;
+$a[0] = "55555";
+check_contents($data); # nothing written yet
+$a[2] = "aaaaaaaaaa";
+check_contents($data); # nothing written yet
+$o->flush;
+check_contents("55555$:1$:aaaaaaaaaa$:");
+
+# (19-22) Deferred writing past the end of the file
+$o->defer;
+$a[4] = "7777777";
+check_contents("55555$:1$:aaaaaaaaaa$:");
+$o->flush;
+check_contents("55555$:1$:aaaaaaaaaa$:$:7777777$:");
+
+
+# (23-26) Now two long batches
+$o->defer;
+%l = qw(0 2 1 3 2 4 4 5 5 4 6 3);
+for (0..2, 4..6) {
+ $a[$_] = $_ x $l{$_};
+}
+check_contents("55555$:1$:aaaaaaaaaa$:$:7777777$:");
+$o->flush;
+check_contents(join $:, "00", "111", "2222", "", "44444", "5555", "666", "");
+
+# (27-30) Now let's make sure that discarded writes are really discarded
+# We have a 2Mib buffer here, so we can be sure that we aren't accidentally
+# filling it up
+$o->defer;
+for (0, 3, 7) {
+ $a[$_] = "discarded" . $_ x $_;
+}
+check_contents(join $:, "00", "111", "2222", "", "44444", "5555", "666", "");
+$o->discard;
+check_contents(join $:, "00", "111", "2222", "", "44444", "5555", "666", "");
+
+################################################################
+
+
+sub check_contents {
+ my $x = shift;
+
+ my $integrity = $o->_check_integrity($file, $ENV{INTEGRITY});
+ print $integrity ? "ok $N\n" : "not ok $N\n";
+ $N++;
+
+ local *FH = $o->{fh};
+ seek FH, 0, SEEK_SET;
+
+ my $a;
+ { local $/; $a = <FH> }
+ $a = "" unless defined $a;
+ if ($a eq $x) {
+ print "ok $N\n";
+ } else {
+ my $msg = ctrlfix("# expected <$x>, got <$a>");
+ print "not ok $N\n$msg\n";
+ }
+ $N++;
+}
+
+sub ctrlfix {
+ local $_ = shift;
+ s/\n/\\n/g;
+ s/\r/\\r/g;
+ $_;
+}
+
+END {
+ undef $o;
+ untie @a;
+ 1 while unlink $file;
+}
+