├── .gitignore ├── .rspec ├── Gemfile ├── Rakefile ├── config.yaml.example ├── spec ├── cap │ ├── account-notify_spec.rb │ ├── extended-join_spec.rb │ ├── chghost_spec.rb │ ├── userhost-in-names_spec.rb │ ├── multi-prefix_spec.rb │ ├── away-notify_spec.rb │ ├── invite-notify_spec.rb.disabled │ └── cap_spec.rb ├── spec_helper.rb ├── usermodes │ ├── showwhois_spec.rb │ ├── nokick_spec.rb │ ├── regonlymsg_spec.rb │ ├── censor_spec.rb │ ├── bot_spec.rb │ ├── privacy_spec.rb │ └── noctcp_spec.rb ├── chanmodes │ ├── nokick_spec.rb │ ├── noctcp_spec.rb │ ├── nonickchange_spec.rb │ ├── nonotice_spec.rb │ ├── regonly_spec.rb │ ├── noinvite_spec.rb │ ├── regonlyspeak_spec.rb │ ├── inviteonly_spec.rb │ ├── noknock_spec.rb │ ├── secureonly_spec.rb.disabled │ ├── delayjoin_spec.rb │ ├── stripcolor_spec.rb │ ├── operonly_spec.rb │ ├── nocolor_spec.rb │ ├── link_spec.rb │ ├── censor_spec.rb │ ├── permanent_spec.rb │ └── ban_spec.rb ├── _pre_test_spec.rb ├── opercommands │ ├── setident_spec.rb │ ├── sajoin_spec.rb │ ├── sethost_spec.rb │ ├── sapart_spec.rb │ ├── oper_spec.rb │ ├── samode_spec.rb │ ├── chgident_spec.rb │ ├── chgname_spec.rb │ ├── chghost_spec.rb │ ├── squit_connect_spec.rb │ └── spamfilter_spec.rb ├── other │ ├── 005_spec.rb │ └── sync_spec.rb └── extbans │ └── msgbypass_spec.rb ├── ircdconfig ├── hub.conf ├── irc1.conf ├── irc2.conf └── common.conf ├── Gemfile.lock ├── irc_config.rb └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | config.yaml 2 | *~ 3 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --color 2 | --require spec_helper 3 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | gem 'ircfly' 3 | gem 'rake' 4 | gem 'rspec' 5 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'rspec/core/rake_task' 2 | 3 | RSpec::Core::RakeTask.new(:spec) 4 | 5 | task default: :spec 6 | -------------------------------------------------------------------------------- /config.yaml.example: -------------------------------------------------------------------------------- 1 | Servers: 2 | primary: 3 | host: '127.0.0.1' 4 | port: 5667 5 | ssl_port: 5900 6 | secondary: 7 | host: '127.0.0.1' 8 | port: 5668 9 | ssl_port: 5901 10 | hub: 11 | host: '127.0.0.1' 12 | port: 5660 13 | ssl_port: 5910 14 | -------------------------------------------------------------------------------- /spec/cap/account-notify_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'CAP account-notify' do 4 | # before(:each) do 5 | # @swarm = Ircfly::Swarm.new 6 | # server = IRC_CONFIG.servers['primary'] 7 | # @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | # @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | # end 10 | 11 | it 'should show account changes if enabled' 12 | 13 | it 'should not show account changes if not enabled' 14 | 15 | end 16 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | $:<< File.join(File.dirname(__FILE__), '..') 2 | require 'ircfly' 3 | require 'ircfly/fly' 4 | require 'irc_config.rb' 5 | 6 | RSpec.configure do |config| 7 | config.expect_with :rspec do |expectations| 8 | expectations.include_chain_clauses_in_custom_matcher_descriptions = true 9 | end 10 | 11 | config.mock_with :rspec do |mocks| 12 | mocks.verify_partial_doubles = true 13 | end 14 | 15 | Kernel.srand config.seed 16 | end 17 | 18 | IRC_CONFIG = IrcConfig.new('config.yaml') 19 | -------------------------------------------------------------------------------- /ircdconfig/hub.conf: -------------------------------------------------------------------------------- 1 | me { 2 | name hub.test.net; 3 | info "Hub"; 4 | sid 010; 5 | }; 6 | 7 | listen { 8 | ip 127.0.0.1; 9 | port 5660; 10 | }; 11 | 12 | listen { 13 | ip 127.0.0.1; 14 | port 5910; 15 | options { ssl; }; 16 | }; 17 | 18 | link irc1.test.net { 19 | incoming { 20 | mask *; 21 | }; 22 | password "test"; 23 | class servers; 24 | }; 25 | 26 | link irc2.test.net { 27 | incoming { 28 | mask *; 29 | }; 30 | password "test"; 31 | class servers; 32 | }; 33 | 34 | log "hub.log" { 35 | flags { 36 | oper; 37 | kline; 38 | connects; 39 | server-connects; 40 | kills; 41 | errors; 42 | }; 43 | maxsize 1M; 44 | }; 45 | 46 | include "common.conf"; 47 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | diff-lcs (1.3) 5 | ircfly (0.1.5) 6 | rake (10.4.2) 7 | rspec (3.8.0) 8 | rspec-core (~> 3.8.0) 9 | rspec-expectations (~> 3.8.0) 10 | rspec-mocks (~> 3.8.0) 11 | rspec-core (3.8.0) 12 | rspec-support (~> 3.8.0) 13 | rspec-expectations (3.8.2) 14 | diff-lcs (>= 1.2.0, < 2.0) 15 | rspec-support (~> 3.8.0) 16 | rspec-mocks (3.8.0) 17 | diff-lcs (>= 1.2.0, < 2.0) 18 | rspec-support (~> 3.8.0) 19 | rspec-support (3.8.0) 20 | 21 | PLATFORMS 22 | ruby 23 | 24 | DEPENDENCIES 25 | ircfly 26 | rake 27 | rspec 28 | 29 | BUNDLED WITH 30 | 1.17.3 31 | -------------------------------------------------------------------------------- /ircdconfig/irc1.conf: -------------------------------------------------------------------------------- 1 | me { 2 | name irc1.test.net; 3 | info "Primary test server (leaf)"; 4 | sid 001; 5 | }; 6 | 7 | listen { 8 | ip 127.0.0.1; 9 | port 5667; 10 | }; 11 | 12 | listen { 13 | ip 127.0.0.1; 14 | port 5900; 15 | options { ssl; }; 16 | }; 17 | 18 | link hub.test.net { 19 | incoming { 20 | mask *; 21 | }; 22 | outgoing { 23 | hostname 127.0.0.1; 24 | port 5660; 25 | options { 26 | /* no autoconnect due to interference 27 | * with some of the linking tests 28 | */ 29 | }; 30 | }; 31 | password "test"; 32 | class servers; 33 | }; 34 | 35 | log "irc1.log" { 36 | flags { 37 | oper; 38 | kline; 39 | connects; 40 | server-connects; 41 | kills; 42 | errors; 43 | }; 44 | maxsize 1M; 45 | }; 46 | 47 | include "common.conf"; 48 | -------------------------------------------------------------------------------- /ircdconfig/irc2.conf: -------------------------------------------------------------------------------- 1 | me { 2 | name irc2.test.net; 3 | info "Secondary test server (leaf)"; 4 | sid 002; 5 | }; 6 | 7 | listen { 8 | ip 127.0.0.1; 9 | port 5668; 10 | }; 11 | 12 | listen { 13 | ip 127.0.0.1; 14 | port 5901; 15 | options { ssl; }; 16 | }; 17 | 18 | link hub.test.net { 19 | incoming { 20 | mask *; 21 | }; 22 | outgoing { 23 | hostname 127.0.0.1; 24 | port 5660; 25 | options { 26 | /* no autoconnect due to interference 27 | * with some of the linking tests 28 | */ 29 | }; 30 | }; 31 | password "test"; 32 | class servers; 33 | }; 34 | 35 | log "irc2.log" { 36 | flags { 37 | oper; 38 | kline; 39 | connects; 40 | server-connects; 41 | kills; 42 | errors; 43 | }; 44 | maxsize 1M; 45 | }; 46 | 47 | include "common.conf"; 48 | -------------------------------------------------------------------------------- /spec/usermodes/showwhois_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'User Mode W (showwhois)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | # Why do we even have this silly functionality ? 12 | it 'should show when someone used /WHOIS' do 13 | @swarm.perform do 14 | @obot.send("OPER netadmin test") 15 | @obot.send("MODE obot +W") 16 | sleep(0.5) 17 | @cbot1.send("WHOIS obot") 18 | sleep(0.5) 19 | end 20 | @swarm.execute 21 | expect(@obot.received_pattern(/cbot1.*did a \/whois on you/)).to eq(true) 22 | end 23 | end 24 | -------------------------------------------------------------------------------- /spec/chanmodes/nokick_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode Q (nokick)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should disallow KICK' do 12 | @swarm.perform do 13 | @obot.send("JOIN #test") 14 | @obot.send("MODE #test +Q") 15 | sleep(0.5) 16 | @cbot1.send("JOIN #test") 17 | sleep(0.5) 18 | @obot.send("KICK #test cbot1") 19 | sleep(0.5) 20 | end 21 | @swarm.execute 22 | expect(@obot.received_pattern(/972.*KICK/)).to eq(true) 23 | expect(@cbot1.received_pattern(/:obot.*KICK/)).not_to eq(true) 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /spec/chanmodes/noctcp_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode C (noctcp)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should disallow CTCP' do 12 | @swarm.perform do 13 | @obot.send("JOIN #ctcp") 14 | @obot.send("MODE #ctcp +C") 15 | sleep(0.5) 16 | @cbot1.send("JOIN #ctcp") 17 | @cbot1.send("PRIVMSG #ctcp :\001CTCPTEST\001") 18 | sleep(0.5) 19 | end 20 | @swarm.execute 21 | expect(@cbot1.received_pattern(/CTCPs are not permitted in this channel/)).to eq(true) 22 | expect(@obot.received_pattern(/CTCPTEST/)).not_to eq(true) 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /spec/chanmodes/nonickchange_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode N (nonickchange)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should disallow nick changes' do 12 | @swarm.perform do 13 | @obot.send("JOIN #nickchange") 14 | @obot.send("MODE #nickchange +N") 15 | sleep(0.5) 16 | @cbot1.send("JOIN #nickchange") 17 | @cbot1.send("NICK nonickchg") 18 | sleep(0.5) 19 | end 20 | @swarm.execute 21 | expect(@cbot1.received_pattern(/Can not change nickname/)).to eq(true) 22 | expect(@obot.received_pattern(/nonickchg/)).not_to eq(true) 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /spec/chanmodes/nonotice_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode T (nonotice)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should disallow NOTICE' do 12 | @swarm.perform do 13 | @obot.send("JOIN #notice") 14 | @obot.send("MODE #notice +T") 15 | sleep(0.5) 16 | @cbot1.send("JOIN #notice") 17 | @cbot1.send("NOTICE #notice :this is a test notice") 18 | sleep(0.5) 19 | end 20 | @swarm.execute 21 | expect(@cbot1.received_pattern(/NOTICEs are not permitted in this channel/)).to eq(true) 22 | expect(@obot.received_pattern(/this is a test notice/)).not_to eq(true) 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /spec/chanmodes/regonly_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode R (regonly)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should prevent users from joining who are not identified to services' do 12 | @swarm.perform do 13 | @obot.send("JOIN #test") 14 | @obot.send("MODE #test +R") 15 | sleep(0.5) 16 | @cbot1.send("JOIN #test") 17 | sleep(0.5) 18 | end 19 | @swarm.execute 20 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).not_to eq(true) 21 | expect(@cbot1.received_pattern(/477.*You need a registered nick to join/)).to eq(true) 22 | end 23 | 24 | it 'should not prevent users from joining who are identified to services' 25 | 26 | end 27 | -------------------------------------------------------------------------------- /irc_config.rb: -------------------------------------------------------------------------------- 1 | require 'yaml' 2 | 3 | class IrcConfig 4 | class IrcServer 5 | attr_reader :host 6 | attr_reader :port 7 | attr_reader :password 8 | attr_reader :ssl_port 9 | 10 | def initialize(server: nil, host: 'irc.example.org', port: 6667, ssl_port: 6697, password: nil) 11 | unless server.nil? 12 | (@host,@port) = server.split(':') 13 | else 14 | @host = host 15 | @port = port 16 | end 17 | 18 | @password = password 19 | @ssl_port = ssl_port 20 | end 21 | 22 | end 23 | 24 | attr_reader :servers 25 | attr_reader :options 26 | 27 | def initialize(file_path) 28 | configuration = YAML.load_file(file_path) 29 | @options = configuration['Options'] 30 | @servers = Hash.new 31 | configuration['Servers'].each do |name, entry| 32 | @servers[name] = IrcServer.new(server: entry['server'], host: entry['host'], port: entry['port'], ssl_port: entry['ssl_port'], password: entry['password']) 33 | end 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /spec/usermodes/nokick_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'User Mode q (nokick)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should disallow KICK' do 12 | @swarm.perform do 13 | @obot.send("OPER netadmin test") 14 | @obot.send("JOIN #test") 15 | @obot.send("MODE obot +q") 16 | sleep(0.5) 17 | @cbot1.send("JOIN #test") 18 | sleep(0.5) 19 | @obot.send("MODE #test +o cbot1") 20 | sleep(0.5) 21 | @cbot1.send("KICK #test obot") 22 | sleep(0.5) 23 | end 24 | @swarm.execute 25 | expect(@obot.received_pattern(/cbot1 tried to kick you/)).to eq(true) 26 | expect(@cbot1.received_pattern(/user is unkickable/)).to eq(true) 27 | expect(@obot.received_pattern(/:cbot1.*KICK/)).not_to eq(true) 28 | end 29 | end 30 | -------------------------------------------------------------------------------- /spec/usermodes/regonlymsg_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'User Mode R (regonlymsg)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @cbot1a = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1a') 8 | @cbot1b = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1b') 9 | end 10 | 11 | it 'should block messages from users who are not identified to services' do 12 | @swarm.perform do 13 | @cbot1b.send("MODE cbot1b +R") 14 | sleep(1) 15 | @cbot1a.send("PRIVMSG cbot1b :good day. this should be blocked.") 16 | sleep(1) 17 | end 18 | @swarm.execute 19 | expect(@cbot1a.received_pattern(/must identify to a registered nick to private message/)).to eq(true) 20 | expect(@cbot1b.received_pattern(/this should be blocked/)).not_to eq(true) 21 | end 22 | 23 | it 'should allow messages from users who are identified to services' 24 | # TODO. Need services help or helper module. 25 | 26 | end 27 | -------------------------------------------------------------------------------- /spec/chanmodes/noinvite_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode V (noinvite)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should disallow INVITE if +V' do 12 | @swarm.perform do 13 | @obot.send("JOIN #invite") 14 | @obot.send("MODE #invite +Vi") 15 | sleep(0.5) 16 | @obot.send("INVITE cbot1 #invite") 17 | sleep(0.5) 18 | @cbot1.send("JOIN #invite") 19 | sleep(0.5) 20 | end 21 | @swarm.execute 22 | # We expect the invite to be blocked 23 | expect(@obot.received_pattern(/Cannot invite/)).to eq(true) 24 | # And we DO NOT want to see a JOIN ;) 25 | expect(@cbot1.received_pattern(/:cbot1.*JOIN/)).not_to eq(true) 26 | expect(@cbot1.received_pattern(/Cannot join channel/)).to eq(true) 27 | end 28 | 29 | end 30 | -------------------------------------------------------------------------------- /spec/chanmodes/regonlyspeak_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode M (regonlyspeak)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should disallow messages from users who are not identified to services' do 12 | @swarm.perform do 13 | @obot.send("JOIN #test") 14 | @obot.send("MODE #test +M") 15 | sleep(0.5) 16 | @cbot1.send("JOIN #test") 17 | sleep(0.5) 18 | @cbot1.send("PRIVMSG #test :this should be rejected") 19 | sleep(0.5) 20 | end 21 | @swarm.execute 22 | expect(@cbot1.received_pattern(/404.*You must have a registered nick/)).to eq(true) 23 | expect(@obot.received_pattern(/this should be rejected/)).not_to eq(true) 24 | end 25 | 26 | it 'should allow messages from users who are identified to services' 27 | 28 | end 29 | -------------------------------------------------------------------------------- /spec/usermodes/censor_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'User Mode G (censor)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @cbot1a = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1a') 8 | @cbot1b = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1b') 9 | end 10 | 11 | it 'should censor bad words' do 12 | @swarm.perform do 13 | @cbot1b.send("MODE cbot1b +G") 14 | sleep(1) 15 | @cbot1a.send("PRIVMSG cbot1b :aa fucked bb") 16 | sleep(1) 17 | end 18 | @swarm.execute 19 | expect(@cbot1b.received_pattern(/fuck/)).not_to eq(true) 20 | expect(@cbot1b.received_pattern(/aa bb/)).to eq(true) 21 | end 22 | 23 | it 'should not censor good words' do 24 | @swarm.perform do 25 | @cbot1b.send("MODE cbot1b +G") 26 | sleep(1) 27 | @cbot1a.send("PRIVMSG cbot1b :sunshine") 28 | sleep(1) 29 | end 30 | @swarm.execute 31 | expect(@cbot1b.received_pattern(/sunshine/)).to eq(true) 32 | end 33 | 34 | end 35 | -------------------------------------------------------------------------------- /spec/cap/extended-join_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'CAP extended-join' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @cbot1a = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1a') 8 | @cbot1b = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1b', name: 'This is my realname') 9 | end 10 | 11 | it 'should show gecos in extended-join' do 12 | @swarm.perform do 13 | @cbot1a.send("CAP REQ extended-join") 14 | @cbot1a.send("JOIN #test") 15 | sleep(0.5) 16 | @cbot1b.send("JOIN #test") 17 | sleep(0.5) 18 | end 19 | @swarm.execute 20 | expect(@cbot1a.received_pattern(/:cbot1b.* JOIN \#test \* :This is my realname/)).to eq(true) 21 | end 22 | 23 | it 'should not show gecos without extended-join' do 24 | @swarm.perform do 25 | @cbot1a.send("JOIN #test") 26 | sleep(0.5) 27 | @cbot1b.send("JOIN #test") 28 | sleep(0.5) 29 | end 30 | @swarm.execute 31 | expect(@cbot1a.received_pattern(/:cbot1b.*This is my realname/)).not_to eq(true) 32 | expect(@cbot1a.received_pattern(/:cbot1b.* JOIN.*\#test/)).to eq(true) 33 | end 34 | end 35 | -------------------------------------------------------------------------------- /spec/cap/chghost_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'CAP chghost' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @cbot1a = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1a') 8 | @cbot1b = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1b') 9 | end 10 | 11 | it 'should send CHGHOST to CAP chghost clients' do 12 | @swarm.perform do 13 | @cbot1a.send("CAP REQ chghost") 14 | @cbot1a.send("JOIN #test") 15 | @cbot1b.send("MODE cbot1b -x") 16 | @cbot1b.send("JOIN #test") 17 | sleep(0.5) 18 | @cbot1b.send("MODE cbot1b +x") 19 | sleep(0.5) 20 | end 21 | @swarm.execute 22 | expect(@cbot1a.received_pattern(/:cbot1b.* CHGHOST.*/)).to eq(true) 23 | end 24 | 25 | it 'should not send CHGHOST to non-CAP-chghost clients' do 26 | @swarm.perform do 27 | @cbot1a.send("JOIN #test") 28 | @cbot1b.send("MODE cbot1b -x") 29 | @cbot1b.send("JOIN #test") 30 | @cbot1b.send("MODE cbot1b +x") 31 | sleep(0.5) 32 | end 33 | @swarm.execute 34 | expect(@cbot1a.received_pattern(/:cbot1b.*CHGHOST.*/)).not_to eq(true) 35 | end 36 | 37 | end 38 | -------------------------------------------------------------------------------- /spec/chanmodes/inviteonly_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode i (invite only)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should not allow joins with +i' do 12 | @swarm.perform do 13 | @obot.send("JOIN #test") 14 | @obot.send("MODE #test +i") 15 | sleep(0.5) 16 | @cbot1.send("JOIN #test") 17 | sleep(0.5) 18 | end 19 | @swarm.execute 20 | expect(@cbot1.received_pattern(/473.*Cannot join/)).to eq(true) 21 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).not_to eq(true) 22 | end 23 | 24 | it 'should allow joins without -i' do 25 | @swarm.perform do 26 | @obot.send("JOIN #test") 27 | @obot.send("MODE #test -i") 28 | sleep(0.5) 29 | @cbot1.send("JOIN #test") 30 | sleep(0.5) 31 | end 32 | @swarm.execute 33 | expect(@cbot1.received_pattern(/473.*Cannot join/)).not_to eq(true) 34 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).to eq(true) 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /spec/chanmodes/noknock_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode K (noknock)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should disallow KNOCK if +K' do 12 | @swarm.perform do 13 | @obot.send("JOIN #knock") 14 | @obot.send("MODE #knock +iK") 15 | sleep(0.5) 16 | @cbot1.send("KNOCK #knock") 17 | sleep(0.5) 18 | end 19 | @swarm.execute 20 | expect(@cbot1.received_pattern(/No knocks are allowed/)).to eq(true) 21 | expect(@obot.received_pattern(/\[Knock\] by /)).not_to eq(true) 22 | end 23 | 24 | it 'should allow KNOCK if -K' do 25 | @swarm.perform do 26 | @obot.send("JOIN #knock") 27 | @obot.send("MODE #knock +i-K") 28 | sleep(0.5) 29 | @cbot1.send("KNOCK #knock") 30 | sleep(0.5) 31 | end 32 | @swarm.execute 33 | expect(@cbot1.received_pattern(/Knocked on \#knock/)).to eq(true) 34 | expect(@obot.received_pattern(/\[Knock\] by /)).to eq(true) 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /spec/cap/userhost-in-names_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'CAP userhost-in-names' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot', user: 'xxidentyy') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should show user@host in NAMES' do 12 | @swarm.perform do 13 | @obot.send("JOIN #test") 14 | sleep(0.5) 15 | @cbot1.send("CAP REQ userhost-in-names") 16 | @cbot1.send("JOIN #test") 17 | sleep(0.5) 18 | end 19 | @swarm.execute 20 | expect(@cbot1.received_pattern(/CAP.*ACK.*userhost-in-names/)).to eq(true) 21 | expect(@cbot1.received_pattern(/353.*obot.*xxidentyy/)).to eq(true) 22 | end 23 | 24 | it 'should not show user@host in NAMES if not enabled' do 25 | @swarm.perform do 26 | @obot.send("JOIN #test") 27 | sleep(0.5) 28 | @cbot1.send("CAP REQ -userhost-in-names") 29 | @cbot1.send("JOIN #test") 30 | sleep(0.5) 31 | end 32 | @swarm.execute 33 | expect(@cbot1.received_pattern(/353.*obot.*xxidentyy/)).not_to eq(true) 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /spec/chanmodes/secureonly_spec.rb.disabled: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode z/Z (secureonly/issecure)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | @test_channel = '#secure' 7 | server = IRC_CONFIG.servers['primary'] 8 | @obot = @swarm.fly(server: server.host, port: server.ssl_port, ssl: true, nick: 'obot') 9 | @secbot = @swarm.fly(server: server.host, port: server.ssl_port, ssl: true, nick: 'secbot') 10 | @insecbot = @swarm.fly(server: server.host, port: server.port, nick: 'insecbot') 11 | end 12 | 13 | it 'should only allow SSL users when +z' do 14 | @swarm.perform do 15 | @obot.send("JOIN #secure") 16 | @obot.send("MODE #secure +z") 17 | sleep(2) 18 | @secbot.send("JOIN #secure") 19 | @insecbot.send("JOIN #secure") 20 | end 21 | @swarm.execute 22 | 23 | expect(@secbot.received_pattern(/NAMES list/)).to eq(true) 24 | expect(@secbot.received_pattern(/Cannot join channel/)).not_to eq(true) 25 | 26 | expect(@insecbot.received_pattern(/NAMES list/)).not_to eq(true) 27 | expect(@insecbot.received_pattern(/Cannot join channel/)).to eq(true) 28 | end 29 | 30 | it 'should set +Z when all users are secure' 31 | 32 | it 'should be -Z when insecure users are present' 33 | 34 | end 35 | -------------------------------------------------------------------------------- /spec/usermodes/bot_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'User Mode B (bot)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | servera = IRC_CONFIG.servers['primary'] 7 | serverb = IRC_CONFIG.servers['secondary'] 8 | @cbot1 = @swarm.fly(server: servera.host, port: servera.port, nick: 'cbot1') 9 | @cbot2 = @swarm.fly(server: serverb.host, port: serverb.port, nick: 'cbot2') 10 | end 11 | 12 | it 'should show BOTMOTD upon MODE +B' do 13 | @swarm.perform do 14 | @cbot1.send("MODE cbot1 +B") 15 | sleep(0.5) 16 | end 17 | @swarm.execute 18 | expect(@cbot1.received_pattern(/BOTMOTD/)).to eq(true) 19 | end 20 | 21 | it 'should show as Bot when doing /WHOIS on yourself' do 22 | @swarm.perform do 23 | @cbot1.send("MODE cbot1 +B") 24 | @cbot1.send("WHOIS cbot1") 25 | sleep(0.5) 26 | end 27 | @swarm.execute 28 | expect(@cbot1.received_pattern(/is a \002Bot\002 on/)).to eq(true) 29 | end 30 | 31 | it 'should show as Bot in /WHOIS performed by another user' do 32 | @swarm.perform do 33 | @cbot1.send("MODE cbot1 +B") 34 | sleep(0.5) 35 | @cbot2.send("WHOIS cbot1") 36 | sleep(0.5) 37 | end 38 | @swarm.execute 39 | expect(@cbot2.received_pattern(/is a \002Bot\002 on/)).to eq(true) 40 | end 41 | 42 | end 43 | -------------------------------------------------------------------------------- /spec/chanmodes/delayjoin_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode D/d (delayjoin)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | @test_channel = '#test' 7 | server = IRC_CONFIG.servers['primary'] 8 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 9 | @cbot1a = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1a') 10 | @cbot1b = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1b') 11 | end 12 | 13 | it 'should not show users joining a mode +d channel' do 14 | @swarm.perform do 15 | @obot.send("JOIN #{@test_channel}") 16 | sleep(0.5) 17 | channel = @obot.channel_with_name(@test_channel) 18 | channel.mode('+D') 19 | sleep(0.5) 20 | @cbot1a.send("JOIN #{@test_channel}") 21 | @cbot1b.send("JOIN #{@test_channel}") 22 | sleep(0.5) 23 | end 24 | @swarm.execute 25 | expect(@cbot1a.received_pattern(/cbot1b/)).not_to eq(true) 26 | expect(@cbot1b.received_pattern(/cbot1a/)).not_to eq(true) 27 | end 28 | 29 | it 'should show operators joining a mode +d channel' 30 | it 'should show operators when promoted after joining a mode +d channel' 31 | it 'should show a user after they speak in a mode +d channel' 32 | it 'should keep mode +D after -d until all hidden users leave or are shown' 33 | end 34 | -------------------------------------------------------------------------------- /spec/chanmodes/stripcolor_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode S (stripcolor)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should disallow color codes' do 12 | @swarm.perform do 13 | @obot.send("JOIN #color") 14 | @obot.send("MODE #color +S") 15 | sleep(0.5) 16 | @cbot1.send("JOIN #color") 17 | @cbot1.send("PRIVMSG #color :\0034this is red\003") 18 | sleep(0.5) 19 | end 20 | @swarm.execute 21 | expect(@obot.received_pattern(/\0034this is red/)).not_to eq(true) 22 | expect(@obot.received_pattern(/this is red/)).to eq(true) 23 | end 24 | 25 | it 'should disallow reverse control codes' do 26 | @swarm.perform do 27 | @obot.send("JOIN #color") 28 | @obot.send("MODE #color +S") 29 | sleep(0.5) 30 | @cbot1.send("JOIN #color") 31 | @cbot1.send("PRIVMSG #color :\026this is reverse\026") 32 | sleep(0.5) 33 | end 34 | @swarm.execute 35 | expect(@obot.received_pattern(/\026this is reverse/)).not_to eq(true) 36 | expect(@obot.received_pattern(/this is reverse/)).to eq(true) 37 | end 38 | end 39 | -------------------------------------------------------------------------------- /spec/chanmodes/operonly_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode O (operonly)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should prevent non-ircops from joining' do 12 | @swarm.perform do 13 | @obot.send("OPER netadmin test") 14 | @obot.send("JOIN #test") 15 | @obot.send("MODE #test +O") 16 | sleep(1) 17 | @cbot1.send("JOIN #test") 18 | sleep(0.5) 19 | end 20 | @swarm.execute 21 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).not_to eq(true) 22 | expect(@cbot1.received_pattern(/520.*Cannot join channel/)).to eq(true) 23 | end 24 | 25 | it 'should not prevent ircops from joining' do 26 | @swarm.perform do 27 | @obot.send("OPER netadmin test") 28 | @cbot1.send("OPER netadmin test") 29 | @obot.send("JOIN #test") 30 | @obot.send("MODE #test +O") 31 | sleep(1) 32 | @cbot1.send("JOIN #test") 33 | sleep(0.5) 34 | end 35 | @swarm.execute 36 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).to eq(true) 37 | expect(@cbot1.received_pattern(/520.*Cannot join channel/)).not_to eq(true) 38 | end 39 | 40 | end 41 | -------------------------------------------------------------------------------- /spec/cap/multi-prefix_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'CAP multi-prefix' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot', user: 'xxidentyy') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should show all channel rights in NAMES' do 12 | @swarm.perform do 13 | @obot.send("JOIN #test") 14 | @obot.send("MODE #test +hv obot obot") 15 | sleep(0.5) 16 | @cbot1.send("CAP REQ multi-prefix") 17 | @cbot1.send("JOIN #test") 18 | sleep(0.5) 19 | end 20 | @swarm.execute 21 | expect(@cbot1.received_pattern(/CAP.*ACK.*multi-prefix/)).to eq(true) 22 | expect(@cbot1.received_pattern(/353.*@%\+obot.*/)).to eq(true) 23 | end 24 | 25 | it 'should not show all channel rights in NAMES when not requested' do 26 | @swarm.perform do 27 | @obot.send("JOIN #test") 28 | @obot.send("MODE #test +hv obot obot") 29 | sleep(0.5) 30 | @cbot1.send("CAP REQ -multi-prefix") 31 | @cbot1.send("JOIN #test") 32 | sleep(0.5) 33 | end 34 | @swarm.execute 35 | expect(@cbot1.received_pattern(/353.*@%\+obot.*/)).not_to eq(true) 36 | expect(@cbot1.received_pattern(/353.*@obot.*/)).to eq(true) 37 | end 38 | end 39 | -------------------------------------------------------------------------------- /spec/chanmodes/nocolor_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode c (nocolor)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should disallow color codes' do 12 | @swarm.perform do 13 | @obot.send("JOIN #color") 14 | @obot.send("MODE #color +c") 15 | sleep(0.5) 16 | @cbot1.send("JOIN #color") 17 | @cbot1.send("PRIVMSG #color :\0034this is red\003") 18 | sleep(0.5) 19 | end 20 | @swarm.execute 21 | expect(@cbot1.received_pattern(/Color is not permitted in this channel/)).to eq(true) 22 | expect(@obot.received_pattern(/this is red/)).not_to eq(true) 23 | end 24 | 25 | it 'should disallow reverse control codes' do 26 | @swarm.perform do 27 | @obot.send("JOIN #color") 28 | @obot.send("MODE #color +c") 29 | sleep(0.5) 30 | @cbot1.send("JOIN #color") 31 | @cbot1.send("PRIVMSG #color :\026this is reverse\026") 32 | sleep(0.5) 33 | end 34 | @swarm.execute 35 | expect(@cbot1.received_pattern(/Color is not permitted in this channel/)).to eq(true) 36 | expect(@obot.received_pattern(/this is reverse/)).not_to eq(true) 37 | end 38 | end 39 | -------------------------------------------------------------------------------- /spec/chanmodes/link_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode L (link)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should send users to linked channel (+L) if limit is reached (+l)' do 12 | @swarm.perform do 13 | @obot.send("JOIN #one") 14 | @obot.send("OPER netadmin test") 15 | @obot.send("MODE #one +lL 1 #two") 16 | sleep(0.5) 17 | @cbot1.send("JOIN #one") 18 | sleep(0.5) 19 | end 20 | @swarm.execute 21 | expect(@cbot1.received_pattern(/:cbot1.*JOIN.*\#one/)).not_to eq(true) 22 | expect(@cbot1.received_pattern(/:cbot1.*JOIN.*\#two/)).to eq(true) 23 | end 24 | 25 | it 'should not send users to linked channel (+L) if limit is not reached (+l)' do 26 | @swarm.perform do 27 | @obot.send("JOIN #one") 28 | @obot.send("OPER netadmin test") 29 | @obot.send("MODE #one +lL 99 #two") 30 | sleep(0.5) 31 | @cbot1.send("JOIN #one") 32 | sleep(0.5) 33 | end 34 | @swarm.execute 35 | expect(@cbot1.received_pattern(/:cbot1.*JOIN.*\#one/)).to eq(true) 36 | expect(@cbot1.received_pattern(/:cbot1.*JOIN.*\#two/)).not_to eq(true) 37 | end 38 | 39 | end 40 | -------------------------------------------------------------------------------- /spec/_pre_test_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | # This links the servers, needed for the other tests. 4 | describe 'pre-test' do 5 | before(:each) do 6 | @swarm = Ircfly::Swarm.new 7 | servera = IRC_CONFIG.servers['primary'] 8 | serverb = IRC_CONFIG.servers['secondary'] 9 | @obot1 = @swarm.fly(server: servera.host, port: servera.port, nick: 'obot1') 10 | @obot2 = @swarm.fly(server: serverb.host, port: serverb.port, nick: 'obot2') 11 | end 12 | 13 | it 'CONNECT should link the servers' do 14 | @swarm.perform do 15 | @obot1.send("OPER netadmin test") 16 | @obot2.send("OPER netadmin test") 17 | @obot1.send("CONNECT hub.test.net") 18 | @obot2.send("CONNECT hub.test.net") 19 | sleep(2) 20 | @obot2.send("PRIVMSG obot1 :seems we are linked") 21 | sleep(3) 22 | end 23 | @swarm.execute 24 | # Errors are not expected 25 | expect(@obot2.received_pattern(/ 481 /)).not_to eq(true) 26 | # We should receive the 'after reconnect', since now we are linked again 27 | expect(@obot1.received_pattern(/.*PRIVMSG.*seems we are linked/)).to eq(true) 28 | end 29 | 30 | it 'REHASH should rehash the 2nd server' do 31 | @swarm.perform do 32 | @obot2.send("OPER netadmin test") 33 | @obot2.send("REHASH") 34 | sleep(4) 35 | end 36 | @swarm.execute 37 | expect(@obot2.received_pattern(/.*Configuration loaded without any problems/)).to eq(true) 38 | end 39 | 40 | end 41 | -------------------------------------------------------------------------------- /spec/cap/away-notify_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'CAP away-notify' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot', user: 'xxidentyy') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should show AWAY changes if enabled' do 12 | @swarm.perform do 13 | sleep(0.5) 14 | @cbot1.send("CAP REQ away-notify") 15 | @obot.send("JOIN #test") 16 | @cbot1.send("JOIN #test") 17 | sleep(0.5) 18 | @obot.send("AWAY :going away") 19 | @obot.send("AWAY") 20 | sleep(0.5) 21 | end 22 | @swarm.execute 23 | expect(@cbot1.received_pattern(/CAP.*ACK.*away-notify/)).to eq(true) 24 | expect(@cbot1.received_pattern(/:obot.* AWAY :going away/)).to eq(true) 25 | expect(@cbot1.received_pattern(/:obot.* AWAY$/)).to eq(true) 26 | end 27 | 28 | it 'should not show AWAY changes if not enabled' do 29 | @swarm.perform do 30 | sleep(0.5) 31 | @obot.send("JOIN #test") 32 | sleep(0.5) 33 | @cbot1.send("CAP REQ -away-notify") 34 | @cbot1.send("JOIN #test") 35 | sleep(0.5) 36 | @obot.send("AWAY :going away") 37 | sleep(0.5) 38 | @obot.send("AWAY") 39 | sleep(0.5) 40 | end 41 | @swarm.execute 42 | expect(@cbot1.received_pattern(/:obot.* AWAY/)).not_to eq(true) 43 | end 44 | 45 | end 46 | -------------------------------------------------------------------------------- /spec/chanmodes/censor_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode G (censor)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | @test_channel = '#censor' 7 | server = IRC_CONFIG.servers['primary'] 8 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 9 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 10 | end 11 | 12 | it 'should censor bad words' do 13 | @swarm.perform do 14 | @obot.send("JOIN #{@test_channel}") 15 | sleep(0.5) 16 | @cbot1.send("JOIN #{@test_channel}") 17 | sleep(0.5) 18 | channel = @obot.channel_with_name(@test_channel) 19 | channel.mode('+G') 20 | sleep(0.5) 21 | @cbot1.send("PRIVMSG #{@test_channel} :aa fucked bb") 22 | sleep(0.5) 23 | end 24 | @swarm.execute 25 | expect(@obot.received_pattern(/fuck/)).not_to eq(true) 26 | expect(@obot.received_pattern(/aa bb/)).to eq(true) 27 | end 28 | 29 | it 'should not censor good words' do 30 | @swarm.perform do 31 | @obot.send("JOIN #{@test_channel}") 32 | sleep(0.5) 33 | @cbot1.send("JOIN #{@test_channel}") 34 | sleep(0.5) 35 | channel = @obot.channel_with_name(@test_channel) 36 | channel.mode('+G') 37 | sleep(0.5) 38 | @cbot1.send("PRIVMSG #{@test_channel} :sunshine") 39 | sleep(0.5) 40 | end 41 | @swarm.execute 42 | expect(@obot.received_pattern(/sunshine/)).to eq(true) 43 | end 44 | 45 | end 46 | -------------------------------------------------------------------------------- /spec/usermodes/privacy_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'User Mode p (privacy)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | servera = IRC_CONFIG.servers['primary'] 7 | serverb = IRC_CONFIG.servers['secondary'] 8 | @cbot1 = @swarm.fly(server: servera.host, port: servera.port, nick: 'cbot1') 9 | @cbot2 = @swarm.fly(server: serverb.host, port: serverb.port, nick: 'cbot2') 10 | end 11 | 12 | it 'should show channel in /WHOIS without umode p' do 13 | @swarm.perform do 14 | @cbot1.send("MODE cbot1 -p") 15 | @cbot1.send("JOIN #secret") 16 | sleep(0.5) 17 | @cbot2.send("WHOIS cbot1") 18 | sleep(0.5) 19 | end 20 | @swarm.execute 21 | expect(@cbot2.received_pattern(/\#secret/)).to eq(true) 22 | end 23 | 24 | it 'should hide channel in /WHOIS with umode p' do 25 | @swarm.perform do 26 | @cbot1.send("MODE cbot1 +p") 27 | @cbot1.send("JOIN #secret") 28 | sleep(0.5) 29 | @cbot2.send("WHOIS cbot1") 30 | sleep(0.5) 31 | end 32 | @swarm.execute 33 | expect(@cbot2.received_pattern(/\#secret/)).not_to eq(true) 34 | end 35 | 36 | it 'should hide channel in /WHO with umode p' do 37 | @swarm.perform do 38 | @cbot1.send("MODE cbot1 +p") 39 | @cbot1.send("JOIN #secret") 40 | sleep(0.5) 41 | @cbot2.send("WHO cbot1") 42 | sleep(0.5) 43 | end 44 | @swarm.execute 45 | expect(@cbot2.received_pattern(/\#secret/)).not_to eq(true) 46 | end 47 | 48 | end 49 | -------------------------------------------------------------------------------- /spec/opercommands/setident_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'SETIDENT command' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | servera = IRC_CONFIG.servers['primary'] 7 | serverb = IRC_CONFIG.servers['secondary'] 8 | @obot = @swarm.fly(server: servera.host, port: servera.port, nick: 'obot') 9 | @cbot2 = @swarm.fly(server: serverb.host, port: serverb.port, nick: 'cbot2') 10 | end 11 | 12 | it 'should disallow SETIDENT to normal users' do 13 | @swarm.perform do 14 | @obot.send("SETIDENT changedid") 15 | @obot.send("WHOIS obot") 16 | sleep(0.5) 17 | end 18 | @swarm.execute 19 | # We expect the command to error 20 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 21 | expect(@obot.received_pattern(/ 311.* changedid/)).not_to eq(true) 22 | end 23 | 24 | # We run this one one a remote user, to get a better test 25 | it 'should allow SETIDENT to opers' do 26 | @swarm.perform do 27 | @obot.send("OPER netadmin test") 28 | @obot.send("SETIDENT changedid") 29 | sleep(0.5) 30 | @obot.send("WHOIS obot") 31 | @cbot2.send("WHOIS obot") 32 | end 33 | @swarm.execute 34 | # Error is not expected 35 | expect(@obot.received_pattern(/ 481 /)).not_to eq(true) 36 | # WHOIS from both servers should show the user with the new vhost 37 | expect(@obot.received_pattern(/ 311.* changedid/)).to eq(true) 38 | expect(@cbot2.received_pattern(/ 311.* changedid/)).to eq(true) 39 | end 40 | 41 | end 42 | -------------------------------------------------------------------------------- /spec/cap/invite-notify_spec.rb.disabled: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'CAP invite-notify' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | @cbot2 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot2') 10 | end 11 | 12 | it 'should show /invites if enabled' do 13 | @swarm.perform do 14 | @obot.send("JOIN #test") 15 | sleep(1) 16 | @cbot1.send("CAP REQ invite-notify") 17 | @cbot1.send("JOIN #test") 18 | sleep(2) 19 | @obot.send("MODE #test +o cbot1") 20 | sleep(2) 21 | @obot.send("INVITE cbot2 #test") 22 | sleep(2) 23 | end 24 | @swarm.execute 25 | expect(@cbot1.received_pattern(/CAP.*ACK.*invite-notify/)).to eq(true) 26 | expect(@cbot1.received_pattern(/:obot.* INVITE cbot2/)).to eq(true) 27 | end 28 | 29 | it 'should not show /invites if not enabled' do 30 | @swarm.perform do 31 | @obot.send("JOIN #test") 32 | sleep(1) 33 | @cbot1.send("CAP REQ -invite-notify") 34 | @cbot1.send("JOIN #test") 35 | sleep(2) 36 | @obot.send("MODE #test +o cbot1") 37 | sleep(2) 38 | @obot.send("INVITE cbot2 #test") 39 | sleep(2) 40 | end 41 | @swarm.execute 42 | expect(@cbot1.received_pattern(/:obot.* INVITE cbot2/)).not_to eq(true) 43 | end 44 | 45 | end 46 | -------------------------------------------------------------------------------- /spec/opercommands/sajoin_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'SAJOIN command' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | end 9 | 10 | it 'should disallow SAJOIN to normal users' do 11 | @swarm.perform do 12 | @obot.send("SAJOIN obot #test") 13 | sleep(0.5) 14 | end 15 | @swarm.execute 16 | # We expect the command to error 17 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 18 | expect(@obot.received_pattern(/ forced to join /)).not_to eq(true) 19 | end 20 | 21 | it 'should disallow SAJOIN to opers with insufficient privileges' do 22 | @swarm.perform do 23 | @obot.send("OPER globop test") 24 | @obot.send("SAJOIN obot #test") 25 | sleep(0.5) 26 | end 27 | @swarm.execute 28 | # We expect the command to error 29 | expect(@obot.received_pattern(/ 381 /)).to eq(true) 30 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 31 | expect(@obot.received_pattern(/ forced to join /)).not_to eq(true) 32 | end 33 | 34 | it 'should allow SAJOIN to opers with sufficient privileges' do 35 | @swarm.perform do 36 | @obot.send("OPER netadmin test") 37 | @obot.send("SAJOIN obot #test") 38 | sleep(0.5) 39 | end 40 | @swarm.execute 41 | # We expect the command to error 42 | expect(@obot.received_pattern(/ 381 /)).to eq(true) 43 | expect(@obot.received_pattern(/ 481 /)).not_to eq(true) 44 | expect(@obot.received_pattern(/ forced to join /)).to eq(true) 45 | expect(@obot.received_pattern(/ 366 obot \#test /)).to eq(true) 46 | end 47 | end 48 | -------------------------------------------------------------------------------- /spec/usermodes/noctcp_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'User Mode T (noctcp)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | servera = IRC_CONFIG.servers['primary'] 7 | serverb = IRC_CONFIG.servers['secondary'] 8 | @cbot1 = @swarm.fly(server: servera.host, port: servera.port, nick: 'cbot1') 9 | @cbot2 = @swarm.fly(server: serverb.host, port: serverb.port, nick: 'cbot2') 10 | end 11 | 12 | it 'should error and block CTCP if target has +T' do 13 | @swarm.perform do 14 | @cbot2.send("MODE cbot2 +T") 15 | sleep(1) 16 | @cbot1.send("PRIVMSG cbot2 :\001CTCPTEST\001") 17 | sleep(1) 18 | end 19 | @swarm.execute 20 | expect(@cbot1.received_pattern(/does not accept CTCPs/)).to eq(true) 21 | expect(@cbot2.received_pattern(/CTCPTEST/)).not_to eq(true) 22 | end 23 | 24 | it 'should allow CTCP if from IRCOp and target has +T' do 25 | @swarm.perform do 26 | @cbot1.send("OPER netadmin test") 27 | @cbot2.send("MODE cbot2 +T") 28 | sleep(1) 29 | @cbot1.send("PRIVMSG cbot2 :\001CTCPTEST\001") 30 | sleep(1) 31 | end 32 | @swarm.execute 33 | expect(@cbot1.received_pattern(/does not accept CTCPs/)).not_to eq(true) 34 | expect(@cbot2.received_pattern(/CTCPTEST/)).to eq(true) 35 | end 36 | 37 | it 'should allow CTCP if from IRCOp and sender has +T' do 38 | @swarm.perform do 39 | @cbot1.send("OPER netadmin test") 40 | @cbot1.send("MODE cbot1 +T") 41 | sleep(1) 42 | @cbot1.send("PRIVMSG cbot2 :\001CTCPTEST\001") 43 | sleep(1) 44 | end 45 | @swarm.execute 46 | expect(@cbot1.received_pattern(/CTCP request.*blocked/)).not_to eq(true) 47 | expect(@cbot2.received_pattern(/CTCPTEST/)).to eq(true) 48 | end 49 | 50 | end 51 | -------------------------------------------------------------------------------- /spec/opercommands/sethost_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'SETHOST command' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | servera = IRC_CONFIG.servers['primary'] 7 | serverb = IRC_CONFIG.servers['secondary'] 8 | @obot = @swarm.fly(server: servera.host, port: servera.port, nick: 'obot') 9 | @cbot2 = @swarm.fly(server: serverb.host, port: serverb.port, nick: 'cbot2') 10 | end 11 | 12 | it 'should disallow SETHOST to normal users' do 13 | @swarm.perform do 14 | @obot.send("SETHOST some.nice.new.vhost") 15 | @obot.send("WHOIS obot") 16 | end 17 | @swarm.execute 18 | # We expect the command to error 19 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 20 | expect(@obot.received_pattern(/ some.nice.new.vhost :is now your displayed host/)).not_to eq(true) 21 | expect(@obot.received_pattern(/ 311.* some.nice.new.vhost/)).not_to eq(true) 22 | end 23 | 24 | # We run this one one a remote user, to get a better test 25 | it 'should allow SETHOST to opers' do 26 | @swarm.perform do 27 | @obot.send("OPER netadmin test") 28 | @obot.send("SETHOST some.nice.new.vhost") 29 | sleep(0.5) 30 | @obot.send("WHOIS obot") 31 | @cbot2.send("WHOIS obot") 32 | end 33 | @swarm.execute 34 | # Error is not expected 35 | expect(@obot.received_pattern(/ 481 /)).not_to eq(true) 36 | # User should get a message about the new host 37 | expect(@obot.received_pattern(/ some.nice.new.vhost :is now your displayed host/)).to eq(true) 38 | # WHOIS from both servers should show the user with the new vhost 39 | expect(@obot.received_pattern(/ 311.* some.nice.new.vhost/)).to eq(true) 40 | expect(@cbot2.received_pattern(/ 311.* some.nice.new.vhost/)).to eq(true) 41 | end 42 | 43 | end 44 | -------------------------------------------------------------------------------- /spec/opercommands/sapart_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'SAPART command' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | end 9 | 10 | it 'should disallow SAPART to normal users' do 11 | @swarm.perform do 12 | @obot.send("JOIN #test") 13 | @obot.send("SAPART obot #test") 14 | sleep(0.5) 15 | end 16 | @swarm.execute 17 | # We expect the command to error 18 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 19 | expect(@obot.received_pattern(/ forced to part /)).not_to eq(true) 20 | end 21 | 22 | it 'should disallow SAPART to opers with insufficient privileges' do 23 | @swarm.perform do 24 | @obot.send("JOIN #test") 25 | @obot.send("OPER globop test") 26 | @obot.send("SAPART obot #test") 27 | sleep(0.5) 28 | end 29 | @swarm.execute 30 | # We expect the command to error 31 | expect(@obot.received_pattern(/ 381 /)).to eq(true) 32 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 33 | expect(@obot.received_pattern(/ forced to part /)).not_to eq(true) 34 | end 35 | 36 | it 'should allow SAPART to opers with sufficient privileges' do 37 | @swarm.perform do 38 | @obot.send("JOIN #test") 39 | @obot.send("OPER netadmin test") 40 | @obot.send("SAPART obot #test") 41 | sleep(0.5) 42 | end 43 | @swarm.execute 44 | # We expect the command to error 45 | expect(@obot.received_pattern(/ 381 /)).to eq(true) 46 | expect(@obot.received_pattern(/ 481 /)).not_to eq(true) 47 | expect(@obot.received_pattern(/ forced to part /)).to eq(true) 48 | expect(@obot.received_pattern(/^:obot.*PART \#test/)).to eq(true) 49 | end 50 | end 51 | -------------------------------------------------------------------------------- /spec/chanmodes/permanent_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Channel Mode P (permanent)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | end 9 | 10 | it 'should result in persistent channel modes' do 11 | @swarm.perform do 12 | @obot.send("OPER netadmin test") 13 | @obot.send("JOIN #perm") 14 | @obot.send("MODE #perm +PTbeI ban!*@* exempt!*@* invex!*@*") 15 | @obot.send("PART #perm") 16 | @obot.send("JOIN #perm") 17 | @obot.send("MODE #perm") 18 | @obot.send("MODE #perm +b") 19 | @obot.send("MODE #perm +e") 20 | @obot.send("MODE #perm +I") 21 | sleep(0.5) 22 | @obot.send("MODE #perm -PTbeI ban!*@* exempt!*@* invex!*@*") 23 | end 24 | @swarm.execute 25 | # Channel modes (+PT) 26 | expect(@obot.received_pattern(/324 obot \#perm \+TP/)).to eq(true) 27 | # Ban 28 | expect(@obot.received_pattern(/367 obot \#perm ban\!\*@\*/)).to eq(true) 29 | # Exempt 30 | expect(@obot.received_pattern(/348 obot \#perm exempt\!\*@\*/)).to eq(true) 31 | # Invex 32 | expect(@obot.received_pattern(/346 obot \#perm invex\!\*@\*/)).to eq(true) 33 | end 34 | 35 | it 'should result in persistent topic' do 36 | @swarm.perform do 37 | @obot.send("OPER netadmin test") 38 | @obot.send("JOIN #perm") 39 | @obot.send("MODE #perm +P") 40 | @obot.send("TOPIC #perm :test 123") 41 | @obot.send("PART #perm") 42 | @obot.send("JOIN #perm") 43 | sleep(0.5) 44 | @obot.send("MODE #perm -P") 45 | @obot.send("TOPIC #perm :") 46 | end 47 | @swarm.execute 48 | 49 | expect(@obot.received_pattern(/332 obot \#perm :test 123/)).to eq(true) 50 | end 51 | 52 | end 53 | -------------------------------------------------------------------------------- /spec/cap/cap_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'CAP' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 8 | end 9 | 10 | it 'should show parameters with CAP v3.2' do 11 | @swarm.perform do 12 | @cbot1.send("CAP LS 302") 13 | sleep(0.5) 14 | end 15 | @swarm.execute 16 | expect(@cbot1.received_pattern(/:[^ ]+ CAP.* LS :.*=.*/)).to eq(true) 17 | end 18 | 19 | # This will be screwed up if ircfly issues a CAP 302 by itself in handshake 20 | # before we do the versionless CAP... 21 | it 'should not show parameters with versionless CAP' do 22 | @swarm.perform do 23 | @cbot1.send("CAP LS") 24 | sleep(0.5) 25 | end 26 | @swarm.execute 27 | expect(@cbot1.received_pattern(/:[^ ]+ CAP.* LS :.*/)).to eq(true) 28 | expect(@cbot1.received_pattern(/:[^ ]+ CAP.* LS :.*=.*/)).not_to eq(true) 29 | end 30 | 31 | # This will be screwed up if ircfly issues a CAP 302 by itself in handshake 32 | # before we do the versionless CAP... 33 | it 'should not show parameters with CAP v3.0' do 34 | @swarm.perform do 35 | @cbot1.send("CAP LS 300") 36 | sleep(0.5) 37 | end 38 | @swarm.execute 39 | expect(@cbot1.received_pattern(/:[^ ]+ CAP.* LS :.*/)).to eq(true) 40 | expect(@cbot1.received_pattern(/:[^ ]+ CAP.* LS :.*=.*/)).not_to eq(true) 41 | end 42 | 43 | # This will be screwed up if ircfly issues CAP's by itself in handshake. 44 | it 'should only list requested caps in CAP LIST' do 45 | @swarm.perform do 46 | @cbot1.send("CAP LS") 47 | @cbot1.send("CAP LIST") 48 | sleep(0.5) 49 | end 50 | @swarm.execute 51 | expect(@cbot1.received_pattern(/:[^ ]+ CAP.* LIST :/)).to eq(true) 52 | end 53 | end 54 | -------------------------------------------------------------------------------- /spec/opercommands/oper_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe '/OPER command' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | end 9 | 10 | it 'should reject wrong case of oper name' do 11 | @swarm.perform do 12 | @obot.send("OPER NeTaDmIn test") 13 | sleep(0.5) 14 | end 15 | @swarm.execute 16 | # We expect the command to error (no o lines) 17 | expect(@obot.received_pattern(/ 491 /)).to eq(true) 18 | expect(@obot.received_pattern(/ 381 /)).not_to eq(true) 19 | end 20 | 21 | it 'should reject incorrect host' do 22 | @swarm.perform do 23 | @obot.send("OPER netadmin-badhost test") 24 | sleep(0.5) 25 | end 26 | @swarm.execute 27 | # We expect the command to error (no o lines) 28 | expect(@obot.received_pattern(/ 491 /)).to eq(true) 29 | expect(@obot.received_pattern(/ 381 /)).not_to eq(true) 30 | end 31 | 32 | it 'should reject wrong password' do 33 | @swarm.perform do 34 | @obot.send("OPER netadmin TeSt") 35 | sleep(0.5) 36 | end 37 | @swarm.execute 38 | # We expect the command to error (password incorrect) 39 | expect(@obot.received_pattern(/ 464 /)).to eq(true) 40 | expect(@obot.received_pattern(/ 491 /)).not_to eq(true) 41 | expect(@obot.received_pattern(/ 381 /)).not_to eq(true) 42 | end 43 | 44 | it 'should accept with correct name, password and hostname' do 45 | @swarm.perform do 46 | @obot.send("OPER netadmin test") 47 | sleep(0.5) 48 | end 49 | @swarm.execute 50 | # We expect the command to succeed (you are now an IRC operator) 51 | expect(@obot.received_pattern(/ 381 /)).to eq(true) 52 | expect(@obot.received_pattern(/ 491 /)).not_to eq(true) 53 | end 54 | 55 | end 56 | -------------------------------------------------------------------------------- /spec/opercommands/samode_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'SAMODE command' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | end 9 | 10 | it 'should disallow SAMODE to normal users' do 11 | @swarm.perform do 12 | @obot.send("JOIN #test") 13 | @obot.send("MODE #test -o obot") 14 | @obot.send("SAMODE #test +k keykeykey") 15 | sleep(0.5) 16 | end 17 | @swarm.execute 18 | # We expect the command to error 19 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 20 | expect(@obot.received_pattern(/:.* MODE.*keykeykey/)).not_to eq(true) 21 | end 22 | 23 | it 'should disallow SAMODE to opers with insufficient privileges' do 24 | @swarm.perform do 25 | @obot.send("JOIN #test") 26 | @obot.send("MODE #test -o obot") 27 | @obot.send("OPER globop test") 28 | @obot.send("SAMODE #test +k keykeykey") 29 | sleep(0.5) 30 | end 31 | @swarm.execute 32 | # We expect the command to error 33 | expect(@obot.received_pattern(/ 381 /)).to eq(true) 34 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 35 | expect(@obot.received_pattern(/:.* MODE.*keykeykey/)).not_to eq(true) 36 | end 37 | 38 | it 'should allow SAMODE to opers with sufficient privileges' do 39 | @swarm.perform do 40 | @obot.send("JOIN #test") 41 | @obot.send("MODE #test -o obot") 42 | @obot.send("OPER netadmin test") 43 | @obot.send("SAMODE #test +k keykeykey") 44 | sleep(0.5) 45 | end 46 | @swarm.execute 47 | # We expect the command to error 48 | expect(@obot.received_pattern(/ 381 /)).to eq(true) 49 | expect(@obot.received_pattern(/ 481 /)).not_to eq(true) 50 | expect(@obot.received_pattern(/:.* MODE.*keykeykey/)).to eq(true) 51 | end 52 | 53 | end 54 | -------------------------------------------------------------------------------- /spec/opercommands/chgident_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'CHGIDENT command' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | servera = IRC_CONFIG.servers['primary'] 7 | serverb = IRC_CONFIG.servers['secondary'] 8 | @obot = @swarm.fly(server: servera.host, port: servera.port, nick: 'obot') 9 | @cbot2 = @swarm.fly(server: serverb.host, port: serverb.port, nick: 'cbot2') 10 | end 11 | 12 | it 'should disallow CHGIDENT to normal users' do 13 | @swarm.perform do 14 | @obot.send("CHGIDENT obot changedid") 15 | @obot.send("WHOIS obot") 16 | sleep(0.5) 17 | end 18 | @swarm.execute 19 | # We expect the command to error 20 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 21 | expect(@obot.received_pattern(/ 311.* changedid/)).not_to eq(true) 22 | end 23 | 24 | it 'should disallow CHGIDENT to opers with insufficient privileges' do 25 | @swarm.perform do 26 | @obot.send("OPER locop test") 27 | @obot.send("CHGIDENT obot changedid") 28 | @obot.send("WHOIS obot") 29 | end 30 | @swarm.execute 31 | # We expect the command to error 32 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 33 | expect(@obot.received_pattern(/ 311.* changedid/)).not_to eq(true) 34 | end 35 | 36 | # We run this one one a remote user, to get a better test 37 | it 'should allow CHGIDENT to opers' do 38 | @swarm.perform do 39 | @obot.send("OPER netadmin test") 40 | sleep(0.5) 41 | @obot.send("CHGIDENT cbot2 changedid") 42 | sleep(0.5) 43 | @cbot2.send("WHOIS cbot2") 44 | @obot.send("WHOIS cbot2") 45 | end 46 | @swarm.execute 47 | # Error is not expected 48 | expect(@obot.received_pattern(/ 481 /)).not_to eq(true) 49 | # WHOIS from both servers should show the user with the new vhost 50 | expect(@obot.received_pattern(/ 311.* changedid/)).to eq(true) 51 | expect(@cbot2.received_pattern(/ 311.* changedid/)).to eq(true) 52 | end 53 | 54 | end 55 | -------------------------------------------------------------------------------- /spec/opercommands/chgname_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'CHGNAME command' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | servera = IRC_CONFIG.servers['primary'] 7 | serverb = IRC_CONFIG.servers['secondary'] 8 | @obot = @swarm.fly(server: servera.host, port: servera.port, nick: 'obot') 9 | @cbot2 = @swarm.fly(server: serverb.host, port: serverb.port, nick: 'cbot2') 10 | end 11 | 12 | it 'should disallow CHGNAME to normal users' do 13 | @swarm.perform do 14 | @obot.send("CHGNAME obot some real name") 15 | @obot.send("WHOIS obot") 16 | end 17 | @swarm.execute 18 | # We expect the command to error 19 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 20 | expect(@obot.received_pattern(/ 311.*:some real name/)).not_to eq(true) 21 | end 22 | 23 | it 'should disallow CHGNAME to opers with insufficient privileges' do 24 | @swarm.perform do 25 | @obot.send("OPER locop test") 26 | @obot.send("CHGNAME obot some real name") 27 | @obot.send("WHOIS obot") 28 | end 29 | @swarm.execute 30 | # We expect the command to error 31 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 32 | expect(@obot.received_pattern(/ 311.*:some real name/)).not_to eq(true) 33 | end 34 | 35 | # We run this one one a remote user, to get a better test 36 | it 'should allow CHGNAME to opers' do 37 | @swarm.perform do 38 | @obot.send("OPER netadmin test") 39 | sleep(0.5) 40 | @obot.send("CHGNAME cbot2 some real name") 41 | sleep(0.5) 42 | @cbot2.send("WHOIS cbot2") 43 | @obot.send("WHOIS cbot2") 44 | end 45 | @swarm.execute 46 | # Error is not expected 47 | expect(@obot.received_pattern(/ 481 /)).not_to eq(true) 48 | # WHOIS from both servers should show the user with the new vhost 49 | expect(@obot.received_pattern(/ 311.*:some real name/)).to eq(true) 50 | expect(@cbot2.received_pattern(/ 311.*:some real name/)).to eq(true) 51 | end 52 | 53 | end 54 | -------------------------------------------------------------------------------- /spec/opercommands/chghost_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'CHGHOST command' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | servera = IRC_CONFIG.servers['primary'] 7 | serverb = IRC_CONFIG.servers['secondary'] 8 | @obot = @swarm.fly(server: servera.host, port: servera.port, nick: 'obot') 9 | @cbot2 = @swarm.fly(server: serverb.host, port: serverb.port, nick: 'cbot2') 10 | end 11 | 12 | it 'should disallow CHGHOST to normal users' do 13 | @swarm.perform do 14 | @obot.send("CHGHOST obot some.nice.new.vhost") 15 | @obot.send("WHOIS obot") 16 | end 17 | @swarm.execute 18 | # We expect the command to error 19 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 20 | expect(@obot.received_pattern(/ some.nice.new.vhost :is now your displayed host/)).not_to eq(true) 21 | expect(@obot.received_pattern(/ 311.* some.nice.new.vhost/)).not_to eq(true) 22 | end 23 | 24 | it 'should disallow CHGHOST to opers with insufficient privileges' do 25 | @swarm.perform do 26 | @obot.send("OPER locop test") 27 | @obot.send("CHGHOST obot some.nice.new.vhost") 28 | @obot.send("WHOIS obot") 29 | end 30 | @swarm.execute 31 | # We expect the command to error 32 | expect(@obot.received_pattern(/ 481 /)).to eq(true) 33 | expect(@obot.received_pattern(/ some.nice.new.vhost :is now your displayed host/)).not_to eq(true) 34 | expect(@obot.received_pattern(/ 311.* some.nice.new.vhost/)).not_to eq(true) 35 | end 36 | 37 | # We run this one one a remote user, to get a better test 38 | it 'should allow CHGHOST to opers' do 39 | @swarm.perform do 40 | @obot.send("OPER netadmin test") 41 | sleep(1) 42 | @obot.send("CHGHOST cbot2 some.nice.new.vhost") 43 | sleep(1) 44 | @cbot2.send("WHOIS cbot2") 45 | @obot.send("WHOIS cbot2") 46 | end 47 | @swarm.execute 48 | # Error is not expected 49 | expect(@obot.received_pattern(/ 481 /)).not_to eq(true) 50 | # User should get a message about the new host 51 | expect(@cbot2.received_pattern(/ some.nice.new.vhost :is now your displayed host/)).to eq(true) 52 | # WHOIS from both servers should show the user with the new vhost 53 | expect(@obot.received_pattern(/ 311.* some.nice.new.vhost/)).to eq(true) 54 | expect(@cbot2.received_pattern(/ 311.* some.nice.new.vhost/)).to eq(true) 55 | end 56 | 57 | end 58 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## About 2 | This is the OLD automated test system for UnrealIRCd 4 (ruby-based). 3 | The new test framework can be found at https://github.com/unrealircd/unrealircd-tests 4 | 5 | This will test a subset of features. The ultimate goal is to have a test for each and every feature. 6 | Right now we have tests for (almost) all channel modes and user modes but almost none for commands. 7 | 8 | ## Installation instructions 9 | 10 | ### Install python and bundler 11 | * `apt-get install python` or `yum install python` 12 | * `sudo gem install bundler` 13 | 14 | ### Install the IRC test framework (ircfly) 15 | ``` 16 | git co https://github.com/unrealircd/ircfly.git 17 | cd ircfly 18 | bundle install 19 | rake build 20 | sudo rake install 21 | cd .. 22 | ``` 23 | 24 | ### Checkout the unrealircd-tests 25 | ``` 26 | git co https://github.com/unrealircd/unrealircd-tests.git 27 | cd unrealircd-tests 28 | bundle install 29 | ``` 30 | 31 | ### Configure unrealircd-tests and your IRC server 32 | * `cp config.yaml.example config.yaml` 33 | * Now edit config.yaml to point it to your test IRC server. By default it assumes an ircd on port 5667. 34 | * In the ircdconfig/ directory are files that you should include in your UnrealIRCd. They contain things like oper blocks and vhost blocks that will be used by tests. 35 | 36 | ### Running tests 37 | * Try running an indiviaul test like: `rspec spec/chanmodes/noctcp_spec.rb` 38 | * To run all tests you simply run `rake`. This takes several minutes to complete. 39 | 40 | ## Expected test output 41 | You will see the raw IRC traffic (in and out). At the end it will say something like: 42 | ``` 43 | Finished in 4.08 seconds (files took 0.24379 seconds to load) 44 | 1 example, 0 failures 45 | ``` 46 | 47 | Obviously, the most important is the '0 failures' part. 48 | 49 | ## Writing tests 50 | We could really use a lot more tests, so if you want to help out, please do. 51 | 52 | Check out a few tests in the spec/ directory. Feel free to copy one and then create a new test based on it. 53 | 54 | Tests: 55 | * `spec/chanmodes/` - Channel modes 56 | * `spec/usermodes/` - User modes 57 | * `spec/extbans/` - Extended bans 58 | * `spec/cap` - CAP (client protocol negotiation) 59 | * `spec/usercommands/` - User commands, such as JOIN PART TOPIC etc. 60 | * `spec/opercommands/` - IRCOp-only commands, such as SAJOIN SAPART KILL etc. 61 | * `spec/other/` - Other tests that do not fit in the above categories. 62 | -------------------------------------------------------------------------------- /spec/opercommands/squit_connect_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | # We combine the SQUIT and CONNECT tests as to not leave the server 4 | # in a bad state (unlinked). 5 | 6 | # Remark: in contrary to many other tests, the oper bot is on the secondary 7 | # server in this tests and the other one on the primary. This is because in 8 | # the ircd config we only allow the secondary to connect to the primary and 9 | # not the other way around (we could change the config to allow this, but 10 | # it is meant to be this way so we can test link blocks without a 11 | # link::outgoing section). 12 | 13 | describe 'SQUIT and CONNECT commands' do 14 | before(:each) do 15 | @swarm = Ircfly::Swarm.new 16 | servera = IRC_CONFIG.servers['primary'] 17 | serverb = IRC_CONFIG.servers['secondary'] 18 | @cbot1 = @swarm.fly(server: servera.host, port: servera.port, nick: 'cbot1') 19 | @obot2 = @swarm.fly(server: serverb.host, port: serverb.port, nick: 'obot2') 20 | end 21 | 22 | it 'should disallow SQUIT to normal users' do 23 | @swarm.perform do 24 | @obot2.send("SQUIT hub.test.net") 25 | end 26 | @swarm.execute 27 | # We expect the command to error 28 | expect(@obot2.received_pattern(/ 481 /)).to eq(true) 29 | end 30 | 31 | it 'should disallow CONNECT to normal users' do 32 | @swarm.perform do 33 | @obot2.send("CONNECT hub.test.net") 34 | end 35 | @swarm.execute 36 | # We expect the command to error 37 | expect(@obot2.received_pattern(/ 481 /)).to eq(true) 38 | end 39 | 40 | it 'should allow SQUIT and CONNECT to opers' do 41 | @swarm.perform do 42 | @obot2.send("OPER netadmin test") 43 | sleep(1) 44 | @obot2.send("PRIVMSG cbot1 :before squit") 45 | @obot2.send("SQUIT hub.test.net") 46 | @obot2.send("PRIVMSG cbot1 :after squit") 47 | sleep(0.5) 48 | @obot2.send("CONNECT hub.test.net") 49 | sleep(2) 50 | @obot2.send("PRIVMSG cbot1 :after reconnect") 51 | sleep(1) 52 | end 53 | @swarm.execute 54 | # Errors are not expected 55 | expect(@obot2.received_pattern(/ 481 /)).not_to eq(true) 56 | # We should receive the 'before squit', this is to ensure the test goes correctly. 57 | expect(@cbot1.received_pattern(/.*PRIVMSG.*before squit/)).to eq(true) 58 | # We should NOT receive the 'after squit', since servers should not be linked 59 | expect(@cbot1.received_pattern(/.*PRIVMSG.*after squit/)).not_to eq(true) 60 | # ..we should get an error instead about no such nick: 61 | expect(@obot2.received_pattern(/:.*401 obot2 cbot1/)).to eq(true) 62 | # We should receive the 'after reconnect', since now we are linked again 63 | expect(@cbot1.received_pattern(/.*PRIVMSG.*after reconnect/)).to eq(true) 64 | end 65 | 66 | end 67 | -------------------------------------------------------------------------------- /spec/opercommands/spamfilter_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Spamfilter' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1') 9 | end 10 | 11 | it 'should (only) block bad words with simple spamfilter' do 12 | @swarm.perform do 13 | @obot.send("OPER netadmin test") 14 | @obot.send("SPAMFILTER add -simple c block 0 spamfilter_test simple*test") 15 | @obot.send("JOIN #test") 16 | @cbot1.send("JOIN #test") 17 | sleep(0.5) 18 | @cbot1.send("PRIVMSG #test :simple123test") 19 | @cbot1.send("PRIVMSG #test :othermsg") 20 | sleep(0.5) 21 | @obot.send("SPAMFILTER del -simple c block 0 spamfilter_test simple*test") 22 | end 23 | @swarm.execute 24 | expect(@obot.received_pattern(/matches filter.*simple123test/)).to eq(true) #snomask notification 25 | expect(@obot.received_pattern(/:cbot.*simple123test/)).not_to eq(true) #should not receive chanmsg 26 | expect(@obot.received_pattern(/:cbot.*othermsg/)).to eq(true) #should receive chanmsg 27 | expect(@cbot1.received_pattern(/.* 404 cbot1.*spamfilter test/)).to eq(true) # 404 numeric 28 | end 29 | 30 | it 'should (only) block bad words with regex spamfilter' do 31 | @swarm.perform do 32 | @obot.send("OPER netadmin test") 33 | @obot.send("SPAMFILTER add -regex c block 0 spamfilter_test simple.*test") 34 | @obot.send("JOIN #test") 35 | @cbot1.send("JOIN #test") 36 | sleep(0.5) 37 | @cbot1.send("PRIVMSG #test :simple123test") 38 | @cbot1.send("PRIVMSG #test :othermsg") 39 | sleep(0.5) 40 | @obot.send("SPAMFILTER del -regex c block 0 spamfilter_test simple.*test") 41 | end 42 | @swarm.execute 43 | expect(@obot.received_pattern(/matches filter.*simple123test/)).to eq(true) #snomask notification 44 | expect(@obot.received_pattern(/:cbot.*simple123test/)).not_to eq(true) #should not receive chanmsg 45 | expect(@obot.received_pattern(/:cbot.*othermsg/)).to eq(true) #should receive chanmsg 46 | expect(@cbot1.received_pattern(/.* 404 cbot1.*spamfilter test/)).to eq(true) # 404 numeric 47 | end 48 | 49 | it 'should (only) block bad words with posix spamfilter' do 50 | @swarm.perform do 51 | @obot.send("OPER netadmin test") 52 | @obot.send("SPAMFILTER add -posix c block 0 spamfilter_test simple.*test") 53 | @obot.send("JOIN #test") 54 | @cbot1.send("JOIN #test") 55 | sleep(0.5) 56 | @cbot1.send("PRIVMSG #test :simple123test") 57 | @cbot1.send("PRIVMSG #test :othermsg") 58 | sleep(0.5) 59 | @obot.send("SPAMFILTER del -posix c block 0 spamfilter_test simple.*test") 60 | end 61 | @swarm.execute 62 | expect(@obot.received_pattern(/matches filter.*simple123test/)).to eq(true) #snomask notification 63 | expect(@obot.received_pattern(/:cbot.*simple123test/)).not_to eq(true) #should not receive chanmsg 64 | expect(@obot.received_pattern(/:cbot.*othermsg/)).to eq(true) #should receive chanmsg 65 | expect(@cbot1.received_pattern(/.* 404 cbot1.*spamfilter test/)).to eq(true) # 404 numeric 66 | end 67 | end 68 | -------------------------------------------------------------------------------- /ircdconfig/common.conf: -------------------------------------------------------------------------------- 1 | /*** Common configuration file for test suite ***/ 2 | /*** This is NOT suitable for production!!! ***/ 3 | 4 | include "modules.default.conf"; 5 | include "modules.optional.conf"; 6 | include "help/help.conf"; 7 | include "badwords.conf"; 8 | include "spamfilter.conf"; 9 | include "operclass.default.conf"; 10 | 11 | admin { 12 | "Test Network"; 13 | "!NOT FOR PRODUCTION!"; 14 | }; 15 | 16 | class clients { 17 | pingfreq 90; 18 | maxclients 2048; 19 | sendq 100000; 20 | }; 21 | 22 | class opers 23 | { 24 | pingfreq 90; 25 | maxclients 50; 26 | sendq 1M; 27 | recvq 8000; 28 | }; 29 | 30 | class servers 31 | { 32 | pingfreq 60; 33 | connfreq 15; /* try to connect every 15 seconds */ 34 | maxclients 10; /* max servers */ 35 | sendq 5M; 36 | }; 37 | 38 | allow { 39 | ip "*@*"; 40 | class clients; 41 | maxperip 2048; 42 | }; 43 | 44 | oper test { 45 | class opers; 46 | mask *@*; 47 | password "test"; 48 | operclass netadmin-with-override; 49 | swhois "is a Network Administrator"; 50 | vhost netadmin.test.net; 51 | }; 52 | 53 | oper netadmin { 54 | mask *@127.0.0.1; 55 | password "test"; 56 | class clients; 57 | operclass netadmin-with-override; 58 | vhost "netadmin.test.net"; 59 | swhois "is a Network Administrator"; 60 | }; 61 | 62 | oper netadmin-badhost { 63 | mask *@127.0.0.5; 64 | password "test"; 65 | class clients; 66 | operclass netadmin-with-override; 67 | vhost "netadmin.test.net"; 68 | swhois "is a Network Administrator"; 69 | }; 70 | 71 | oper globop { 72 | mask *@127.0.0.1; 73 | password "test"; 74 | class clients; 75 | operclass globop-with-override; 76 | vhost "globop.test.net"; 77 | }; 78 | 79 | oper locop { 80 | mask *@127.0.0.1; 81 | password "test"; 82 | class clients; 83 | operclass locop; 84 | vhost "locop.test.net"; 85 | }; 86 | 87 | link services.test.net 88 | { 89 | incoming { 90 | mask 127.0.0.1; 91 | }; 92 | 93 | password "test"; 94 | 95 | class servers; 96 | }; 97 | 98 | ulines { 99 | services.test.net; 100 | }; 101 | 102 | drpass { 103 | restart "restart"; 104 | die "die"; 105 | }; 106 | 107 | include "aliases/anope.conf"; 108 | 109 | ban nick { 110 | mask "*C*h*a*n*S*e*r*v*"; 111 | reason "Reserved for Services"; 112 | }; 113 | 114 | ban ip { 115 | mask 195.86.232.81; 116 | reason "Hate you"; 117 | }; 118 | 119 | ban server { 120 | mask eris.berkeley.edu; 121 | reason "Get out of here."; 122 | }; 123 | 124 | ban user { 125 | mask *tirc@*.saturn.bbn.com; 126 | reason "Idiot"; 127 | }; 128 | 129 | ban realname { 130 | mask "Swat Team"; 131 | reason "mIRKFORCE"; 132 | }; 133 | 134 | except ban { 135 | mask *@127.0.0.1; 136 | }; 137 | 138 | except tkl { 139 | mask *@127.0.0.1; 140 | type all; 141 | }; 142 | 143 | deny dcc { 144 | filename "*sub7*"; 145 | reason "Possible Sub7 Virus"; 146 | }; 147 | 148 | deny channel { 149 | channel "*warez*"; 150 | reason "Warez is illegal"; 151 | class "clients"; 152 | }; 153 | 154 | vhost { 155 | vhost this.is.a.test; 156 | mask *@127.0.0.1; 157 | login test; 158 | password test; 159 | swhois "likes to test things"; 160 | }; 161 | 162 | set { 163 | network-name "TestNet"; 164 | default-server "irc.test.net"; 165 | services-server "services.test.net"; 166 | stats-server "stats.test.net"; 167 | help-channel "#Help"; 168 | hiddenhost-prefix "Clk"; 169 | prefix-quit "Quit"; 170 | cloak-keys { 171 | /* Only use this for this test network. Don't copy these! */ 172 | "CP25AlIHv15BM2NCPt0f015ttS65Ve6Kehf5004YPv784036B3"; 173 | "Yg57qlk6dPB7DWo8UF08W5lbfFxvclm3d4U35g3Na13uTRh2I55y0Wgms25"; 174 | "eea32TX1YB6y6Ir11O7n7x54160N1TX4mAWi0ai2fy8s04yqTHNNk"; 175 | }; 176 | kline-address "test@example.org"; 177 | modes-on-connect "+ixw"; 178 | modes-on-oper "+xwgs"; 179 | options { 180 | hide-ulines; 181 | }; 182 | 183 | maxchannelsperuser 10; 184 | 185 | anti-spam-quit-message-time 5s; 186 | 187 | oper-only-stats "*"; 188 | 189 | /* These flood protection features need to be disabled though: */ 190 | anti-flood { connect-flood 250:1; }; 191 | handshake-delay 0; 192 | max-unknown-connections-per-ip 99; 193 | 194 | spamfilter { 195 | ban-time 1d; 196 | ban-reason "Spam/Advertising"; 197 | virus-help-channel "#help"; 198 | }; 199 | 200 | ping-cookie no; /* annoying with debugging */ 201 | }; 202 | -------------------------------------------------------------------------------- /spec/other/005_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | # This test checks if the 005 tokens are present 4 | 5 | describe '005 numeric' do 6 | before(:each) do 7 | @swarm = Ircfly::Swarm.new 8 | servera = IRC_CONFIG.servers['primary'] 9 | serverb = IRC_CONFIG.servers['secondary'] 10 | hub = IRC_CONFIG.servers['hub'] 11 | @bot1 = @swarm.fly(server: servera.host, port: servera.port, nick: 'bot1') 12 | @bot2 = @swarm.fly(server: serverb.host, port: serverb.port, nick: 'bot2') 13 | end 14 | 15 | it 'should contain expected 005 tokens' do 16 | @swarm.perform do 17 | # We don't have to do anything, actually 18 | end 19 | @swarm.execute 20 | # I considered using generic value matchers such as CHANMODES=.+,.+,.+,.+ 21 | # However it is probably a good idea to be notified of such changes since 22 | # they don't happen much and may be unintended. 23 | expect(@bot1.received_pattern(/ 005 .* AWAYLEN=307.*/)).to eq(true) 24 | expect(@bot2.received_pattern(/ 005 .* AWAYLEN=307.*/)).to eq(true) 25 | expect(@bot1.received_pattern(/ 005 .* CASEMAPPING=ascii.*/)).to eq(true) 26 | expect(@bot2.received_pattern(/ 005 .* CASEMAPPING=ascii.*/)).to eq(true) 27 | expect(@bot1.received_pattern(/ 005 .* CHANLIMIT=#:10.*/)).to eq(true) 28 | expect(@bot2.received_pattern(/ 005 .* CHANLIMIT=#:10.*/)).to eq(true) 29 | expect(@bot1.received_pattern(/ 005 .* CHANMODES=beI,kLf,l,psmntirzMQNRTOVKDdGPZSCc.*/)).to eq(true) 30 | expect(@bot2.received_pattern(/ 005 .* CHANMODES=beI,kLf,l,psmntirzMQNRTOVKDdGPZSCc.*/)).to eq(true) 31 | expect(@bot1.received_pattern(/ 005 .* CHANNELLEN=32.*/)).to eq(true) 32 | expect(@bot2.received_pattern(/ 005 .* CHANNELLEN=32.*/)).to eq(true) 33 | expect(@bot1.received_pattern(/ 005 .* CHANTYPES=#.*/)).to eq(true) 34 | expect(@bot2.received_pattern(/ 005 .* CHANTYPES=#.*/)).to eq(true) 35 | expect(@bot1.received_pattern(/ 005 .* DEAF=d.*/)).to eq(true) 36 | expect(@bot2.received_pattern(/ 005 .* DEAF=d.*/)).to eq(true) 37 | expect(@bot1.received_pattern(/ 005 .* ELIST=MNUCT.*/)).to eq(true) 38 | expect(@bot2.received_pattern(/ 005 .* ELIST=MNUCT.*/)).to eq(true) 39 | expect(@bot1.received_pattern(/ 005 .* EXCEPTS.*/)).to eq(true) 40 | expect(@bot2.received_pattern(/ 005 .* EXCEPTS.*/)).to eq(true) 41 | expect(@bot1.received_pattern(/ 005 .* EXTBAN=~,tmTSOcaRrnqj.*/)).to eq(true) 42 | expect(@bot2.received_pattern(/ 005 .* EXTBAN=~,tmTSOcaRrnqj.*/)).to eq(true) 43 | expect(@bot1.received_pattern(/ 005 .* HCN.*/)).to eq(true) 44 | expect(@bot2.received_pattern(/ 005 .* HCN.*/)).to eq(true) 45 | expect(@bot1.received_pattern(/ 005 .* INVEX.*/)).to eq(true) 46 | expect(@bot2.received_pattern(/ 005 .* INVEX.*/)).to eq(true) 47 | expect(@bot1.received_pattern(/ 005 .* KICKLEN=307.*/)).to eq(true) 48 | expect(@bot2.received_pattern(/ 005 .* KICKLEN=307.*/)).to eq(true) 49 | expect(@bot1.received_pattern(/ 005 .* KNOCK.*/)).to eq(true) 50 | expect(@bot2.received_pattern(/ 005 .* KNOCK.*/)).to eq(true) 51 | expect(@bot1.received_pattern(/ 005 .* MAP.*/)).to eq(true) 52 | expect(@bot2.received_pattern(/ 005 .* MAP.*/)).to eq(true) 53 | expect(@bot1.received_pattern(/ 005 .* MAXCHANNELS=10.*/)).to eq(true) 54 | expect(@bot2.received_pattern(/ 005 .* MAXCHANNELS=10.*/)).to eq(true) 55 | expect(@bot1.received_pattern(/ 005 .* MAXLIST=b:60,e:60,I:60.*/)).to eq(true) 56 | expect(@bot2.received_pattern(/ 005 .* MAXLIST=b:60,e:60,I:60.*/)).to eq(true) 57 | expect(@bot1.received_pattern(/ 005 .* MAXNICKLEN=30.*/)).to eq(true) 58 | expect(@bot2.received_pattern(/ 005 .* MAXNICKLEN=30.*/)).to eq(true) 59 | expect(@bot1.received_pattern(/ 005 .* MODES=12.*/)).to eq(true) 60 | expect(@bot2.received_pattern(/ 005 .* MODES=12.*/)).to eq(true) 61 | expect(@bot1.received_pattern(/ 005 .* NAMESX.*/)).to eq(true) 62 | expect(@bot2.received_pattern(/ 005 .* NAMESX.*/)).to eq(true) 63 | expect(@bot1.received_pattern(/ 005 .* NETWORK=TestNet.*/)).to eq(true) 64 | expect(@bot2.received_pattern(/ 005 .* NETWORK=TestNet.*/)).to eq(true) 65 | expect(@bot1.received_pattern(/ 005 .* NICKLEN=30.*/)).to eq(true) 66 | expect(@bot2.received_pattern(/ 005 .* NICKLEN=30.*/)).to eq(true) 67 | expect(@bot1.received_pattern(/ 005 .* PREFIX=\(qaohv\)~&@%+.*/)).to eq(true) 68 | expect(@bot2.received_pattern(/ 005 .* PREFIX=\(qaohv\)~&@%+.*/)).to eq(true) 69 | expect(@bot1.received_pattern(/ 005 .* QUITLEN=307.*/)).to eq(true) 70 | expect(@bot2.received_pattern(/ 005 .* QUITLEN=307.*/)).to eq(true) 71 | expect(@bot1.received_pattern(/ 005 .* SAFELIST.*/)).to eq(true) 72 | expect(@bot2.received_pattern(/ 005 .* SAFELIST.*/)).to eq(true) 73 | expect(@bot1.received_pattern(/ 005 .* SILENCE=15.*/)).to eq(true) 74 | expect(@bot2.received_pattern(/ 005 .* SILENCE=15.*/)).to eq(true) 75 | expect(@bot1.received_pattern(/ 005 .* STATUSMSG=~&@%+.*/)).to eq(true) 76 | expect(@bot2.received_pattern(/ 005 .* STATUSMSG=~&@%+.*/)).to eq(true) 77 | expect(@bot1.received_pattern(/ 005 .* TARGMAX=DCCALLOW:,ISON:,JOIN:,KICK:4,KILL:,LIST:,NAMES:1,NOTICE:1,PART:,PRIVMSG:4,SAJOIN:,SAPART:,USERHOST:,USERIP:,WATCH:,WHOIS:1,WHOWAS:1.*/)).to eq(true) 78 | expect(@bot2.received_pattern(/ 005 .* TARGMAX=DCCALLOW:,ISON:,JOIN:,KICK:4,KILL:,LIST:,NAMES:1,NOTICE:1,PART:,PRIVMSG:4,SAJOIN:,SAPART:,USERHOST:,USERIP:,WATCH:,WHOIS:1,WHOWAS:1.*/)).to eq(true) 79 | expect(@bot1.received_pattern(/ 005 .* TOPICLEN=360.*/)).to eq(true) 80 | expect(@bot2.received_pattern(/ 005 .* TOPICLEN=360.*/)).to eq(true) 81 | expect(@bot1.received_pattern(/ 005 .* UHNAMES.*/)).to eq(true) 82 | expect(@bot2.received_pattern(/ 005 .* UHNAMES.*/)).to eq(true) 83 | expect(@bot1.received_pattern(/ 005 .* USERIP.*/)).to eq(true) 84 | expect(@bot2.received_pattern(/ 005 .* USERIP.*/)).to eq(true) 85 | expect(@bot1.received_pattern(/ 005 .* WALLCHOPS.*/)).to eq(true) 86 | expect(@bot2.received_pattern(/ 005 .* WALLCHOPS.*/)).to eq(true) 87 | expect(@bot1.received_pattern(/ 005 .* WATCH=128.*/)).to eq(true) 88 | expect(@bot2.received_pattern(/ 005 .* WATCH=128.*/)).to eq(true) 89 | expect(@bot1.received_pattern(/ 005 .* WATCHOPTS=A.*/)).to eq(true) 90 | expect(@bot2.received_pattern(/ 005 .* WATCHOPTS=A.*/)).to eq(true) 91 | expect(@bot1.received_pattern(/ 005 .* WHOX.*/)).to eq(true) 92 | expect(@bot2.received_pattern(/ 005 .* WHOX.*/)).to eq(true) 93 | end 94 | end 95 | -------------------------------------------------------------------------------- /spec/chanmodes/ban_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | # Basic ban tests on nick/user/host and on cloaked host, IP, etc. 4 | # Extended bans are not tested here but in their own file. 5 | 6 | describe 'Channel Mode b (ban)' do 7 | before(:each) do 8 | @swarm = Ircfly::Swarm.new 9 | server = IRC_CONFIG.servers['primary'] 10 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 11 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1', user: 'bantest') 12 | end 13 | 14 | it 'should ban if matching nick' do 15 | @swarm.perform do 16 | @obot.send("JOIN #test") 17 | @obot.send("MODE #test +b cbot1!*@*") 18 | sleep(0.5) 19 | @cbot1.send("JOIN #test") 20 | sleep(0.5) 21 | end 22 | @swarm.execute 23 | expect(@cbot1.received_pattern(/474.*Cannot join/)).to eq(true) 24 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).not_to eq(true) 25 | end 26 | 27 | it 'should not ban if not matching nick' do 28 | @swarm.perform do 29 | @obot.send("JOIN #test") 30 | @obot.send("MODE #test +b cbot999!*@*") 31 | sleep(0.5) 32 | @cbot1.send("JOIN #test") 33 | sleep(0.5) 34 | end 35 | @swarm.execute 36 | expect(@cbot1.received_pattern(/474.*Cannot join/)).not_to eq(true) 37 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).to eq(true) 38 | end 39 | 40 | it 'should ban if matching username' do 41 | @swarm.perform do 42 | @obot.send("JOIN #test") 43 | @obot.send("MODE #test +b *!*bantest@*") 44 | sleep(0.5) 45 | @cbot1.send("JOIN #test") 46 | sleep(0.5) 47 | end 48 | @swarm.execute 49 | expect(@cbot1.received_pattern(/474.*Cannot join/)).to eq(true) 50 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).not_to eq(true) 51 | end 52 | 53 | it 'should not ban if not matching username' do 54 | @swarm.perform do 55 | @obot.send("JOIN #test") 56 | @obot.send("MODE #test +b *!*bantezz@*") 57 | sleep(0.5) 58 | @cbot1.send("JOIN #test") 59 | sleep(0.5) 60 | end 61 | @swarm.execute 62 | expect(@cbot1.received_pattern(/474.*Cannot join/)).not_to eq(true) 63 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).to eq(true) 64 | end 65 | 66 | it 'should ban if matching hostname' do 67 | @swarm.perform do 68 | @obot.send("JOIN #test") 69 | @obot.send("MODE #test +b *!*@localhost") 70 | sleep(0.5) 71 | @cbot1.send("JOIN #test") 72 | sleep(0.5) 73 | end 74 | @swarm.execute 75 | expect(@cbot1.received_pattern(/474.*Cannot join/)).to eq(true) 76 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).not_to eq(true) 77 | end 78 | 79 | it 'should not ban if not matching hostname' do 80 | @swarm.perform do 81 | @obot.send("JOIN #test") 82 | @obot.send("MODE #test +b *!*@localhozz") 83 | sleep(0.5) 84 | @cbot1.send("JOIN #test") 85 | sleep(0.5) 86 | end 87 | @swarm.execute 88 | expect(@cbot1.received_pattern(/474.*Cannot join/)).not_to eq(true) 89 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).to eq(true) 90 | end 91 | 92 | it 'should ban if matching exact IP address' do 93 | @swarm.perform do 94 | @obot.send("JOIN #test") 95 | @obot.send("MODE #test +b *!*@127.0.0.1") 96 | sleep(0.5) 97 | @cbot1.send("JOIN #test") 98 | sleep(0.5) 99 | end 100 | @swarm.execute 101 | expect(@cbot1.received_pattern(/474.*Cannot join/)).to eq(true) 102 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).not_to eq(true) 103 | end 104 | 105 | it 'should not ban if not matching exact IP address' do 106 | @swarm.perform do 107 | @obot.send("JOIN #test") 108 | @obot.send("MODE #test +b *!*@127.0.0.5") 109 | sleep(0.5) 110 | @cbot1.send("JOIN #test") 111 | sleep(0.5) 112 | end 113 | @swarm.execute 114 | expect(@cbot1.received_pattern(/474.*Cannot join/)).not_to eq(true) 115 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).to eq(true) 116 | end 117 | 118 | it 'should ban if matching IP address (CIDR)' do 119 | @swarm.perform do 120 | @obot.send("JOIN #test") 121 | @obot.send("MODE #test +b *!*@127.0.0.0/8") 122 | sleep(0.5) 123 | @cbot1.send("JOIN #test") 124 | sleep(0.5) 125 | end 126 | @swarm.execute 127 | expect(@cbot1.received_pattern(/474.*Cannot join/)).to eq(true) 128 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).not_to eq(true) 129 | end 130 | 131 | it 'should not ban if not matching IP address (CIDR)' do 132 | @swarm.perform do 133 | @obot.send("JOIN #test") 134 | @obot.send("MODE #test +b *!*@128.0.0.0/8") 135 | sleep(0.5) 136 | @cbot1.send("JOIN #test") 137 | sleep(0.5) 138 | end 139 | @swarm.execute 140 | expect(@cbot1.received_pattern(/474.*Cannot join/)).not_to eq(true) 141 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).to eq(true) 142 | end 143 | 144 | it 'should still ban if matching hostname even if cloaked' do 145 | @swarm.perform do 146 | @cbot1.send("MODE cbot1 +x") 147 | @obot.send("JOIN #test") 148 | @obot.send("MODE #test +b *!*@localhost") 149 | sleep(0.5) 150 | @cbot1.send("JOIN #test") 151 | sleep(0.5) 152 | end 153 | @swarm.execute 154 | expect(@cbot1.received_pattern(/474.*Cannot join/)).to eq(true) 155 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).not_to eq(true) 156 | end 157 | 158 | it 'should ban on cloaked host when cloaked' do 159 | @swarm.perform do 160 | @cbot1.send("MODE cbot1 +x") 161 | # TODO: fetch cloaked host instead of hardcoding here 162 | @obot.send("JOIN #test") 163 | @obot.send("MODE #test +b *!*@Clk-6C400E48") 164 | sleep(0.5) 165 | @cbot1.send("JOIN #test") 166 | sleep(0.5) 167 | end 168 | @swarm.execute 169 | expect(@cbot1.received_pattern(/474.*Cannot join/)).to eq(true) 170 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).not_to eq(true) 171 | end 172 | 173 | it 'should ban on cloaked host when not cloaked too' do 174 | @swarm.perform do 175 | @cbot1.send("MODE cbot1 -x") 176 | # TODO: fetch cloaked host instead of hardcoding here 177 | @obot.send("JOIN #test") 178 | @obot.send("MODE #test +b *!*@Clk-6C400E48") 179 | sleep(0.5) 180 | @cbot1.send("JOIN #test") 181 | sleep(0.5) 182 | end 183 | @swarm.execute 184 | expect(@cbot1.received_pattern(/474.*Cannot join/)).to eq(true) 185 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).not_to eq(true) 186 | end 187 | 188 | it 'should ban if matching vhost' do 189 | @swarm.perform do 190 | @cbot1.send("VHOST test test") 191 | @obot.send("JOIN #test") 192 | @obot.send("MODE #test +b *!*@this.is.a.test") 193 | sleep(0.5) 194 | @cbot1.send("JOIN #test") 195 | sleep(0.5) 196 | end 197 | @swarm.execute 198 | expect(@cbot1.received_pattern(/396.*this.is.a.test/)).to eq(true) 199 | expect(@cbot1.received_pattern(/474.*Cannot join/)).to eq(true) 200 | expect(@obot.received_pattern(/:cbot1.*JOIN/)).not_to eq(true) 201 | end 202 | 203 | end 204 | -------------------------------------------------------------------------------- /spec/extbans/msgbypass_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'Extended Ban Exception ~m (msgbypass)' do 4 | before(:each) do 5 | @swarm = Ircfly::Swarm.new 6 | server = IRC_CONFIG.servers['primary'] 7 | @obot = @swarm.fly(server: server.host, port: server.port, nick: 'obot') 8 | @cbot1 = @swarm.fly(server: server.host, port: server.port, nick: 'cbot1', user: 'bantest') 9 | end 10 | 11 | it 'should allow external messages with matching +e ~m:external' do 12 | @swarm.perform do 13 | @obot.send("JOIN #test") 14 | @obot.send("MODE #test +ne ~m:external:cbot1!*@*") 15 | sleep(0.5) 16 | @cbot1.send("PRIVMSG #test :test123") 17 | sleep(0.5) 18 | end 19 | @swarm.execute 20 | expect(@cbot1.received_pattern(/.* 404 .*No external.*/)).not_to eq(true) 21 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*test123/)).to eq(true) 22 | end 23 | 24 | it 'should disallow external messages without matching +e ~m:external' do 25 | @swarm.perform do 26 | @obot.send("JOIN #test") 27 | @obot.send("MODE #test +ne ~m:external:NOMATCH!*@*") 28 | sleep(0.5) 29 | @cbot1.send("PRIVMSG #test :test123") 30 | sleep(0.5) 31 | end 32 | @swarm.execute 33 | expect(@cbot1.received_pattern(/.* 404 .*No external.*/)).to eq(true) 34 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*test123/)).not_to eq(true) 35 | end 36 | 37 | it 'should allow messages with matching +e ~m:moderated (+m)' do 38 | @swarm.perform do 39 | @obot.send("JOIN #test") 40 | @obot.send("MODE #test +me ~m:moderated:cbot1!*@*") 41 | sleep(0.5) 42 | @cbot1.send("JOIN #test") 43 | @cbot1.send("PRIVMSG #test :test123") 44 | sleep(0.5) 45 | end 46 | @swarm.execute 47 | expect(@cbot1.received_pattern(/.* 404 .*You need voice.*/)).not_to eq(true) 48 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*test123/)).to eq(true) 49 | end 50 | 51 | it 'should disallow messages without matching +e ~m:moderated (+m)' do 52 | @swarm.perform do 53 | @obot.send("JOIN #test") 54 | @obot.send("MODE #test +me ~m:moderated:NOMATCH!*@*") 55 | sleep(0.5) 56 | @cbot1.send("JOIN #test") 57 | @cbot1.send("PRIVMSG #test :test123") 58 | sleep(0.5) 59 | end 60 | @swarm.execute 61 | expect(@cbot1.received_pattern(/.* 404 .*You need voice.*/)).to eq(true) 62 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*test123/)).not_to eq(true) 63 | end 64 | 65 | it 'should allow messages with matching +e ~m:moderated (+M)' do 66 | @swarm.perform do 67 | @obot.send("JOIN #test") 68 | @obot.send("MODE #test +Me ~m:moderated:cbot1!*@*") 69 | sleep(0.5) 70 | @cbot1.send("JOIN #test") 71 | @cbot1.send("PRIVMSG #test :test123") 72 | sleep(0.5) 73 | end 74 | @swarm.execute 75 | expect(@cbot1.received_pattern(/.* 404 .*You must have a registered nick.*/)).not_to eq(true) 76 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*test123/)).to eq(true) 77 | end 78 | 79 | it 'should disallow messages without matching +e ~m:moderated (+M)' do 80 | @swarm.perform do 81 | @obot.send("JOIN #test") 82 | @obot.send("MODE #test +Me ~m:moderated:NOMATCH!*@*") 83 | sleep(0.5) 84 | @cbot1.send("JOIN #test") 85 | @cbot1.send("PRIVMSG #test :test123") 86 | sleep(0.5) 87 | end 88 | @swarm.execute 89 | expect(@cbot1.received_pattern(/.* 404 .*You must have a registered nick.*/)).to eq(true) 90 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*test123/)).not_to eq(true) 91 | end 92 | 93 | it 'should allow color messages with matching +e ~m:color' do 94 | @swarm.perform do 95 | @obot.send("JOIN #test") 96 | @obot.send("MODE #test +ce ~m:color:cbot1!*@*") 97 | sleep(0.5) 98 | @cbot1.send("JOIN #test") 99 | @cbot1.send("PRIVMSG #test :\0034test123") 100 | sleep(0.5) 101 | end 102 | @swarm.execute 103 | expect(@cbot1.received_pattern(/.* 404 .*You need voice.*/)).not_to eq(true) 104 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*\0034test123/)).to eq(true) 105 | end 106 | 107 | it 'should disallow color messages without matching +e ~m:color' do 108 | @swarm.perform do 109 | @obot.send("JOIN #test") 110 | @obot.send("MODE #test +ce ~m:color:NOMATCH!*@*") 111 | sleep(0.5) 112 | @cbot1.send("JOIN #test") 113 | @cbot1.send("PRIVMSG #test :\0034test123") 114 | sleep(0.5) 115 | end 116 | @swarm.execute 117 | expect(@cbot1.received_pattern(/.* 404 .*Color is not permitted.*/)).to eq(true) 118 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*\0034test123/)).not_to eq(true) 119 | end 120 | 121 | it 'should not filter color messages with matching +e ~m:color' do 122 | @swarm.perform do 123 | @obot.send("JOIN #test") 124 | @obot.send("MODE #test +Se ~m:color:cbot1!*@*") 125 | sleep(0.5) 126 | @cbot1.send("JOIN #test") 127 | @cbot1.send("PRIVMSG #test :\0034test123") 128 | sleep(0.5) 129 | end 130 | @swarm.execute 131 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*\0034test123/)).to eq(true) 132 | end 133 | 134 | it 'should filter color messages without matching +e ~m:color' do 135 | @swarm.perform do 136 | @obot.send("JOIN #test") 137 | @obot.send("MODE #test +Se ~m:color:NOMATCH!*@*") 138 | sleep(0.5) 139 | @cbot1.send("JOIN #test") 140 | @cbot1.send("PRIVMSG #test :\0034test123") 141 | sleep(0.5) 142 | end 143 | @swarm.execute 144 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*\0034test123/)).not_to eq(true) 145 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*:test123/)).to eq(true) 146 | end 147 | 148 | it 'should not censor messages with matching +e ~m:censor' do 149 | @swarm.perform do 150 | @obot.send("JOIN #test") 151 | @obot.send("MODE #test +Ge ~m:censor:cbot1!*@*") 152 | sleep(0.5) 153 | @cbot1.send("JOIN #test") 154 | @cbot1.send("PRIVMSG #test :fuck") 155 | sleep(0.5) 156 | end 157 | @swarm.execute 158 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*fuck/)).to eq(true) 159 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*/)).not_to eq(true) 160 | end 161 | 162 | it 'should censor messages without matching +e ~m:censor' do 163 | @swarm.perform do 164 | @obot.send("JOIN #test") 165 | @obot.send("MODE #test +Ge ~m:censor:NOMATCH!*@*") 166 | sleep(0.5) 167 | @cbot1.send("JOIN #test") 168 | @cbot1.send("PRIVMSG #test :fuck") 169 | sleep(0.5) 170 | end 171 | @swarm.execute 172 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*fuck/)).not_to eq(true) 173 | expect(@obot.received_pattern(/:cbot1.*PRIVMSG.*/)).to eq(true) 174 | end 175 | 176 | it 'should not block notices with matching +e ~m:notice' do 177 | @swarm.perform do 178 | @obot.send("JOIN #test") 179 | @obot.send("MODE #test +Te ~m:notice:cbot1!*@*") 180 | sleep(0.5) 181 | @cbot1.send("JOIN #test") 182 | @cbot1.send("NOTICE #test :test123") 183 | sleep(0.5) 184 | end 185 | @swarm.execute 186 | expect(@obot.received_pattern(/:cbot1.*NOTICE.*test123/)).to eq(true) 187 | expect(@cbot1.received_pattern(/.* 404 .*NOTICEs are not permitted.*/)).not_to eq(true) 188 | end 189 | 190 | it 'should block notices without matching +e ~m:notice' do 191 | @swarm.perform do 192 | @obot.send("JOIN #test") 193 | @obot.send("MODE #test +Te ~m:notice:NOMATCH!*@*") 194 | sleep(0.5) 195 | @cbot1.send("JOIN #test") 196 | @cbot1.send("NOTICE #test :test123") 197 | sleep(0.5) 198 | end 199 | @swarm.execute 200 | expect(@obot.received_pattern(/:cbot1.*NOTICE.*test123/)).not_to eq(true) 201 | expect(@cbot1.received_pattern(/.* 404 .*NOTICEs are not permitted.*/)).to eq(true) 202 | end 203 | 204 | end 205 | -------------------------------------------------------------------------------- /spec/other/sync_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | # These test the merging of things when servers link 4 | # Currently this tests channels. 5 | # TODO: test users (all user properties, including swhois and such) 6 | 7 | describe 'server synching' do 8 | before(:each) do 9 | @swarm = Ircfly::Swarm.new 10 | servera = IRC_CONFIG.servers['primary'] 11 | serverb = IRC_CONFIG.servers['secondary'] 12 | hub = IRC_CONFIG.servers['hub'] 13 | @bot1 = @swarm.fly(server: servera.host, port: servera.port, nick: 'bot1') 14 | @bot2 = @swarm.fly(server: serverb.host, port: serverb.port, nick: 'bot2') 15 | @bothub = @swarm.fly(server: hub.host, port: hub.port, nick: 'bothub') 16 | end 17 | 18 | it 'should synch channels correctly (merge)' do 19 | @swarm.perform do 20 | @bot1.send("OPER netadmin test") 21 | @bot2.send("OPER netadmin test") 22 | @bothub.send("OPER netadmin test") 23 | @bot1.send("JOIN #test") 24 | @bot2.send("JOIN #test") 25 | @bothub.send("JOIN #test") 26 | sleep(1) 27 | @bot2.send("PRIVMSG bot1 :before squit") # must always be delivered 28 | @bot2.send("SQUIT hub.test.net") 29 | # Now we do our thing 30 | @bot1.send("MODE #test +bbb lala!lala@ban.number-1.irc1 lala!lala@ban.number-2.irc1 lala!lala@ban.number-3.irc1") 31 | @bot1.send("MODE #test +eee lala!lala@exempt.number-1.irc1 lala!lala@exempt.number-2.irc1 lala!lala@exempt.number-3.irc1") 32 | @bot1.send("MODE #test +III lala!lala@invex.number-1.irc1 lala!lala@invex.number-2.irc1 lala!lala@invex.number-3.irc1") 33 | @bot2.send("MODE #test +bbb lala!lala@ban.number-1.irc2 lala!lala@ban.number-2.irc2 lala!lala@ban.number-3.irc2") 34 | @bot2.send("MODE #test +eee lala!lala@exempt.number-1.irc2 lala!lala@exempt.number-2.irc2 lala!lala@exempt.number-3.irc2") 35 | @bot2.send("MODE #test +III lala!lala@invex.number-1.irc2 lala!lala@invex.number-2.irc2 lala!lala@invex.number-3.irc2") 36 | sleep(1) 37 | # And we synch again 38 | @bot2.send("PRIVMSG bot1 :after squit") # must never get delivered 39 | @bot2.send("CONNECT hub.test.net") 40 | sleep(2) 41 | @bot2.send("PRIVMSG bot1 :after reconnect") 42 | @bot1.send("MODE #test b") 43 | @bot2.send("MODE #test b") 44 | @bothub.send("MODE #test b") 45 | @bot1.send("MODE #test e") 46 | @bot2.send("MODE #test e") 47 | @bothub.send("MODE #test e") 48 | @bot1.send("MODE #test I") 49 | @bot2.send("MODE #test I") 50 | @bothub.send("MODE #test I") 51 | sleep(2) 52 | end 53 | @swarm.execute 54 | # Errors are not expected 55 | expect(@bot2.received_pattern(/ 481 /)).not_to eq(true) 56 | # We should receive the 'before squit', this is to ensure the test goes correctly. 57 | expect(@bot1.received_pattern(/.*PRIVMSG.*before squit/)).to eq(true) 58 | # We should NOT receive the 'after squit', since servers should not be linked 59 | expect(@bot1.received_pattern(/.*PRIVMSG.*after squit/)).not_to eq(true) 60 | # ..we should get an error instead about no such nick: 61 | expect(@bot2.received_pattern(/:.*401 bot2 bot1/)).to eq(true) 62 | # We should receive the 'after reconnect', since now we are linked again 63 | expect(@bot1.received_pattern(/.*PRIVMSG.*after reconnect/)).to eq(true) 64 | ### Now the real tests: 65 | # On irc1 we should see the +beI from irc2 being set on synch 66 | expect(@bot1.received_pattern(/.* MODE .*ban.number-1.irc2.*/)).to eq(true) 67 | expect(@bot1.received_pattern(/.* MODE .*ban.number-2.irc2.*/)).to eq(true) 68 | expect(@bot1.received_pattern(/.* MODE .*ban.number-3.irc2.*/)).to eq(true) 69 | expect(@bot1.received_pattern(/.* MODE .*exempt.number-1.irc2.*/)).to eq(true) 70 | expect(@bot1.received_pattern(/.* MODE .*exempt.number-2.irc2.*/)).to eq(true) 71 | expect(@bot1.received_pattern(/.* MODE .*exempt.number-3.irc2.*/)).to eq(true) 72 | expect(@bot1.received_pattern(/.* MODE .*invex.number-1.irc2.*/)).to eq(true) 73 | expect(@bot1.received_pattern(/.* MODE .*invex.number-2.irc2.*/)).to eq(true) 74 | expect(@bot1.received_pattern(/.* MODE .*invex.number-3.irc2.*/)).to eq(true) 75 | # On irc2 we should see the +beI from irc1 being set on synch 76 | expect(@bot2.received_pattern(/.* MODE .*ban.number-1.irc1.*/)).to eq(true) 77 | expect(@bot2.received_pattern(/.* MODE .*ban.number-2.irc1.*/)).to eq(true) 78 | expect(@bot2.received_pattern(/.* MODE .*ban.number-3.irc1.*/)).to eq(true) 79 | expect(@bot2.received_pattern(/.* MODE .*exempt.number-1.irc1.*/)).to eq(true) 80 | expect(@bot2.received_pattern(/.* MODE .*exempt.number-2.irc1.*/)).to eq(true) 81 | expect(@bot2.received_pattern(/.* MODE .*exempt.number-3.irc1.*/)).to eq(true) 82 | expect(@bot2.received_pattern(/.* MODE .*invex.number-1.irc1.*/)).to eq(true) 83 | expect(@bot2.received_pattern(/.* MODE .*invex.number-2.irc1.*/)).to eq(true) 84 | expect(@bot2.received_pattern(/.* MODE .*invex.number-3.irc1.*/)).to eq(true) 85 | # On hub we should see the +beI from irc1 being set on synch 86 | expect(@bothub.received_pattern(/.* MODE .*ban.number-1.irc1.*/)).to eq(true) 87 | expect(@bothub.received_pattern(/.* MODE .*ban.number-2.irc1.*/)).to eq(true) 88 | expect(@bothub.received_pattern(/.* MODE .*ban.number-3.irc1.*/)).to eq(true) 89 | expect(@bothub.received_pattern(/.* MODE .*exempt.number-1.irc1.*/)).to eq(true) 90 | expect(@bothub.received_pattern(/.* MODE .*exempt.number-2.irc1.*/)).to eq(true) 91 | expect(@bothub.received_pattern(/.* MODE .*exempt.number-3.irc1.*/)).to eq(true) 92 | expect(@bothub.received_pattern(/.* MODE .*invex.number-1.irc1.*/)).to eq(true) 93 | expect(@bothub.received_pattern(/.* MODE .*invex.number-2.irc1.*/)).to eq(true) 94 | expect(@bothub.received_pattern(/.* MODE .*invex.number-3.irc1.*/)).to eq(true) 95 | # On all 3 servers we should see the +beI and thanks to SJSBY we should 96 | # also see the correct setter (the original one) 97 | # - pitty we can't use a for loop here :( 98 | # - on bot1/irc1 99 | expect(@bot1.received_pattern(/367.* \#test.*ban.number-1.irc2 bot2/)).to eq(true) 100 | expect(@bot1.received_pattern(/367.* \#test.*ban.number-2.irc2 bot2/)).to eq(true) 101 | expect(@bot1.received_pattern(/367.* \#test.*ban.number-3.irc2 bot2/)).to eq(true) 102 | expect(@bot1.received_pattern(/348.* \#test.*exempt.number-1.irc2 bot2/)).to eq(true) 103 | expect(@bot1.received_pattern(/348.* \#test.*exempt.number-2.irc2 bot2/)).to eq(true) 104 | expect(@bot1.received_pattern(/348.* \#test.*exempt.number-3.irc2 bot2/)).to eq(true) 105 | expect(@bot1.received_pattern(/346.* \#test.*invex.number-1.irc2 bot2/)).to eq(true) 106 | expect(@bot1.received_pattern(/346.* \#test.*invex.number-2.irc2 bot2/)).to eq(true) 107 | expect(@bot1.received_pattern(/346.* \#test.*invex.number-3.irc2 bot2/)).to eq(true) 108 | expect(@bot1.received_pattern(/367.* \#test.*ban.number-1.irc1 bot1/)).to eq(true) 109 | expect(@bot1.received_pattern(/367.* \#test.*ban.number-2.irc1 bot1/)).to eq(true) 110 | expect(@bot1.received_pattern(/367.* \#test.*ban.number-3.irc1 bot1/)).to eq(true) 111 | expect(@bot1.received_pattern(/348.* \#test.*exempt.number-1.irc1 bot1/)).to eq(true) 112 | expect(@bot1.received_pattern(/348.* \#test.*exempt.number-2.irc1 bot1/)).to eq(true) 113 | expect(@bot1.received_pattern(/348.* \#test.*exempt.number-3.irc1 bot1/)).to eq(true) 114 | expect(@bot1.received_pattern(/346.* \#test.*invex.number-1.irc1 bot1/)).to eq(true) 115 | expect(@bot1.received_pattern(/346.* \#test.*invex.number-2.irc1 bot1/)).to eq(true) 116 | expect(@bot1.received_pattern(/346.* \#test.*invex.number-3.irc1 bot1/)).to eq(true) 117 | # - on bot2/irc2 118 | expect(@bot2.received_pattern(/367.* \#test.*ban.number-1.irc2 bot2/)).to eq(true) 119 | expect(@bot2.received_pattern(/367.* \#test.*ban.number-2.irc2 bot2/)).to eq(true) 120 | expect(@bot2.received_pattern(/367.* \#test.*ban.number-3.irc2 bot2/)).to eq(true) 121 | expect(@bot2.received_pattern(/348.* \#test.*exempt.number-1.irc2 bot2/)).to eq(true) 122 | expect(@bot2.received_pattern(/348.* \#test.*exempt.number-2.irc2 bot2/)).to eq(true) 123 | expect(@bot2.received_pattern(/348.* \#test.*exempt.number-3.irc2 bot2/)).to eq(true) 124 | expect(@bot2.received_pattern(/346.* \#test.*invex.number-1.irc2 bot2/)).to eq(true) 125 | expect(@bot2.received_pattern(/346.* \#test.*invex.number-2.irc2 bot2/)).to eq(true) 126 | expect(@bot2.received_pattern(/346.* \#test.*invex.number-3.irc2 bot2/)).to eq(true) 127 | expect(@bot2.received_pattern(/367.* \#test.*ban.number-1.irc1 bot1/)).to eq(true) 128 | expect(@bot2.received_pattern(/367.* \#test.*ban.number-2.irc1 bot1/)).to eq(true) 129 | expect(@bot2.received_pattern(/367.* \#test.*ban.number-3.irc1 bot1/)).to eq(true) 130 | expect(@bot2.received_pattern(/348.* \#test.*exempt.number-1.irc1 bot1/)).to eq(true) 131 | expect(@bot2.received_pattern(/348.* \#test.*exempt.number-2.irc1 bot1/)).to eq(true) 132 | expect(@bot2.received_pattern(/348.* \#test.*exempt.number-3.irc1 bot1/)).to eq(true) 133 | expect(@bot2.received_pattern(/346.* \#test.*invex.number-1.irc1 bot1/)).to eq(true) 134 | expect(@bot2.received_pattern(/346.* \#test.*invex.number-2.irc1 bot1/)).to eq(true) 135 | expect(@bot2.received_pattern(/346.* \#test.*invex.number-3.irc1 bot1/)).to eq(true) 136 | # - on bothub/hub 137 | expect(@bothub.received_pattern(/367.* \#test.*ban.number-1.irc2 bot2/)).to eq(true) 138 | expect(@bothub.received_pattern(/367.* \#test.*ban.number-2.irc2 bot2/)).to eq(true) 139 | expect(@bothub.received_pattern(/367.* \#test.*ban.number-3.irc2 bot2/)).to eq(true) 140 | expect(@bothub.received_pattern(/348.* \#test.*exempt.number-1.irc2 bot2/)).to eq(true) 141 | expect(@bothub.received_pattern(/348.* \#test.*exempt.number-2.irc2 bot2/)).to eq(true) 142 | expect(@bothub.received_pattern(/348.* \#test.*exempt.number-3.irc2 bot2/)).to eq(true) 143 | expect(@bothub.received_pattern(/346.* \#test.*invex.number-1.irc2 bot2/)).to eq(true) 144 | expect(@bothub.received_pattern(/346.* \#test.*invex.number-2.irc2 bot2/)).to eq(true) 145 | expect(@bothub.received_pattern(/346.* \#test.*invex.number-3.irc2 bot2/)).to eq(true) 146 | expect(@bothub.received_pattern(/367.* \#test.*ban.number-1.irc1 bot1/)).to eq(true) 147 | expect(@bothub.received_pattern(/367.* \#test.*ban.number-2.irc1 bot1/)).to eq(true) 148 | expect(@bothub.received_pattern(/367.* \#test.*ban.number-3.irc1 bot1/)).to eq(true) 149 | expect(@bothub.received_pattern(/348.* \#test.*exempt.number-1.irc1 bot1/)).to eq(true) 150 | expect(@bothub.received_pattern(/348.* \#test.*exempt.number-2.irc1 bot1/)).to eq(true) 151 | expect(@bothub.received_pattern(/348.* \#test.*exempt.number-3.irc1 bot1/)).to eq(true) 152 | expect(@bothub.received_pattern(/346.* \#test.*invex.number-1.irc1 bot1/)).to eq(true) 153 | expect(@bothub.received_pattern(/346.* \#test.*invex.number-2.irc1 bot1/)).to eq(true) 154 | expect(@bothub.received_pattern(/346.* \#test.*invex.number-3.irc1 bot1/)).to eq(true) 155 | end 156 | 157 | it 'should synch channels correctly (different creationtime)' do 158 | @swarm.perform do 159 | @bot1.send("OPER netadmin test") 160 | @bot2.send("OPER netadmin test") 161 | @bothub.send("OPER netadmin test") 162 | @bot1.send("JOIN #test") 163 | @bot2.send("JOIN #test") 164 | @bothub.send("JOIN #test") 165 | sleep(1) 166 | @bot2.send("PRIVMSG bot1 :before squit") # must always be delivered 167 | @bot2.send("SQUIT hub.test.net") 168 | # Now we do our thing.. we must ensure we have a different TS though.. 169 | sleep(2) 170 | @bot2.send("PART #test") 171 | @bot2.send("JOIN #test") 172 | # The channel on bot2/irc2 is now newer (higher creationtime) and should loose when we reconnect 173 | @bot1.send("MODE #test +bbb lala!lala@ban.number-1.irc1 lala!lala@ban.number-2.irc1 lala!lala@ban.number-3.irc1") 174 | @bot1.send("MODE #test +eee lala!lala@exempt.number-1.irc1 lala!lala@exempt.number-2.irc1 lala!lala@exempt.number-3.irc1") 175 | @bot1.send("MODE #test +III lala!lala@invex.number-1.irc1 lala!lala@invex.number-2.irc1 lala!lala@invex.number-3.irc1") 176 | @bot2.send("MODE #test +bbb lala!lala@ban.number-1.irc2 lala!lala@ban.number-2.irc2 lala!lala@ban.number-3.irc2") 177 | @bot2.send("MODE #test +eee lala!lala@exempt.number-1.irc2 lala!lala@exempt.number-2.irc2 lala!lala@exempt.number-3.irc2") 178 | @bot2.send("MODE #test +III lala!lala@invex.number-1.irc2 lala!lala@invex.number-2.irc2 lala!lala@invex.number-3.irc2") 179 | sleep(1) 180 | # And we synch again 181 | @bot2.send("PRIVMSG bot1 :after squit") # must never be delivered 182 | @bot2.send("CONNECT hub.test.net") 183 | sleep(2) 184 | @bot2.send("PRIVMSG bot1 :after reconnect") 185 | @bot1.send("MODE #test b") 186 | @bot2.send("MODE #test b") 187 | @bothub.send("MODE #test b") 188 | @bot1.send("MODE #test e") 189 | @bot2.send("MODE #test e") 190 | @bothub.send("MODE #test e") 191 | @bot1.send("MODE #test I") 192 | @bot2.send("MODE #test I") 193 | @bothub.send("MODE #test I") 194 | sleep(2) 195 | end 196 | @swarm.execute 197 | # Errors are not expected 198 | expect(@bot2.received_pattern(/ 481 /)).not_to eq(true) 199 | # We should receive the 'before squit', this is to ensure the test goes correctly. 200 | expect(@bot1.received_pattern(/.*PRIVMSG.*before squit/)).to eq(true) 201 | # We should NOT receive the 'after squit', since servers should not be linked 202 | expect(@bot1.received_pattern(/.*PRIVMSG.*after squit/)).not_to eq(true) 203 | # ..we should get an error instead about no such nick: 204 | expect(@bot2.received_pattern(/:.*401 bot2 bot1/)).to eq(true) 205 | # We should receive the 'after reconnect', since now we are linked again 206 | expect(@bot1.received_pattern(/.*PRIVMSG.*after reconnect/)).to eq(true) 207 | ### Now the real tests: 208 | # On irc1 we should NOT see the +beI from irc2 being set on synch (since they are the loser) 209 | expect(@bot1.received_pattern(/.* MODE .*ban.number-1.irc2.*/)).not_to eq(true) 210 | expect(@bot1.received_pattern(/.* MODE .*ban.number-2.irc2.*/)).not_to eq(true) 211 | expect(@bot1.received_pattern(/.* MODE .*ban.number-3.irc2.*/)).not_to eq(true) 212 | expect(@bot1.received_pattern(/.* MODE .*exempt.number-1.irc2.*/)).not_to eq(true) 213 | expect(@bot1.received_pattern(/.* MODE .*exempt.number-2.irc2.*/)).not_to eq(true) 214 | expect(@bot1.received_pattern(/.* MODE .*exempt.number-3.irc2.*/)).not_to eq(true) 215 | expect(@bot1.received_pattern(/.* MODE .*invex.number-1.irc2.*/)).not_to eq(true) 216 | expect(@bot1.received_pattern(/.* MODE .*invex.number-2.irc2.*/)).not_to eq(true) 217 | expect(@bot1.received_pattern(/.* MODE .*invex.number-3.irc2.*/)).not_to eq(true) 218 | # On hub we should NOT see the +beI from irc2 being set on synch (since they are the loser) 219 | expect(@bothub.received_pattern(/.* MODE .*ban.number-1.irc2.*/)).not_to eq(true) 220 | expect(@bothub.received_pattern(/.* MODE .*ban.number-2.irc2.*/)).not_to eq(true) 221 | expect(@bothub.received_pattern(/.* MODE .*ban.number-3.irc2.*/)).not_to eq(true) 222 | expect(@bothub.received_pattern(/.* MODE .*exempt.number-1.irc2.*/)).not_to eq(true) 223 | expect(@bothub.received_pattern(/.* MODE .*exempt.number-2.irc2.*/)).not_to eq(true) 224 | expect(@bothub.received_pattern(/.* MODE .*exempt.number-3.irc2.*/)).not_to eq(true) 225 | expect(@bothub.received_pattern(/.* MODE .*invex.number-1.irc2.*/)).not_to eq(true) 226 | expect(@bothub.received_pattern(/.* MODE .*invex.number-2.irc2.*/)).not_to eq(true) 227 | expect(@bothub.received_pattern(/.* MODE .*invex.number-3.irc2.*/)).not_to eq(true) 228 | # On irc2 we should see the +beI from irc1 being set on synch 229 | expect(@bot2.received_pattern(/.* MODE .*ban.number-1.irc1.*/)).to eq(true) 230 | expect(@bot2.received_pattern(/.* MODE .*ban.number-2.irc1.*/)).to eq(true) 231 | expect(@bot2.received_pattern(/.* MODE .*ban.number-3.irc1.*/)).to eq(true) 232 | expect(@bot2.received_pattern(/.* MODE .*exempt.number-1.irc1.*/)).to eq(true) 233 | expect(@bot2.received_pattern(/.* MODE .*exempt.number-2.irc1.*/)).to eq(true) 234 | expect(@bot2.received_pattern(/.* MODE .*exempt.number-3.irc1.*/)).to eq(true) 235 | expect(@bot2.received_pattern(/.* MODE .*invex.number-1.irc1.*/)).to eq(true) 236 | expect(@bot2.received_pattern(/.* MODE .*invex.number-2.irc1.*/)).to eq(true) 237 | expect(@bot2.received_pattern(/.* MODE .*invex.number-3.irc1.*/)).to eq(true) 238 | # And on irc2 we should see our modes removed by the other server (since we are the loser) 239 | expect(@bot2.received_pattern(/^:hub.*MODE.*ban.number-1.irc1.*/)).to eq(true) 240 | expect(@bot2.received_pattern(/^:hub.*MODE.*ban.number-2.irc1.*/)).to eq(true) 241 | expect(@bot2.received_pattern(/^:hub.*MODE.*ban.number-3.irc1.*/)).to eq(true) 242 | expect(@bot2.received_pattern(/^:hub.*MODE.*exempt.number-1.irc1.*/)).to eq(true) 243 | expect(@bot2.received_pattern(/^:hub.*MODE.*exempt.number-2.irc1.*/)).to eq(true) 244 | expect(@bot2.received_pattern(/^:hub.*MODE.*exempt.number-3.irc1.*/)).to eq(true) 245 | expect(@bot2.received_pattern(/^:hub.*MODE.*invex.number-1.irc1.*/)).to eq(true) 246 | expect(@bot2.received_pattern(/^:hub.*MODE.*invex.number-2.irc1.*/)).to eq(true) 247 | expect(@bot2.received_pattern(/^:hub.*MODE.*invex.number-3.irc1.*/)).to eq(true) 248 | # On all 3 servers we should see the +beI and thanks to SJSBY we should 249 | # also see the correct setter (the original one) 250 | # - note that we should only see the bans set by bot1/irc1. The ones 251 | # from bot2/irc2 should not appear in the list as they should be removed 252 | # - pitty we can't use a for loop here :( 253 | # - on bot1/irc1 254 | expect(@bot1.received_pattern(/367.* \#test.*ban.number-1.irc1 bot1/)).to eq(true) 255 | expect(@bot1.received_pattern(/367.* \#test.*ban.number-2.irc1 bot1/)).to eq(true) 256 | expect(@bot1.received_pattern(/367.* \#test.*ban.number-3.irc1 bot1/)).to eq(true) 257 | expect(@bot1.received_pattern(/348.* \#test.*exempt.number-1.irc1 bot1/)).to eq(true) 258 | expect(@bot1.received_pattern(/348.* \#test.*exempt.number-2.irc1 bot1/)).to eq(true) 259 | expect(@bot1.received_pattern(/348.* \#test.*exempt.number-3.irc1 bot1/)).to eq(true) 260 | expect(@bot1.received_pattern(/346.* \#test.*invex.number-1.irc1 bot1/)).to eq(true) 261 | expect(@bot1.received_pattern(/346.* \#test.*invex.number-2.irc1 bot1/)).to eq(true) 262 | expect(@bot1.received_pattern(/346.* \#test.*invex.number-3.irc1 bot1/)).to eq(true) 263 | expect(@bot1.received_pattern(/367.* \#test.*ban.number-1.irc2 bot2/)).not_to eq(true) 264 | expect(@bot1.received_pattern(/367.* \#test.*ban.number-2.irc2 bot2/)).not_to eq(true) 265 | expect(@bot1.received_pattern(/367.* \#test.*ban.number-3.irc2 bot2/)).not_to eq(true) 266 | expect(@bot1.received_pattern(/348.* \#test.*exempt.number-1.irc2 bot2/)).not_to eq(true) 267 | expect(@bot1.received_pattern(/348.* \#test.*exempt.number-2.irc2 bot2/)).not_to eq(true) 268 | expect(@bot1.received_pattern(/348.* \#test.*exempt.number-3.irc2 bot2/)).not_to eq(true) 269 | expect(@bot1.received_pattern(/346.* \#test.*invex.number-1.irc2 bot2/)).not_to eq(true) 270 | expect(@bot1.received_pattern(/346.* \#test.*invex.number-2.irc2 bot2/)).not_to eq(true) 271 | expect(@bot1.received_pattern(/346.* \#test.*invex.number-3.irc2 bot2/)).not_to eq(true) 272 | # TODO: other servers.. 273 | end 274 | 275 | end 276 | --------------------------------------------------------------------------------