2005-12-17 06:46:23 +00:00
#!/usr/bin/env ruby
2012-06-29 05:18:28 +00:00
# -*- coding: binary -*-
2005-07-10 07:15:20 +00:00
2005-07-10 07:27:50 +00:00
$: . unshift ( File . join ( File . dirname ( __FILE__ ) , '..' ) )
2005-07-10 07:15:20 +00:00
require 'test/unit'
require 'rex/text'
2006-03-08 17:25:40 +00:00
require 'rex/exceptions'
2005-07-10 07:15:20 +00:00
class Rex :: Text :: UnitTest < Test :: Unit :: TestCase
2010-10-15 19:40:33 +00:00
def test_pattern_create
set1 = %w{ AB ab 12 }
assert_equal 'Aa1Aa2' , Rex :: Text . pattern_create ( 6 , set1 )
set2 = %w{ ABC abc 123 }
assert_equal 'Aa1Aa2Aa3Ab1Ab2Ab3' , Rex :: Text . pattern_create ( 18 , set2 )
assert_equal 'Zz8Zz9' , Rex :: Text . pattern_create ( 20280 ) [ - 6 , 6 ] # Bug #2952
end
def test_pattern_create_silly
assert_equal " " , Rex :: Text . pattern_create ( nil )
assert_equal " " , Rex :: Text . pattern_create ( 0 )
assert_equal 'AAAAAAAAA' , Rex :: Text . pattern_create ( 9 , [ 'A' ] )
end
2006-02-27 19:51:17 +00:00
def test_uri_encode
srand ( 0 )
assert_equal ( 'A1%21' , Rex :: Text . uri_encode ( 'A1!' ) , 'uri encode' )
2006-02-27 19:53:36 +00:00
assert_equal ( 'A1!' , Rex :: Text . uri_encode ( 'A1!' , 'none' ) , 'uri encode: none' )
2006-02-27 19:51:17 +00:00
assert_equal ( 'A1%21' , Rex :: Text . uri_encode ( 'A1!' , 'hex-normal' ) , 'uri encode: hex-normal' )
assert_equal ( '%41%31%21' , Rex :: Text . uri_encode ( 'A1!' , 'hex-all' ) , 'uri encode: hex-all' )
assert_equal ( 'A1%u01c3' , Rex :: Text . uri_encode ( 'A1!' , 'u-normal' ) , 'uri encode: u-normal' )
assert_equal ( '%uff21%u2081%uff01' , Rex :: Text . uri_encode ( 'A1!' , 'u-all' ) , 'uri encode: u-all' )
2007-05-14 20:49:35 +00:00
srand ( 0 )
assert_equal ( " %uff2d%uff49%uff43%uff52%uff4f%uff53%uff4f%uff46%uff54%u2004%uff45%uff4e%uff43%uff4f%uff44%uff49%uff4e%uff47%u3000%uff44%uff52%uff49%uff56%uff45%uff53%u2005%uff4d%uff45%u2000%uff43%uff52%uff41%uff5a%uff59%uff01 " , Rex :: Text . uri_encode ( 'Microsoft encoding drives me crazy!' , 'u-half' ) )
2006-02-27 19:51:17 +00:00
assert_raises ( TypeError ) {
Rex :: Text . uri_encode ( 'a' , 'umpa lumpa' )
}
end
2006-07-24 19:25:59 +00:00
def test_html_encode
2010-09-01 22:40:07 +00:00
assert_equal ( 'A' , Rex :: Text . html_encode ( 'A' ) , 'html_encode default' )
assert_equal ( 'A' , Rex :: Text . html_encode ( 'A' , 'hex' ) , 'html_encode hex' )
assert_equal ( 'A' , Rex :: Text . html_encode ( 'A' , 'int' ) , 'html_encode int' )
assert_equal ( 'A' , Rex :: Text . html_encode ( 'A' , 'int-wide' ) , 'html_encode int-wide' )
2006-07-24 19:25:59 +00:00
assert_raises ( TypeError ) {
Rex :: Text . html_encode ( 'a' , 'umpa lumpa' )
}
end
2006-01-31 22:25:55 +00:00
def test_rand_text
srand ( 0 )
assert_equal ( " \254 /u \300 C \373 \303 g \t \323 " , Rex :: Text . rand_text ( 10 ) , 'rand text 1' )
assert_equal ( " \025 \362 $WF \330 X \214 : \301 " , Rex :: Text . rand_text ( 10 ) , 'rand text 2' )
assert_equal ( " \346 'W \256 XQ \245 \031 MH " , Rex :: Text . rand_text ( 10 ) , 'rand text 3' )
assert_equal ( 'bababbabba' , Rex :: Text . rand_text ( 10 , nil , 'ab' ) , 'rand text with specified "good"' )
2006-04-21 03:59:07 +00:00
assert_equal ( 'MA' , Rex :: Text . rand_state ( ) , 'rand state' )
assert_equal ( 'xzdttongb.5gfk0xjly3.aak.fmo0rp.com' , Rex :: Text . rand_hostname ( ) , 'rand hostname' )
2010-01-26 02:35:13 +00:00
assert_equal ( '9aaf811799' , Rex :: Text . rand_text_hex ( 10 ) , 'rand hex' )
2006-01-31 22:25:55 +00:00
end
2006-01-19 15:12:22 +00:00
def test_unicode
2006-02-10 17:30:41 +00:00
assert_equal ( " a \x00 b \x00 c \x00 " , Rex :: Text . to_unicode ( 'abc' ) , 'unicode, default = little endian' )
assert_equal ( " a \x00 b \x00 c \x00 " , Rex :: Text . to_unicode ( 'abc' , 'utf-16le' ) , 'utf-16le' )
assert_equal ( " \x00 a \x00 b \x00 c " , Rex :: Text . to_unicode ( 'abc' , 'utf-16be' ) , 'utf-16be' )
assert_equal ( " a \x00 \x00 \x00 b \x00 \x00 \x00 c \x00 \x00 \x00 " , Rex :: Text . to_unicode ( 'abc' , 'utf-32le' ) , 'utf-32le' )
assert_equal ( " \x00 \x00 \x00 a \x00 \x00 \x00 b \x00 \x00 \x00 c " , Rex :: Text . to_unicode ( 'abc' , 'utf-32be' ) , 'utf-32be' )
assert_equal ( " abc+-abc-+AAA- " , Rex :: Text . to_unicode ( " abc+abc- \x00 " , 'utf-7' ) , 'utf-7' )
2006-02-13 22:52:01 +00:00
assert_equal ( " +AGE-+AGI-+AGM-+ACs-+AGE-+AGI-+AGM-+AC0-+AAA- " , Rex :: Text . to_unicode ( " abc+abc- \x00 " , 'utf-7' , 'all' ) , 'utf-7-all' )
assert_equal ( " a \303 \272 " , Rex :: Text . to_unicode ( " a \xFA " , 'utf-8' ) )
assert_equal ( " \xC1 \xA1 " , Rex :: Text . to_unicode ( 'a' , 'utf-8' , 'overlong' , 2 ) , 'utf-8 overlong' )
assert_equal ( " \xE0 \x81 \xA1 " , Rex :: Text . to_unicode ( 'a' , 'utf-8' , 'overlong' , 3 ) , 'utf-8 overlong' )
assert_equal ( " \xF0 \x80 \x81 \xA1 " , Rex :: Text . to_unicode ( 'a' , 'utf-8' , 'overlong' , 4 ) , 'utf-8 overlong' )
assert_equal ( " \xF8 \x80 \x80 \x81 \xA1 " , Rex :: Text . to_unicode ( 'a' , 'utf-8' , 'overlong' , 5 ) , 'utf-8 overlong' )
assert_equal ( " \xFC \x80 \x80 \x80 \x81 \xA1 " , Rex :: Text . to_unicode ( 'a' , 'utf-8' , 'overlong' , 6 ) , 'utf-8 overlong' )
assert_equal ( " \xFE \x80 \x80 \x80 \x80 \x81 \xA1 " , Rex :: Text . to_unicode ( 'a' , 'utf-8' , 'overlong' , 7 ) , 'utf-8 overlong' )
100 . times {
assert ( [ " \xC1 \x21 " , " \xC1 \x61 " , " \xC1 \xE1 " ] . include? ( Rex :: Text . to_unicode ( 'a' , 'utf-8' , 'invalid' ) ) , 'utf-8 invalid' )
assert ( [ " \xE0 \x01 \x21 " , " \xE0 \x01 \x61 " , " \xE0 \x01 \xA1 " , " \xE0 \x01 \xE1 " , " \xE0 \x41 \x21 " , " \xE0 \x41 \x61 " , " \xE0 \x41 \xA1 " , " \xE0 \x41 \xE1 " , " \xE0 \x81 \x21 " , " \xE0 \x81 \x61 " , " \xE0 \x81 \xA1 " , " \xE0 \x81 \xE1 " , " \xE0 \xC1 \x21 " , " \xE0 \xC1 \x61 " , " \xE0 \xC1 \xA1 " , " \xE0 \xC1 \xE1 " ] . include? ( Rex :: Text . to_unicode ( 'a' , 'utf-8' , 'invalid' , 3 ) ) , 'utf-8 invalid 3 byte' )
}
2006-02-14 01:04:29 +00:00
a = [ " \xC1 \x21 " , " \xC1 \x61 " , " \xC1 \xE1 " ]
10 . times {
encoded = Rex :: Text . to_unicode ( 'a' , 'utf-8' , 'invalid' )
if a . include? ( encoded )
a . delete ( encoded )
end
}
assert_equal ( [ ] , a , 'all possible values' )
2006-02-13 22:52:01 +00:00
assert_raises ( TypeError ) {
Rex :: Text . to_unicode ( 'a' , 'utf-8' , '' , 8 )
}
assert_raises ( TypeError ) {
Rex :: Text . to_unicode ( 'a' , 'utf-8' , 'foo' , 6 )
}
2006-02-22 23:29:34 +00:00
assert_raises ( TypeError ) {
Rex :: Text . to_unicode ( 'a' , 'uhwtfms' , - 1 )
}
100 . times {
assert ( [ " \x01 \x00 " , " \x01 \x02 " , " \x01 \x04 " , " \x01 \xcd " , " \x01 \xde " , " \xff \x21 " ] . include? ( Rex :: Text . to_unicode ( 'A' , 'uhwtfms' ) ) , 'uhwtfms' )
assert ( [ " \x00 \xc0 " , " \x00 \xc1 " , " \x00 \xc2 " , " \x00 \xc3 " , " \x00 \xc4 " , " \x00 \xc5 " ] . include? ( Rex :: Text . to_unicode ( 'A' , 'uhwtfms' , 949 ) ) , 'uhwtfms codepage 949' )
}
a = [ " \x01 \x00 " , " \x01 \x02 " , " \x01 \x04 " , " \x01 \xcd " , " \x01 \xde " , " \xff \x21 " ]
20 . times {
encoded = Rex :: Text . to_unicode ( 'A' , 'uhwtfms' )
if a . include? ( encoded )
a . delete ( encoded )
end
}
assert_equal ( [ ] , a , 'all possible values uhwtfms' )
2007-05-14 20:49:35 +00:00
assert_raises ( TypeError ) {
Rex :: Text . to_unicode ( 'a' , 'uhwtfms-half' , 1 )
}
assert_equal ( " \xFF \x01 " , Rex :: Text . to_unicode ( '!' , 'uhwtfms-half' ) )
srand ( 0 )
assert_equal ( " \xff \x2d \xff \x49 \xff \x43 \xff \x52 \xff \x4f \xff \x53 \xff \x4f \xff \x46 \xff \x54 \x20 \x04 \xff \x45 \xff \x4e \xff \x43 \xff \x4f \xff \x44 \xff \x49 \xff \x4e \xff \x47 \x30 \x00 \xff \x44 \xff \x52 \xff \x49 \xff \x56 \xff \x45 \xff \x53 \x20 \x05 \xff \x4d \xff \x45 \x20 \x00 \xff \x43 \xff \x52 \xff \x41 \xff \x5a \xff \x59 \xff \x01 " , Rex :: Text . to_unicode ( 'Microsoft encoding drives me crazy!' , 'uhwtfms-half' ) )
2006-01-19 15:12:22 +00:00
end
2006-01-27 05:33:08 +00:00
def test_zlib
2010-01-26 02:50:10 +00:00
assert_equal ( " x \332 \313 \310 T \310 \315 \317 \005 \000 \a \225 \002 ; " , Rex :: Text . zlib_deflate ( 'hi mom' ) , 'compress' )
2006-01-27 05:33:08 +00:00
assert_equal ( 'hi mom' , Rex :: Text . zlib_inflate ( " x \234 \313 \310 T \310 \315 \317 \005 \000 \a \225 \002 ; " ) , 'decompress' )
end
def test_gzip
string = Rex :: Text . gzip ( 'hi mom' )
assert_equal ( " \x1f \x8b \x08 \x00 " , string . slice! ( 0 , 4 ) , 'gzip headers' )
# skip the next 6 bytes as it is host & time specific (zlib's example gun does, so why not us too?)
string . slice! ( 0 , 6 )
assert_equal ( " \xcb \xc8 \x54 \xc8 \xcd \xcf \x05 \x00 \x68 \xa4 \x1c \xf0 \x06 \x00 \x00 \x00 " , string , 'gzip data' )
assert_equal ( 'hi mom' , Rex :: Text . ungzip ( " \037 \213 \010 \000 | \261 \275 C \002 \003 \313 \310 T \310 \315 \317 \005 \000 h \244 \034 \360 \006 \000 \000 \000 " ) , 'ungzip' )
end
2006-01-19 15:12:22 +00:00
2005-11-09 04:18:08 +00:00
def test_badchar_index
assert_equal ( nil , Rex :: Text . badchar_index ( 'abcdef' , 'gzk' ) )
assert_equal ( 2 , Rex :: Text . badchar_index ( '123avd' , 'ly3' ) )
end
2005-07-10 07:15:20 +00:00
def test_hexify
2006-02-27 19:51:17 +00:00
str = " \x01 \x02 \xff \x00 "
2006-01-19 15:12:22 +00:00
2006-02-27 19:51:17 +00:00
assert_equal ( " \\ x01 \\ x02 \\ xff \\ x00 " , Rex :: Text . to_hex ( str ) , 'to_hex' )
assert_equal ( " ABC01ABC02ABCffABC00 " , Rex :: Text . to_hex ( str , 'ABC' ) , 'to_hex with prefix' )
assert_equal ( '%u0102%uff00' , Rex :: Text . to_hex ( str , '%u' , 2 ) , 'to_hex with chunk size of 2' )
# to_hex, without providing enouigh data to chunk on a given size
2007-05-14 20:49:35 +00:00
assert_raises ( RuntimeError ) { Rex :: Text . to_hex ( 'a' , '' , 2 ) }
2006-02-27 19:51:17 +00:00
2009-03-09 05:19:26 +00:00
assert_equal ( " buf = \n \" \\ x01 \\ x02 \\ xff \\ x00 \" \n " , Rex :: Text . to_ruby ( str ) , 'to_ruby' )
assert_equal ( " my $buf = \n \" \\ x01 \\ x02 \\ xff \\ x00 \" ; \n " , Rex :: Text . to_perl ( str ) , 'to_perl' )
2011-11-11 08:13:17 +00:00
assert_equal ( " export buf= \\ \n $' \\ x01 \\ x02 \\ xff \\ x00 \' \n " , Rex :: Text . to_bash ( str ) , 'to_bash' )
2006-02-27 19:51:17 +00:00
assert_equal ( " unsigned char buf[] = \n \" \\ x01 \\ x02 \\ xff \\ x00 \" ; \n " , Rex :: Text . to_c ( str ) , 'to_c' )
2005-07-10 07:15:20 +00:00
# 0 -> 20
str = " \000 \001 \002 \003 \004 \005 \006 \a \010 \t \n \v \f \r \016 \017 \020 \021 \022 \023 "
2009-03-09 05:19:26 +00:00
assert_equal ( " buf = \n \" \\ x00 \\ x01 \\ x02 \\ x03 \" + \n \" \\ x04 \\ x05 \\ x06 \\ x07 \" + \n \" \\ x08 \\ x09 \\ x0a \\ x0b \" + \n \" \\ x0c \\ x0d \\ x0e \\ x0f \" + \n \" \\ x10 \\ x11 \\ x12 \\ x13 \" \n " , Rex :: Text . to_ruby ( str , 20 ) , 'to_ruby with wrap' )
assert_equal ( " my $buf = \n \" \\ x00 \\ x01 \\ x02 \\ x03 \" . \n \" \\ x04 \\ x05 \\ x06 \\ x07 \" . \n \" \\ x08 \\ x09 \\ x0a \\ x0b \" . \n \" \\ x0c \\ x0d \\ x0e \\ x0f \" . \n \" \\ x10 \\ x11 \\ x12 \\ x13 \" ; \n " , Rex :: Text . to_perl ( str , 20 ) , 'to_perl with wrap' )
2011-11-11 08:13:17 +00:00
assert_equal ( " export buf= \\ \n $' \\ x00 \\ x01 \\ x02 \\ x03 \' \\ \n $' \\ x04 \\ x05 \\ x06 \\ x07 \' \\ \n $' \\ x08 \\ x09 \\ x0a \\ x0b' \\ \n $' \\ x0c \\ x0d \\ x0e \\ x0f' \\ \n $' \\ x10 \\ x11 \\ x12 \\ x13 \' \n " , Rex :: Text . to_bash ( str , 20 ) , 'to_bash with wrap' )
2006-01-19 15:12:22 +00:00
assert_equal ( " unsigned char buf[] = \n \" \\ x00 \\ x01 \\ x02 \\ x03 \\ x04 \" \n \" \\ x05 \\ x06 \\ x07 \\ x08 \\ x09 \" \n \" \\ x0a \\ x0b \\ x0c \\ x0d \\ x0e \" \n \" \\ x0f \\ x10 \\ x11 \\ x12 \\ x13 \" ; \n " , Rex :: Text . to_c ( str , 20 , " buf " ) , 'to_c with wrap' )
2006-03-29 18:39:42 +00:00
assert_equal ( " \\ x0a " , Rex :: Text . to_hex ( " \n " ) , 'to_hex newline' )
2010-07-13 18:52:27 +00:00
str = " \x05 Hello \x06 World! \x03 \x41 \x42 \x43 "
assert_equal ( " \\ x05Hello \\ x06World! \\ x03ABC " , Rex :: Text . to_hex_ascii ( str ) )
2005-07-10 07:15:20 +00:00
end
2010-09-01 22:40:07 +00:00
def test_xml_char_encode
str = " \x05 hello \x06 world "
2010-09-01 23:26:35 +00:00
assert_equal ( " & # x05;hello& # x06;world " , Rex :: Text . xml_char_encode ( str ) )
2010-09-01 22:40:07 +00:00
end
2005-07-10 07:15:20 +00:00
def test_wordwrap
txt = " this is a test of the word wrap features "
assert_equal ( " this is a \n test of \n the word \n wrap \n features \n " , Rex :: Text . wordwrap ( txt , 0 , 10 ) )
end
2005-09-30 06:48:52 +00:00
def test_transforms
assert_equal ( " acbd18db4cc2f85cedef654fccc4a4d8 " , Rex :: Text . md5 ( 'foo' ) )
end
2009-03-09 05:19:26 +00:00
end