#!perl use strict; use warnings; use Test::More tests => 127; use Net::Jabber::Bot; #InitLog4Perl(); # stuff for mock client object use FindBin; use lib "$FindBin::Bin/lib"; use MockJabberClient; # Test object # Setup my $bot_alias = 'make_test_bot'; my $client_alias = 'bot_test_client'; my $server = 'talk.google.com'; my $personal_address = "test_user\@$server/$bot_alias"; my $loop_sleep_time = 5; my $server_info_timeout = 5; my %forums_and_responses; my $forum1 = 'test_forum1'; my $forum2 = 'test_forum2'; $forums_and_responses{$forum1} = ["jbot:", ""]; $forums_and_responses{$forum2} = ["notjbot:"]; my $ignore_server_messages = 1; my $ignore_self_messages = 1; my $out_messages_per_second = 5; my $max_message_size = 800; my $long_message_test_messages = 6; my $flood_messages_to_send = 40; my $max_messages_per_hour = ($flood_messages_to_send*2 + 2 + $long_message_test_messages ); # Globals we'll keep track of variables we use each test. our ($messages_seen, $initial_message_count, $start_time); $messages_seen = 0; $initial_message_count = 0; $start_time = time; ok(1, "Creating Net::Jabber::Bot object with Mock client library asserted in place of Net::Jabber::Client"); my $bot = Net::Jabber::Bot->new( server => $server , conference_server => "conference.$server" , port => 5222 , username => 'test_username' , password => 'test_pass' , alias => $bot_alias , message_function => \&new_bot_message # Called if new messages arrive. , background_function => \&background_checks # What the bot does outside jabber. , loop_sleep_time => $loop_sleep_time # Minimum time before doing background function. , process_timeout => $server_info_timeout # Time to wait for new jabber messages before doing background stuff , forums_and_responses => \%forums_and_responses , ignore_server_messages => $ignore_server_messages , ignore_self_messages => $ignore_self_messages , out_messages_per_second => $out_messages_per_second , max_message_size => $max_message_size , max_messages_per_hour => $max_messages_per_hour ); is($bot->message_delay, 0.2, "Message delay is set right to .20 seconds"); is($bot->max_messages_per_hour, $max_messages_per_hour, "Max messages per hour ($max_messages_per_hour) didn't get messed with by safeties"); isa_ok($bot, "Net::Jabber::Bot"); ok(1, "Sleeping 12 seconds to make sure we get past initializtion"); ok((sleep 12) > 10, "Making sure the bot get's past login initialization (sleep 12)"); process_bot_messages(); # Clean off the queue before we start? # continue editing here. Need to next enhance mock object to know jabber bot callbacks. # Not sure how we're going to chase chicken/egg issue. start_new_test("Testing Group Message bursting is not possible"); { for my $counter (1..$flood_messages_to_send) { my $result = $bot->SendGroupMessage($forum1, "Testing message speed $counter"); diag("got return value $result") if(defined $result); ok(!defined $result, "Sent group message $counter"); } my $running_time = time - $start_time; my $expected_run_time = $flood_messages_to_send / $out_messages_per_second; cmp_ok($running_time, '>=', int($expected_run_time), "group Message burst: \$running_time ($running_time) >= \$expected_run_time ($expected_run_time)"); process_bot_messages(); verify_messages_sent($flood_messages_to_send); verify_messages_seen(0, "Didn't see the messages I sent to the group"); } start_new_test("Testing PERSONAL_ADDRESS Message bursting is not possible"); { for my $counter (1..$flood_messages_to_send) { my $result = $bot->SendPersonalMessage($personal_address, "Testing personal_address message speed $counter"); diag("got return value $result") if(defined $result); ok(!defined $result, "Sent personal message $counter"); } my $running_time = time - $start_time; my $expected_run_time = $flood_messages_to_send / $out_messages_per_second; cmp_ok($running_time, '>=', int($expected_run_time), "group Message burst: \$running_time ($running_time) >= \$expected_run_time ($expected_run_time)"); process_bot_messages(); verify_messages_sent($flood_messages_to_send); verify_messages_seen(0, "Didn't see the messages I sent to myself..."); } TODO: { # Need a way to test for historical - up top or in diff code? ;# cmp_ok($messages_seen, '==', 0, "Didn't see any historical messages..."); } cmp_ok($bot->respond_to_self_messages( ), '==', 1, "no pass to respond_to_self_messages is 1"); cmp_ok($bot->respond_to_self_messages(0), '==', 0, "Ignore Self Messages"); cmp_ok($bot->respond_to_self_messages(2), '==', 1, "Respond to Self Messages"); start_new_test("Test a successful message"); ok(!defined $bot->SendPersonalMessage($personal_address, "Testing message to myself"), "Testing message to myself"); process_bot_messages(); verify_messages_sent(1); verify_messages_seen(1, "Got it!"); # Setup a really long message and make sure it's longer than 1 message. my $repeating_string = 'Now is the time for all good men to come to the aide of their country '; my $message_repeats = int( # Make it a whole number ($max_message_size # Maximum size of 1 message * $long_message_test_messages # How many messages we want to produce - $max_message_size / 2) # Shorten it a little. / length $repeating_string # Length of our string we're going to repeat ); my $long_message = $repeating_string x $message_repeats; my $long_message_length = length $long_message; cmp_ok(length($long_message), '>=' , $max_message_size , "Length of message is greater than 1 message chunk ($long_message_length bytes)"); ok(1, "Testing messages that will be split:"); { start_new_test("Send to self"); cmp_ok($bot->respond_to_self_messages( ), '==', 1, "Make sure I'm responding to self messages."); # Group Test. ok(1, "Sending long message of " . length($long_message) . " bytes to forum"); my $result = $bot->SendGroupMessage($forum1, $long_message); diag("got return value $result\nWhile trying to send: $long_message") if(defined $result); ok(!defined $result, "Sent long message."); process_bot_messages(); cmp_ok($messages_seen, '>=',$long_message_test_messages, "Saw $long_message_test_messages messages so we know it was chunked into messages smaller than $max_message_size"); start_new_test("Set long subject in forum (illegal)"); my $subject_change_result = $bot->SetForumSubject($forum1, $long_message); is($subject_change_result, "Subject is too long!", 'Verify long subject changes are rejected.'); verify_messages_sent(0); verify_messages_seen(0, "Bot should not have sent anything to the server."); } DEBUG("Finished with first burst"); start_new_test("Test a successful message with a panic"); ok(!defined $bot->SendPersonalMessage($personal_address, "Testing message to myself"), "Testing message to myself"); process_bot_messages(); verify_messages_sent(1); verify_messages_seen(2, "With Panic"); start_new_test("Test message limits"); my $failure_message = $bot->SendPersonalMessage($personal_address, "Testing message to myself that should fail"); ok(defined $failure_message, "Testing hourly message limits (failure to send)"); process_bot_messages(); verify_messages_seen(0, "Should be not have been sent to server"); verify_messages_seen(0, "Rejected by bot"); exit; sub new_bot_message { $messages_seen += 1; } sub background_checks {} sub verify_messages_sent { my $expected_messages = shift; my $messages_sent = $bot->get_messages_this_hour() - $initial_message_count; cmp_ok($messages_sent, '==', $expected_messages, "Verify that $expected_messages were sent"); } sub verify_messages_seen { my $expected_messages = shift; my $comment = shift; if(!defined $comment) { $comment = ""; } else { $comment = "($comment)"; } cmp_ok($messages_seen, '==', $expected_messages, "Verify that $expected_messages were seen $comment"); } sub start_new_test { my $comment = shift; $comment = "no description" if(!defined $comment); ok(1, "****** New test: $comment ******"); $initial_message_count = $bot->get_messages_this_hour(); $messages_seen = 0; $start_time = time; } sub process_bot_messages { DEBUG("Processing bot messages from test file ($0)"); ok(defined $bot->Process(5), "Processed new messages and didn't lose connection."); } sub InitLog4Perl { use Log::Log4perl qw(:easy); my $config_file .= <<'CONFIG_DATA'; # Regular Screen Appender log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = PatternLayout log4perl.appender.Screen.layout.ConversionPattern = %d %p (%L): %m%n log4perl.category = ALL, Screen CONFIG_DATA Log::Log4perl->init(\$config_file); $| = 1; #unbuffer stdout! }