summaryrefslogtreecommitdiff
path: root/TAO/tests/Bug_2702_Regression/fakeserver.pm
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tests/Bug_2702_Regression/fakeserver.pm')
-rw-r--r--TAO/tests/Bug_2702_Regression/fakeserver.pm151
1 files changed, 151 insertions, 0 deletions
diff --git a/TAO/tests/Bug_2702_Regression/fakeserver.pm b/TAO/tests/Bug_2702_Regression/fakeserver.pm
new file mode 100644
index 00000000000..87f2a676f81
--- /dev/null
+++ b/TAO/tests/Bug_2702_Regression/fakeserver.pm
@@ -0,0 +1,151 @@
+package fakeserver;
+
+use Socket;
+use IO::Socket;
+
+sub new {
+ my $self = { };
+ $self->{'filebits'} = '';
+ $self->{'connections'} = { };
+ $self->{'server'} = '';
+ $self->{'server_fileno'} = '';
+ $self->{''} = '';
+}
+
+sub run {
+ my $self = shift;
+ my $timeoutafter = shift; # in seconds
+ my $rout;
+ while ( 1 ) {
+ print STDERR "fakeserver: Loop\n";
+
+ select( undef, undef, undef, 1 );
+
+ my ($n, $left) = select( $rout = $filebits, undef, undef, $timeoutafter); # Time out after 15 seconds
+ if ($n == 0) {
+ print STDERR "fakeserver: Terminating normally\n";
+ exit 0;
+ }
+
+ my $routs = unpack("b*", $rout);
+ print STDERR "fakeserver: Select $routs\n";
+ my $pos = index( $routs,'1');
+ while ( $pos >= 0 ) {
+ $self->HandleFile( $pos );
+ $pos = index( $routs,'1', $pos+1);
+ }
+ }
+}
+
+sub CloseServer {
+ my $self = shift;
+ vec($self->{'filebits'},$self->{'server_fileno'},1) = 0;
+ $server->close();
+ undef $server;
+}
+
+sub OpenServer {
+ my $self = shift;
+ my $server = IO::Socket::INET->new(Listen => 5,
+ LocalPort => 1192,
+ Reuse => 1,
+ ReuseAddr => 1,
+ Timeout => 0,
+ Proto => 'tcp');
+
+ die "Could not create socket $!" unless $server;
+
+ $server->blocking(0);
+ my $server_fileno = fileno($server);
+ vec($filebits,$server_fileno,1) = 1;
+
+ print STDERR "fakeserver: Starting $server_fileno\n";
+
+ open (DATA, 'closeconnection.dat') or die "couldn't open closeconnection.dat: $!\n";
+ my $n = read(DATA, $closeconnectionmessage, 100);
+ close(DATA);
+
+ print STDERR "fakeserver: read $n <$closeconnectionmessage> ", length($closeconnectionmessage), "\n";
+ $self->{'server'} = $server;
+ $self->{'server_fileno'} = $server_fileno;
+}
+
+sub SendMessage {
+ my $self = shift;
+ my( $message ) = @_;
+
+ print STDERR "fakeserver: SendMessage $message\n";
+ $message .= "\r\n";
+
+ foreach my $fileno (keys %{$self->{'connections'}}) {
+ if ( ${$self->{'connections'}}{$fileno} ) {
+ my $client = ${$self->{'connections'}}{$fileno}{client};
+ print $client $message;
+ }
+ }
+}
+
+sub HandleFile {
+ my $self = shift;
+ my ( $fileno ) = @_;
+
+ print STDERR "fakeserver: HandleFile $fileno\n";
+ if ( $fileno == $self->{'server_fileno'} ) {
+ HandleServer();
+ } elsif ( ${$self->{'connections'}}{$fileno} ) {
+ HandleClient( $fileno );
+ } else {
+ print STDERR "fakeserver: Weird fileno $fileno\n";
+ }
+}
+
+sub HandleServer {
+ my $self = shift;
+ my $client = $server->accept();
+
+ print STDERR "fakeserver: HandleServer\n";
+
+ if ( $client ) {
+ my $fileno = fileno($client);
+ $client->blocking(0);
+ ${$self->{'connections'}}{$fileno}{client} = $client;
+ ${$self->{'connections'}}{$fileno}{loggedin} = 0;
+ vec($self->{'filebits'},$fileno,1) = 1;
+ print STDERR "fakeserver: New client on $fileno\n";
+ } else {
+ print STDERR "fakeserver: No accept for server, reopen\n";
+ $self->CloseServer();
+ $self->OpenServer();
+ }
+}
+
+sub HandleClient {
+ my $self = shift;
+ my ( $fileno ) = @_;
+
+ print STDERR "fakeserver: HandleClient $fileno\n";
+ my $receive;
+ my $n = recv( ${$self->{'connections'}}{$fileno}{client}, $receive, 200, 0 );
+ my $rlen = length($receive);
+ if ( $receive ) {
+ if ($receive =~ /^GIOP/) {
+ print STDERR "fakeserver: Got $rlen byte GIOP message from client $fileno\n";
+ }
+ else {
+ print STDERR "fakeserver: Got $rlen bytes from client $fileno\n";
+ }
+ ${$self->{'connections'}}{$fileno}{receive} = $receive;
+ my $slen = length($closeconnectionmessage);
+ print STDERR "fakeserver: Sending $slen bytes GIOP closeconnection to $fileno\n";
+ sleep(3);
+ $n = send(${$self->{'connections'}}{$fileno}{client}, $closeconnectionmessage, 0);
+ print STDERR "fakeserver: Sent $n bytes GIOP closeconnection to $fileno\n";
+ } else {
+ print STDERR "fakeserver: Close client $fileno\n";
+ vec(${$self->{'filebits'}},$fileno,1) = 0;
+ ${$self->{'connections'}}{$fileno}{client}->close();
+ undef ${$self->{'connections'}}{$fileno};
+ $self->SendMessage( "Close Client" );
+ }
+}
+