rallhook 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. data/AUTHORS +3 -0
  2. data/CHANGELOG +82 -0
  3. data/README +207 -0
  4. data/Rakefile +49 -0
  5. data/TODO +8 -0
  6. data/examples/hook/example1.rb +19 -0
  7. data/examples/hook/example2.rb +30 -0
  8. data/examples/hook/example3.rb +24 -0
  9. data/examples/hook/example4.rb +18 -0
  10. data/examples/hook/intercept.rb +41 -0
  11. data/examples/hook/intercept2.rb +49 -0
  12. data/examples/hook/redirect.rb +55 -0
  13. data/examples/hook/redirect_inherited.rb +28 -0
  14. data/examples/hook/shadow.rb +44 -0
  15. data/examples/instrospection/main.rb +13 -0
  16. data/examples/instrospection/source1.rb +4 -0
  17. data/examples/instrospection/source2.rb +4 -0
  18. data/ext/rallhook_base/distorm.h +401 -0
  19. data/ext/rallhook_base/extconf.rb +21 -0
  20. data/ext/rallhook_base/hook.c +165 -0
  21. data/ext/rallhook_base/hook.h +30 -0
  22. data/ext/rallhook_base/hook_rb_call.c +88 -0
  23. data/ext/rallhook_base/hook_rb_call.h +33 -0
  24. data/ext/rallhook_base/method_node.c +212 -0
  25. data/ext/rallhook_base/method_node.h +27 -0
  26. data/ext/rallhook_base/node_defs.h +294 -0
  27. data/ext/rallhook_base/rallhook.c +396 -0
  28. data/ext/rallhook_base/rb_call_fake.c +398 -0
  29. data/ext/rallhook_base/rb_call_fake.h +138 -0
  30. data/ext/rallhook_base/restrict_def.c +176 -0
  31. data/ext/rallhook_base/restrict_def.h +37 -0
  32. data/ext/rallhook_base/ruby_redirect.c +122 -0
  33. data/ext/rallhook_base/ruby_redirect.h +33 -0
  34. data/ext/rallhook_base/ruby_symbols.c +43 -0
  35. data/ext/rallhook_base/ruby_symbols.h +28 -0
  36. data/ext/rallhook_base/ruby_version.h +21 -0
  37. data/lib/rallhook/thread_hook.rb +37 -0
  38. data/lib/rallhook.rb +384 -0
  39. data/test/basic_proc.rb +45 -0
  40. data/test/integrity/test_array.rb +42 -0
  41. data/test/integrity/test_binding.rb +26 -0
  42. data/test/integrity/test_block.rb +37 -0
  43. data/test/integrity/test_call.rb +1 -0
  44. data/test/integrity/test_class_methods.rb +1 -0
  45. data/test/integrity/test_exception.rb +1 -0
  46. data/test/integrity/test_super.rb +34 -0
  47. data/test/introspection/test_call.rb +29 -0
  48. data/test/introspection/test_class_method.rb +41 -0
  49. data/test/introspection/test_file.rb +15 -0
  50. metadata +113 -0
@@ -0,0 +1,45 @@
1
+ require "test/unit"
2
+ require "rallhook"
3
+
4
+ class BasicHookProc
5
+
6
+ include RallHook::Helper
7
+
8
+ class BasicMethodWrapper < MethodWrapper
9
+
10
+ def call(*args)
11
+ if block_given?
12
+ original_call(*args) do |*x|
13
+ yield(*x)
14
+ end
15
+ else
16
+ original_call(*args)
17
+ end
18
+ end
19
+ end
20
+
21
+ def handle_method(klass,recv_,m, method_id)
22
+ return BasicMethodWrapper.redirect_handler(klass,recv_,m,method_id)
23
+ end
24
+ end
25
+
26
+ module BasicHookProcTest
27
+ def hook
28
+ rallhook = RallHook::Hook
29
+ basichook = BasicHookProc.new
30
+
31
+ rallhook.hook basichook do
32
+ yield
33
+ end
34
+ end
35
+
36
+ def oracle_hook_assert_equal
37
+ result = nil
38
+ hook do
39
+ result = yield
40
+ end
41
+
42
+ assert_equal result, yield
43
+ end
44
+ alias oracle_hook_assert oracle_hook_assert_equal
45
+ end
@@ -0,0 +1,42 @@
1
+ require "test/unit"
2
+ require "test/basic_proc"
3
+
4
+ class TestArray < Test::Unit::TestCase
5
+
6
+ include BasicHookProcTest
7
+
8
+
9
+ def test_array_basic
10
+ oracle_hook_assert { [1,2,3,4] }
11
+ end
12
+
13
+ def f0(input)
14
+ input.select{|i| i%2==0}
15
+ end
16
+ def f1(input)
17
+ input.map{|i| i*5+2}
18
+ end
19
+ def f2(input)
20
+ input.inject{|x,y| x*y}
21
+ end
22
+
23
+ def test_array_blocks
24
+
25
+ # oracle testing, the result of the method out of hook must be the same in the hook
26
+ 25.times do
27
+ ary = [rand(20),rand(20),rand(20),rand(20),rand(20)]
28
+ oracle_hook_assert do
29
+ f0(ary)
30
+ end
31
+ oracle_hook_assert do
32
+ f1(ary)
33
+ end
34
+ oracle_hook_assert do
35
+ f2(ary)
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,26 @@
1
+ require "test/unit"
2
+ require "test/basic_proc"
3
+
4
+ class TestBinding < Test::Unit::TestCase
5
+
6
+ include BasicHookProcTest
7
+
8
+ def generate_binding
9
+ a = 1
10
+ b = 2
11
+ c = 3
12
+
13
+ binding
14
+ end
15
+
16
+ def f0()
17
+ eval("a+b+c", generate_binding)
18
+ end
19
+
20
+ def test_array_blocks
21
+ oracle_hook_assert do
22
+ f0
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,37 @@
1
+ require "test/unit"
2
+ require "test/basic_proc"
3
+
4
+ class TestBlock < Test::Unit::TestCase
5
+
6
+ include BasicHookProcTest
7
+
8
+ def block_func(*a)
9
+ yield(*a)
10
+ end
11
+
12
+ def f0(test_args)
13
+
14
+ result = nil
15
+ block_func(*test_args) do |*args|
16
+ result = args
17
+ end
18
+
19
+ result
20
+ end
21
+
22
+ def _test_block_passing(*test_args)
23
+ # oracle testing, the result with hook and without hook must be the same
24
+ oracle_hook_assert do f0(test_args) end
25
+ end
26
+
27
+ def test_block
28
+ _test_block_passing(1)
29
+ _test_block_passing(1,2)
30
+ _test_block_passing("3333")
31
+ _test_block_passing("3333",9999, 1.32)
32
+ _test_block_passing([1,2,3])
33
+ _test_block_passing([1])
34
+ _test_block_passing([[1]])
35
+ end
36
+ end
37
+
@@ -0,0 +1 @@
1
+
@@ -0,0 +1 @@
1
+
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,34 @@
1
+ require "test/unit"
2
+ require "test/basic_proc"
3
+
4
+ class TestSuper < Test::Unit::TestCase
5
+
6
+ include BasicHookProcTest
7
+
8
+ class X
9
+ def foo
10
+ [1]
11
+ end
12
+ end
13
+ class Y < X
14
+ def foo
15
+ super+[2]
16
+ end
17
+ end
18
+ class Z < Y
19
+ def foo
20
+ super+[3]
21
+ end
22
+ end
23
+
24
+ def f0(klass)
25
+ z = klass.new
26
+ z.foo
27
+ end
28
+ def test_basic
29
+ oracle_hook_assert_equal do f0(X) end
30
+ oracle_hook_assert_equal do f0(Y) end
31
+ oracle_hook_assert_equal do f0(Z) end
32
+ end
33
+ end
34
+
@@ -0,0 +1,29 @@
1
+ require "test/unit"
2
+ require "test/basic_proc"
3
+
4
+ class InstrospectionTestCall < Test::Unit::TestCase
5
+
6
+ class X
7
+ def foo
8
+ "fooX"
9
+ end
10
+ end
11
+
12
+ class Y < X
13
+ def foo
14
+ "fooY"
15
+ end
16
+ end
17
+
18
+ def test_file
19
+ y = Y.new
20
+
21
+ assert_equal y.specific_method(:foo).call, "fooY"
22
+ assert_equal y.specific_method(X,:foo).call, "fooX"
23
+ assert_equal y.specific_method(Y,:foo).call, "fooY"
24
+
25
+ assert_raise NameError do
26
+ y.specific_method(Fixnum,:foo)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,41 @@
1
+ require "test/unit"
2
+ require "test/basic_proc"
3
+
4
+
5
+ class TestClassMethod < Test::Unit::TestCase
6
+
7
+ class << self
8
+ attr_accessor :global_binding
9
+ end
10
+
11
+ TestClassMethod.global_binding = binding
12
+
13
+ class X
14
+ def self.foo
15
+ end
16
+ end
17
+
18
+ class MethodHandler < RallHook::HookHandler
19
+ def handle_method (klass,self_,m,method_id)
20
+ if m
21
+ file = klass.instance_method(m).body.file
22
+ end
23
+
24
+ nil # do nothing
25
+ end
26
+ end
27
+
28
+
29
+ def test_file
30
+ assert_nothing_raised do
31
+ MethodHandler.hook do
32
+ eval( "
33
+ class Y < X
34
+ end
35
+ Y.foo
36
+ ", TestClassMethod.global_binding)
37
+
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,15 @@
1
+ require "test/unit"
2
+ require "test/basic_proc"
3
+
4
+ class InstrospectionTestFile < Test::Unit::TestCase
5
+ def _test_file(name)
6
+ eval("def xmethod; end", binding, name)
7
+ assert_equal self.method(:xmethod).body.file, name
8
+ end
9
+
10
+ def test_file
11
+ 10.times do
12
+ _test_file("xxx" + rand(999).to_s)
13
+ end
14
+ end
15
+ end
metadata ADDED
@@ -0,0 +1,113 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rallhook
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.0
5
+ platform: ruby
6
+ authors:
7
+ - Dario Seminara
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-06-20 00:00:00 -03:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: ruby-cymbol
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.1.0
24
+ version:
25
+ description:
26
+ email: robertodarioseminara@gmail.com
27
+ executables: []
28
+
29
+ extensions:
30
+ - ext/rallhook_base/extconf.rb
31
+ extra_rdoc_files:
32
+ - README
33
+ files:
34
+ - examples/hook/shadow.rb
35
+ - examples/hook/intercept.rb
36
+ - examples/hook/redirect.rb
37
+ - examples/hook/example1.rb
38
+ - examples/hook/example3.rb
39
+ - examples/hook/example4.rb
40
+ - examples/hook/intercept2.rb
41
+ - examples/hook/redirect_inherited.rb
42
+ - examples/hook/example2.rb
43
+ - examples/instrospection/source1.rb
44
+ - examples/instrospection/main.rb
45
+ - examples/instrospection/source2.rb
46
+ - lib/rallhook.rb
47
+ - lib/rallhook/thread_hook.rb
48
+ - test/integrity/test_exception.rb
49
+ - test/integrity/test_call.rb
50
+ - test/integrity/test_block.rb
51
+ - test/integrity/test_class_methods.rb
52
+ - test/integrity/test_binding.rb
53
+ - test/integrity/test_super.rb
54
+ - test/integrity/test_array.rb
55
+ - test/basic_proc.rb
56
+ - test/introspection/test_call.rb
57
+ - test/introspection/test_file.rb
58
+ - test/introspection/test_class_method.rb
59
+ - ext/rallhook_base/ruby_symbols.c
60
+ - ext/rallhook_base/rb_call_fake.c
61
+ - ext/rallhook_base/ruby_redirect.c
62
+ - ext/rallhook_base/hook.c
63
+ - ext/rallhook_base/rallhook.c
64
+ - ext/rallhook_base/restrict_def.c
65
+ - ext/rallhook_base/hook_rb_call.c
66
+ - ext/rallhook_base/method_node.c
67
+ - ext/rallhook_base/hook.h
68
+ - ext/rallhook_base/ruby_version.h
69
+ - ext/rallhook_base/node_defs.h
70
+ - ext/rallhook_base/hook_rb_call.h
71
+ - ext/rallhook_base/ruby_symbols.h
72
+ - ext/rallhook_base/ruby_redirect.h
73
+ - ext/rallhook_base/restrict_def.h
74
+ - ext/rallhook_base/rb_call_fake.h
75
+ - ext/rallhook_base/distorm.h
76
+ - ext/rallhook_base/method_node.h
77
+ - ext/rallhook_base/extconf.rb
78
+ - AUTHORS
79
+ - CHANGELOG
80
+ - README
81
+ - Rakefile
82
+ - TODO
83
+ has_rdoc: true
84
+ homepage: http://github.com/tario/rallhook
85
+ licenses: []
86
+
87
+ post_install_message:
88
+ rdoc_options:
89
+ - --main
90
+ - README
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: "0"
98
+ version:
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: "0"
104
+ version:
105
+ requirements: []
106
+
107
+ rubyforge_project:
108
+ rubygems_version: 1.3.5
109
+ signing_key:
110
+ specification_version: 3
111
+ summary: Allow hooking of all method invocations transparently to control and / or monitor the behavior of a ruby program
112
+ test_files: []
113
+