File: 12_all_clients.t

package info (click to toggle)
libtest-poe-server-tcp-perl 1.14-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 204 kB
  • ctags: 47
  • sloc: perl: 539; makefile: 2
file content (130 lines) | stat: -rw-r--r-- 2,709 bytes parent folder | download | duplicates (5)
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
use strict;
use Socket;
use Test::More;
use POE qw(Wheel::SocketFactory Wheel::ReadWrite Filter::Line);
use Test::POE::Server::TCP;

my %data = (
	tests => [ 
		[ '+OK' => 'cock' ], 
		[ '-ERR' => 'quit' ],
	],
	clients => 2,
);

plan tests => 14;

POE::Session->create(
  package_states => [
	'main' => [qw(
			_start
			_sock_up
			_sock_fail
			_sock_in
			_sock_err
			testd_registered
			testd_connected
			testd_disconnected
			testd_client_input
			testd_client_flushed
	)],
  ],
  heap => \%data,
);

$poe_kernel->run();
exit 0;

sub _start {
  $_[HEAP]->{testd} = Test::POE::Server::TCP->spawn(
	address => '127.0.0.1',
	port => 0,
	options => { trace => 0 },
  );
  isa_ok( $_[HEAP]->{testd}, 'Test::POE::Server::TCP' );
  return;
}

sub testd_registered {
  my ($heap,$object) = @_[HEAP,ARG0];
  isa_ok( $object, 'Test::POE::Server::TCP' );
  $heap->{port} = $object->port();
  for ( 1 .. $heap->{clients} ) {
    my $factory = POE::Wheel::SocketFactory->new(
	RemoteAddress  => '127.0.0.1',
	RemotePort     => $heap->{port},
	SuccessEvent   => '_sock_up',
	FailureEvent   => '_sock_fail',
    );
    $heap->{factories}->{ $factory->ID } = $factory;
  }
  return;
}

sub _sock_up {
  my ($heap,$socket,$fact_id) = @_[HEAP,ARG0,ARG3];
  delete $heap->{factories}->{ $fact_id };
  my $wheel = POE::Wheel::ReadWrite->new(
	Handle => $socket,
	InputEvent => '_sock_in',
	ErrorEvent => '_sock_err',
  );
  $heap->{wheels}->{ $wheel->ID } = $wheel;
  $heap->{numbers}->{ $wheel->ID } = 0;
  return;
}

sub _sock_fail {
  my ($heap,$fact_id) = @_[HEAP,ARG3];
  delete $heap->{factory}->{ $fact_id };
  $heap->{clients}--;
  $heap->{testd}->shutdown() if $heap->{clients} <= 0;
  return;
}

sub _sock_in {
  my ($heap,$input,$wheel_id) = @_[HEAP,ARG0,ARG1];
  is($input,'HELLO ALL','Input from server to all');
  $heap->{wheels}->{ $wheel_id }->put('quit');
  return;
}

sub _sock_err {
  my ($heap,$wheel_id) = @_[HEAP,ARG3];
  delete $heap->{wheels}->{ $wheel_id };
  pass("Disconnected");
  $heap->{clients}--;
  $heap->{testd}->shutdown() if $heap->{clients} <= 0;
  return;
}

sub testd_connected {
  my ($heap,$state,$id) = @_[HEAP,STATE,ARG0];
  pass($state);
  $heap->{connected}++;
  return unless $heap->{connected} == $heap->{clients};
  $poe_kernel->post( $_[SENDER], 'send_to_all_clients', 'HELLO ALL' );
  return;
}

sub testd_disconnected {
  pass($_[STATE]);
  return;
}

sub testd_client_flushed {
  pass($_[STATE]);
  return;
}

sub testd_client_input {
  my ($sender,$id,$input) = @_[SENDER,ARG0,ARG1];
  my $testd = $_[SENDER]->get_heap();
  pass($_[STATE]);
  if ( $input eq 'quit' ) {
    $testd->terminate( $id );
    return;
  }
  $testd->send_to_client( $id, '-ERR' );
  return;
}