typester (owner)

Revisions

gist: 175246 Download_button fork
public
Public Clone URL: git://gist.github.com/175246.git
Embed All Files: show embed
0001-fixed-a-cleanup-bug.patch #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
From e3d97037aafb701374c02bf5cd1a3d7e2454188c Mon Sep 17 00:00:00 2001
From: Daisuke Murase <typester@cpan.org>
Date: Wed, 26 Aug 2009 11:03:06 +0900
Subject: [PATCH] fixed a cleanup bug
 
---
 lib/AnyEvent/Twitter/Stream.pm | 4 +-
 t/cleanup.t | 62 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 64 insertions(+), 2 deletions(-)
 create mode 100644 t/cleanup.t
 
diff --git a/lib/AnyEvent/Twitter/Stream.pm b/lib/AnyEvent/Twitter/Stream.pm
index ade0139..0fd3ed1 100644
--- a/lib/AnyEvent/Twitter/Stream.pm
+++ b/lib/AnyEvent/Twitter/Stream.pm
@@ -35,7 +35,7 @@ sub new {
 
     my $self = bless {}, $class;
 
- http_get $uri,
+ $self->{connection_guard} = http_get $uri,
         headers => { Authorization => "Basic $auth" },
         on_header => sub {
             my($headers) = @_;
@@ -47,7 +47,6 @@ sub new {
         want_body_handle => 1, # for some reason on_body => sub {} doesn't work :/
         sub {
             my ($handle, $headers) = @_;
- Scalar::Util::weaken($self);
             $self->{_handle} = $handle;
 
             if ($handle) {
@@ -68,6 +67,7 @@ sub new {
                 $self->{guard} = AnyEvent::Util::guard { undef $reader };
             }
         };
+ Scalar::Util::weaken($self);
 
     return $self;
 }
diff --git a/t/cleanup.t b/t/cleanup.t
new file mode 100644
index 0000000..c7b78f2
--- /dev/null
+++ b/t/cleanup.t
@@ -0,0 +1,62 @@
+use Test::Base;
+use Test::TCP;
+
+plan 'no_plan';
+
+use AnyEvent::Socket;
+use AnyEvent::Handle;
+
+use AnyEvent::Twitter::Stream;
+
+my $port = empty_port;
+
+# mock server
+my $connect_state = 'initial';
+my $server = tcp_server undef, $port, sub {
+ my ($fh) = @_ or die $!;
+
+ $connect_state = 'connected';
+
+ my $handle; $handle = AnyEvent::Handle->new(
+ fh => $fh,
+ on_eof => sub {
+ $connect_state = 'disconnected';
+ },
+ on_error => sub {
+ die $_[2];
+ undef $handle;
+ },
+ on_read => sub {
+ $_[0]->push_read( line => sub {} ); # ignore input
+ },
+ );
+};
+
+# mock URI::query_form;
+{
+ require URI::_query;;
+ no warnings 'redefine', 'once';
+ *URI::_query::query_form = sub {
+ $_[0] = URI->new("http://127.0.0.1:$port/")
+ };
+}
+
+my $cv = AnyEvent->condvar;
+
+{
+ my $stream = AnyEvent::Twitter::Stream->new( method => 'firehose' );
+}
+# $stream destroyed here
+
+{
+ my $t; $t = AnyEvent->timer(
+ after => 0.5,
+ cb => sub {
+ undef $t;
+ is $connect_state, 'disconnected', 'disconnected ok';
+ $cv->send;
+ },
+ );
+}
+
+$cv->recv;
--
1.6.0.2