require 'helper' require 'dummy_server' require 'securerandom' class TestNSCA < Test::Unit::TestCase context 'xor' do should 'return a if a (random) will xored double with random key. (1000 rounds)' do 1000.times do key_len = SecureRandom.random_number 1000 a_len = SecureRandom.random_number 1000 key = SecureRandom.random_bytes key_len a = SecureRandom.random_bytes a_len assert_equal a, NSCA.xor( key, NSCA.xor(key, a)) end end end end class TestNSCACommunication < Test::Unit::TestCase Port = 5787 def dummy_server *args server = Thread.new do begin NSCA.dummy_server *args rescue Object #STDERR.puts "#{$!.class}: #{$!}", $!.backtrace.map{|bt|" #{bt}"} raise ensure #STDERR.puts "Dummy Server Shutdown" end end sleep 1 # server needs time to start... server end include NSCA::Checks context "our dummy test server on localhost:#{Port} with random password" do should 'receive data' do password = 'password' || SecureRandom.random_bytes timestamp = Time.now PD1 = perfdata :pd1_in_sec, :s, 10, 20, 0, 30 PD2 = perfdata :pd2_in_1, 1, 0.99, 0.98, 0, 1 PD3 = perfdata :pd3_count, :c, 3, 5, 0 T0 = check 'TestNSCA0', 'localhost' T1 = check 'TestNSCA1', 'localhost', [PD1, PD2] T2 = check :TestNSCA2, 'localhost', [PD1, PD2, PD3] checks = [] t0 = T0.new( 1, "0123456789"*51+"AB", nil, timestamp) # oversized service name checks << t0 pd1 = PD1.new 3 pd2 = PD2.new 0.9996 pd3 = PD3.new 2 t1 = T1.new( nil, "Should be OK", [pd1, pd2, pd3], timestamp) checks << t1 NSCA::destinations.clear NSCA::destinations << NSCA::Client.new( 'localhost', Port, password) server = dummy_server port: Port, password: password NSCA::send *checks pc0, pc1 = server.value [[t0, pc0], [t1, pc1]].each do |(test, packet)| assert_equal test.hostname, packet.hostname assert_equal test.service, packet.service assert_equal timestamp.to_i, packet.timestamp.to_i assert_equal test.retcode, packet.return_code end # original with AB, but B is char 512 and will be replaced by \0 assert_equal "0123456789"*51+"A", pc0.status assert_equal "Should be OK | 'pd1_in_sec'=3s,10,20,0,30 'pd2_in_1'=0.99961,0.99,0.98,0,1 'pd3_count'=2c,3,5,0,", pc1.status end should 'fail crc32 if wrong password' do password = 'password' || SecureRandom.random_bytes timestamp = Time.now T3 = check 'TestNSCA0', 'localhost' NSCA::destinations.clear NSCA::destinations << NSCA::Client.new( 'localhost', Port, password+'a') server = dummy_server hostname: 'localhost', port: Port, password: password NSCA::send [T3.new( 1, 'status', nil, timestamp)] assert_raise( NSCA::Packet::CSC32CheckFailed) { server.join } end end end class TestNSCA::ReturnCode < Test::Unit::TestCase context 'return code' do should( 'be 0 == OK') { assert NSCA::ReturnCode.find(0) == NSCA::ReturnCode::OK } should( 'be 1 == WARNING') { assert NSCA::ReturnCode.find(1) == NSCA::ReturnCode::WARNING } should( 'be 2 == CRITICAL') { assert NSCA::ReturnCode.find(2) == NSCA::ReturnCode::CRITICAL } should( 'be 3 == UNKNOWN') { assert NSCA::ReturnCode.find(3) == NSCA::ReturnCode::UNKNOWN } end end class TestNSCA::Helper < Test::Unit::TestCase context 'class gen name' do should 'generate class names' do assert :Total_run_check_measure == NSCA::Helper.class_name_gen( 'total run check measure') end should 'do not generate class names, if no letter' do assert nil == NSCA::Helper.class_name_gen( '123 321, 43 _ ?') end end end class TestNSCA::PerformanceData < Test::Unit::TestCase should 'set a subclass for new PerfData-types' do NSCA::PerformanceData.create 'subclass test' assert_nothing_raised NameError do assert NSCA::PerformanceData::Subclass_test, "No subclass created." end end def perfdata *a NSCA::PerformanceData.new *a end context 'Created NSCA::PerformanceData-subclasses' do should 'be the same like returned' do PA = NSCA::PerformanceData.create 'returned and subclass the same test' assert_equal PA, NSCA::PerformanceData::Returned_and_subclass_the_same_test end should 'not exists, if #new used' do pb = NSCA::PerformanceData.new 'no subclass' assert_raise NameError do NSCA::PerformanceData::No_subclass end end should 'have a unit if given' do assert :s == perfdata( 'have an unit test', :s).unit, "Not s as unit" end should 'have not a unit if not given' do assert nil == perfdata( 'have not an unit test', nil).unit, "Not nil as unit" end should 'have a warn thresh if given' do assert 3 == perfdata( 'have a warn test', nil, 3).warn, "Not 3 as warn" end should 'have not a warn thresh if not given' do assert nil == perfdata( 'have not a warn test', nil, nil).warn, "Not nil as warn" end end context 'Measure' do should 'work with s' do PC = perfdata 'something in seconds', :s assert PC.measure { true }.is_a?( PC), 'can not be created?' end should 'work with ms' do PD = perfdata 'something in mili seconds', :ms assert PD.measure { true }.is_a?( PD), 'can not be created?' end should 'not work with something else' do PE = perfdata 'something else than time', :c assert_raise NSCA::PerformanceData::TimeUnitExpected do PE.measure { true } end end should 'measure something between 1s..3s if i sleep 2 seconds' do PF = perfdata 'wait 2 seconds', :s pf = PF.measure { sleep 2 } assert (1..3).include?( pf.value), "Not in range 1s..3s: #{pf.value}s" end should 'measure something between 1000ms..3000ms if i sleep 2 seconds' do PG = perfdata 'wait 2000 mili second', :ms pf = PG.measure { sleep 2 } assert (1000..3000).include?( pf.value), "Not in range 1000ms..3000ms: #{pf.value}ms" end end end class TestNSCA::Check < Test::Unit::TestCase context 'Data' do should 'also be empty' do CF = NSCA::Check.new 'empty data' cf = CF.new hostname = `hostname`.chomp assert_equal [cf.timestamp, 3, hostname, 'empty data', 'UNKNOWN'], cf.to_a end should 'have default a timestamp. ~ -10s..10s' do CG = NSCA::Check.new 'default timestamp' cg = CG.new now = Time.now range = Time.at(now-10) .. Time.at(now+10) assert range.begin <= cg.timestamp && cg.timestamp <= range.end, "Not a valid timestamp ~now: #{cg.timestamp}" end end context 'Subclasses' do should 'be created by NSCA::Check.create' do CA = NSCA::Check.create 'a uniq name' assert_same CA, NSCA::Check::A_uniq_name end end context 'No Subclasses' do should 'be created by NSCA::Check.new' do CB = NSCA::Check.new 'a uniq name, too' assert_raise NameError, 'A class named NSCA::Check::A_uniq_name_too exists' do CB == NSCA::Check::A_uniq_name_too end end end context 'Clones' do should 'have old class as superclass' do CC1 = NSCA::Check.new( 'a check which will be for cloning') CC2 = CC1.clone assert_equal CC2.superclass, CC1 end should 'have the same data' do CD1 = NSCA::Check.new 'a check for same data after cloning' CD2 = CD1.clone assert_equal CD2.to_a, CD2.to_a end should 'have the same data, except specific data' do CE1 = NSCA::Check.new 'a check for same data after cloning again, but...' CE2 = CE1.clone service: '... but the service will be changed.' assert_not_equal CE1.service, CE2.service assert_equal 'a check for same data after cloning again, but...', CE1.service assert_equal '... but the service will be changed.', CE2.service ce1_data, ce2_data = CE1.to_a, CE2.to_a ce1_data[0] = ce2_data[0] = 'dummy' assert_equal ce1_data, ce2_data end end context 'Perfdatas in Checks' do should 'be saved as symbol-key' do PH = NSCA::PerformanceData.new 'simplename', :ms CH = NSCA::Check.new 'a check with perfdata', 'hostname', [PH] assert_equal PH, CH.perfdatas[:'simplename'] ch = CH.new assert_equal nil, ch['simplename'] assert_equal nil, ch[:simplename] a = 0 ch.measure( 'simplename') { 0.upto( 10000) { a += 1 } } assert_equal ch['simplename'], ch[:simplename] end end end