Revision
17128
Author
sathieu
Date
2010-03-29 02:44:25 -0500 (Mon, 29 Mar 2010)

Log Message

perl-skinny: enhance the Testsuite

Modified Paths

Diff

Modified: freeswitch/trunk/src/mod/endpoints/mod_skinny/Net/Skinny/Message.pm (17127 => 17128)


--- freeswitch/trunk/src/mod/endpoints/mod_skinny/Net/Skinny/Message.pm	2010-03-28 22:52:05 UTC (rev 17127)
+++ freeswitch/trunk/src/mod/endpoints/mod_skinny/Net/Skinny/Message.pm	2010-03-29 07:44:25 UTC (rev 17128)
@@ -7,4 +7,52 @@
 use strict;
 use warnings;
 
+use Net::Skinny::Protocol qw/:all/;
 
+use Data::Dumper;
+
+require Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT = qw(send);
+
+sub new {
+    my $class = shift;
+    my $self = {};
+    bless $self, $class;
+    $self->{'socket'} = shift;
+    $self->{'type'} = shift;
+    %{$self->{'data'}} = @_;
+    return $ self;
+}
+
+sub send {
+    my $self = shift;
+    my $struct = Net::Skinny::Protocol::skinny_message_struct($self->{'type'});
+    my $raw = '';
+    my $parsed_count = 0;
+    for my $info ( @$struct) {
+        last if !defined($self->{'data'}{@$info[1]});
+        if(@$info[0] eq 'char') {
+            $raw .= pack("a".@$info[2], $self->{'data'}{@$info[1]});
+        } elsif(@$info[0] eq 'uint32_t') {
+            $raw .= pack("V".@$info[2], $self->{'data'}{@$info[1]});
+        } elsif(@$info[0] eq 'uint16_t') {
+            $raw .= pack("n".@$info[2], $self->{'data'}{@$info[1]});
+        } elsif(@$info[0] eq 'struct in_addr') {
+            $raw .= pack("V".@$info[2], $self->{'data'}{@$info[1]});
+        } elsif(@$info[0] eq 'struct station_capabilities') {
+            $raw .= $self->{'data'}{@$info[1]};
+        } else {
+            printf "Unknown type: %s\n", @$info[0];
+            return;
+        }
+        $parsed_count++;
+    }
+    if($parsed_count != scalar(keys %{$self->{'data'}})) {
+        printf "Incomplete message: %d out of %d\n", $parsed_count, scalar(keys %{$self->{'data'}});
+        return;
+    }
+    $self->{'socket'}->send_data($self->{'type'}, $raw);
+}
+
+1;

Modified: freeswitch/trunk/src/mod/endpoints/mod_skinny/Net/Skinny/Protocol.pm (17127 => 17128)


--- freeswitch/trunk/src/mod/endpoints/mod_skinny/Net/Skinny/Protocol.pm	2010-03-28 22:52:05 UTC (rev 17127)
+++ freeswitch/trunk/src/mod/endpoints/mod_skinny/Net/Skinny/Protocol.pm	2010-03-29 07:44:25 UTC (rev 17128)
@@ -8,13 +8,16 @@
 no strict "refs";
 use warnings;
 use Carp;
+use Data::Dumper;
 
 require Exporter;
 our @ISA = qw(Exporter);
-our @EXPORT = qw(skinny_message_type2str);
+our @EXPORT = qw(skinny_message_type2str skinny_message_struct);
 
 my %const;
 my %sub;
+my %struct;
+
 my $skinny_protocol_h = 'src/mod/endpoints/mod_skinny/skinny_protocol.h';
 
 sub import {
@@ -46,6 +49,27 @@
             my ($name, $value) = ($1,hex($2));
             $sub{$name} = sub () { $value };
             $const{$name} = $value;
+        } elsif(/^\s*struct\s+([a-z_]+)\s*\{\s*$/) {
+            my $struct_name = $1;
+            $struct{$struct_name} = [];
+            while(<$fh>) {
+                if(/^\s*\}\s*;\s*$/) {
+                    last;
+                } elsif(/^\s*(((struct)\s+)?([a-z_0-9]+))\s+([a-z_0-9]+)(\[([0-9A-Z_]+)\])?\s*;?\s*(\/\*.*\*\/)?\s*$/) {
+                    my $var_name = $1;
+                    my $var_type = $5;
+                    my $var_size = $7;
+                    $var_size = 1 if !defined($var_size);
+                    push @{$struct{$struct_name}}, [$var_name, $var_type, $var_size];
+                } elsif(/^\s*union\s*skinny_data data;\s*$/) {
+                    # union
+                } elsif(/^\s*(\/\*.*\*\/)?\s*$/) {
+                    # Simple comment
+                } else {
+                    printf "Unparsed line '%s' in %s\n", $_, $struct_name;
+                }
+            }
+            #print "$name: ".Dumper($struct{$name});
         }
     }
     @sub{@_};
@@ -62,3 +86,10 @@
     }
     return "UnknownMessage";
 }
+
+sub skinny_message_struct {
+    my $message_type = shift;
+    my $struct_name = lc(Net::Skinny::Protocol::skinny_message_type2str($message_type));
+    return $struct{$struct_name};
+}
+

Modified: freeswitch/trunk/src/mod/endpoints/mod_skinny/Net/Skinny.pm (17127 => 17128)


--- freeswitch/trunk/src/mod/endpoints/mod_skinny/Net/Skinny.pm	2010-03-28 22:52:05 UTC (rev 17127)
+++ freeswitch/trunk/src/mod/endpoints/mod_skinny/Net/Skinny.pm	2010-03-29 07:44:25 UTC (rev 17128)
@@ -16,7 +16,7 @@
     shift->SUPER::new(PeerPort => 2000, @_);
 }
 
-sub send_message
+sub send_data
 {
     my $self = shift;
 	my $type = shift;
@@ -29,6 +29,17 @@
 	printf ".\n";
 }
 
+sub send_message
+{
+    my $self = shift;
+    my $type = shift;
+    return Net::Skinny::Message->new(
+        $self,
+        $type,
+        @_
+    )->send();
+}
+
 sub receive_message
 {
     my $self = shift;

Modified: freeswitch/trunk/src/mod/endpoints/mod_skinny/test-skinny.pl (17127 => 17128)


--- freeswitch/trunk/src/mod/endpoints/mod_skinny/test-skinny.pl	2010-03-28 22:52:05 UTC (rev 17127)
+++ freeswitch/trunk/src/mod/endpoints/mod_skinny/test-skinny.pl	2010-03-29 07:44:25 UTC (rev 17128)
@@ -11,9 +11,9 @@
 use strict;
 use warnings;
 
-use Data::Dumper;
 use Net::Skinny;
 use Net::Skinny::Protocol qw/:all/;
+use Net::Skinny::Message;
 
 #Config
 my $skinny_server = '127.0.0.1';
@@ -32,50 +32,58 @@
     exit 1;
 }
 # =============================================================================
-$socket->send_message(REGISTER_MESSAGE, # Register
-	pack("a16VVVVV",
-		$device_name,
-		0, # userId;
-		1, # instance;
-		$device_ip,# ip;
-		7, # deviceType;
-		0, # maxStreams;
-	));
+$socket->send_message(
+    REGISTER_MESSAGE,
+    device_name => $device_name,
+    user_id => 0,
+    instance => 1,
+    ip => $device_ip,
+    device_type => 7,
+    max_streams => 0,
+    );
 $socket->receive_message(); # RegisterAck
 
-$socket->send_message(0x0002, # Port
-	pack("n", 2000
-	));
+$socket->send_message(
+    PORT_MESSAGE,
+	port => 2000,
+	);
 
-$socket->send_message(HEADSET_STATUS_MESSAGE,
-	pack("V",
-		2, # Off
-	));
-
+$socket->send_message(
+    HEADSET_STATUS_MESSAGE,
+	mode => 2, #Off
+	);
 $socket->receive_message(); # CapabilitiesReq
-$socket->send_message(CAPABILITIES_RES_MESSAGE,
-	pack("V"."Vva10"."Vva10",
-		2, # count
-		2, 8, "", # codec, frames, res
-		4, 16, "", # codec, frames, res
-	));
+$socket->send_message(
+    CAPABILITIES_RES_MESSAGE,
+    count => 2,
+    caps => pack("Vva10"."Vva10",
+		    2, 8, "", # codec, frames, res
+		    4, 16, "", # codec, frames, res
+	    )
+	);
 
-$socket->send_message(BUTTON_TEMPLATE_REQ_MESSAGE, "");
+$socket->send_message(BUTTON_TEMPLATE_REQ_MESSAGE);
 $socket->receive_message(); # ButtonTemplateMessage
 
-$socket->send_message(SOFT_KEY_TEMPLATE_REQ_MESSAGE, "");
+$socket->send_message(SOFT_KEY_TEMPLATE_REQ_MESSAGE);
 $socket->receive_message(); # SoftKeyTemplateRes
 
-$socket->send_message(SOFT_KEY_SET_REQ_MESSAGE,	"");
+$socket->send_message(SOFT_KEY_SET_REQ_MESSAGE);
 $socket->receive_message(); # SoftKeySetRes
 
-$socket->send_message(LINE_STAT_REQ_MESSAGE, pack("V", 1));
+$socket->send_message(
+    LINE_STAT_REQ_MESSAGE,
+    number => 1,
+    );
 $socket->receive_message(); # LineStat
 
-$socket->send_message(REGISTER_AVAILABLE_LINES_MESSAGE, pack("V", 2));
+$socket->send_message(
+    REGISTER_AVAILABLE_LINES_MESSAGE, 
+    count => 2
+    );
 
 while(1) {
 	$socket->sleep(20);
-	$socket->send_message(KEEP_ALIVE_MESSAGE, "");
+	$socket->send_message(KEEP_ALIVE_MESSAGE);
 	$socket->receive_message(); # keepaliveack
 }