adsl 0.0.3 → 0.1.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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -20
  3. data/README.md +14 -21
  4. data/bin/adsl-verify +8 -8
  5. data/lib/adsl.rb +3 -0
  6. data/lib/adsl/adsl.rb +3 -0
  7. data/lib/adsl/ds/data_store_spec.rb +339 -0
  8. data/lib/adsl/extract/instrumenter.rb +206 -0
  9. data/lib/adsl/extract/meta.rb +33 -0
  10. data/lib/adsl/extract/rails/action_block_builder.rb +233 -0
  11. data/lib/adsl/extract/rails/action_instrumenter.rb +400 -0
  12. data/lib/adsl/extract/rails/action_runner.rb +57 -0
  13. data/lib/adsl/extract/rails/active_record_metaclass_generator.rb +555 -0
  14. data/lib/adsl/extract/rails/callback_chain_simulator.rb +135 -0
  15. data/lib/adsl/extract/rails/invariant_extractor.rb +48 -0
  16. data/lib/adsl/extract/rails/invariant_instrumenter.rb +70 -0
  17. data/lib/adsl/extract/rails/other_meta.rb +57 -0
  18. data/lib/adsl/extract/rails/rails_extractor.rb +211 -0
  19. data/lib/adsl/extract/rails/rails_instrumentation_test_case.rb +34 -0
  20. data/lib/adsl/extract/rails/rails_special_gem_instrumentation.rb +120 -0
  21. data/lib/adsl/extract/rails/rails_test_helper.rb +140 -0
  22. data/lib/adsl/extract/sexp_utils.rb +54 -0
  23. data/lib/adsl/fol/first_order_logic.rb +261 -0
  24. data/lib/adsl/parser/adsl_parser.racc +159 -0
  25. data/lib/{parser → adsl/parser}/adsl_parser.rex +4 -4
  26. data/lib/{parser → adsl/parser}/adsl_parser.rex.rb +6 -6
  27. data/lib/adsl/parser/adsl_parser.tab.rb +1031 -0
  28. data/lib/adsl/parser/ast_nodes.rb +1410 -0
  29. data/lib/adsl/railtie.rb +67 -0
  30. data/lib/adsl/spass/bin.rb +230 -0
  31. data/lib/{spass → adsl/spass}/ruby_extensions.rb +0 -0
  32. data/lib/adsl/spass/spass_ds_extensions.rb +931 -0
  33. data/lib/adsl/spass/spass_translator.rb +393 -0
  34. data/lib/adsl/spass/util.rb +13 -0
  35. data/lib/adsl/util/csv_hash_formatter.rb +94 -0
  36. data/lib/adsl/util/general.rb +228 -0
  37. data/lib/adsl/util/test_helper.rb +71 -0
  38. data/lib/adsl/verification/formula_generators.rb +231 -0
  39. data/lib/adsl/verification/instrumentation_filter.rb +50 -0
  40. data/lib/adsl/verification/invariant.rb +19 -0
  41. data/lib/adsl/verification/rails_verification.rb +33 -0
  42. data/lib/adsl/verification/utils.rb +20 -0
  43. data/lib/adsl/verification/verification_case.rb +13 -0
  44. data/test/integration/rails/rails_branch_verification_test.rb +112 -0
  45. data/test/integration/rails/rails_verification_test.rb +253 -0
  46. data/test/integration/spass/basic_translation_test.rb +563 -0
  47. data/test/integration/spass/control_flow_translation_test.rb +421 -0
  48. data/test/unit/adsl/ds/data_store_spec_test.rb +54 -0
  49. data/test/unit/adsl/extract/instrumenter_test.rb +103 -0
  50. data/test/unit/adsl/extract/meta_test.rb +142 -0
  51. data/test/unit/adsl/extract/rails/action_block_builder_test.rb +178 -0
  52. data/test/unit/adsl/extract/rails/action_instrumenter_test.rb +68 -0
  53. data/test/unit/adsl/extract/rails/active_record_metaclass_generator_test.rb +336 -0
  54. data/test/unit/adsl/extract/rails/callback_chain_simulator_test.rb +76 -0
  55. data/test/unit/adsl/extract/rails/invariant_extractor_test.rb +92 -0
  56. data/test/unit/adsl/extract/rails/rails_extractor_test.rb +1380 -0
  57. data/test/unit/adsl/extract/rails/rails_test_helper_test.rb +25 -0
  58. data/test/unit/adsl/extract/sexp_utils_test.rb +100 -0
  59. data/test/unit/adsl/fol/first_order_logic_test.rb +227 -0
  60. data/test/unit/adsl/parser/action_parser_test.rb +1040 -0
  61. data/test/unit/adsl/parser/ast_nodes_test.rb +359 -0
  62. data/test/unit/adsl/parser/class_parser_test.rb +288 -0
  63. data/test/unit/adsl/parser/general_parser_test.rb +67 -0
  64. data/test/unit/adsl/parser/invariant_parser_test.rb +432 -0
  65. data/test/unit/adsl/parser/parser_util_test.rb +126 -0
  66. data/test/unit/adsl/spass/bin_test.rb +65 -0
  67. data/test/unit/adsl/spass/ruby_extensions_test.rb +39 -0
  68. data/test/unit/adsl/spass/spass_ds_extensions_test.rb +7 -0
  69. data/test/unit/adsl/spass/spass_translator_test.rb +342 -0
  70. data/test/unit/adsl/util/csv_hash_formatter_test.rb +68 -0
  71. data/test/unit/adsl/util/general_test.rb +303 -0
  72. data/test/unit/adsl/util/test_helper_test.rb +120 -0
  73. data/test/unit/adsl/verification/formula_generators_test.rb +200 -0
  74. data/test/unit/adsl/verification/instrumentation_filter_test.rb +39 -0
  75. data/test/unit/adsl/verification/utils_test.rb +39 -0
  76. data/test/unit/adsl/verification/verification_case_test.rb +8 -0
  77. metadata +229 -29
  78. data/lib/ds/data_store_spec.rb +0 -292
  79. data/lib/fol/first_order_logic.rb +0 -260
  80. data/lib/parser/adsl_ast.rb +0 -779
  81. data/lib/parser/adsl_parser.racc +0 -151
  82. data/lib/parser/adsl_parser.tab.rb +0 -976
  83. data/lib/parser/dsdl_parser.rex.rb +0 -196
  84. data/lib/parser/dsdl_parser.tab.rb +0 -976
  85. data/lib/spass/bin.rb +0 -164
  86. data/lib/spass/spass_ds_extensions.rb +0 -870
  87. data/lib/spass/spass_translator.rb +0 -388
  88. data/lib/spass/util.rb +0 -11
  89. data/lib/util/csv_hash_formatter.rb +0 -47
  90. data/lib/util/test_helper.rb +0 -33
  91. data/lib/util/util.rb +0 -114
@@ -0,0 +1,103 @@
1
+ require 'test/unit'
2
+ require 'pp'
3
+ require 'adsl/extract/instrumenter'
4
+ require 'adsl/util/test_helper'
5
+
6
+ class ADSL::Extract::InstrumenterTest < Test::Unit::TestCase
7
+ class Foo
8
+ end
9
+
10
+ def setup
11
+ Foo.class_exec do
12
+ def blah
13
+ [1, 2, 3]
14
+ end
15
+
16
+ def call_blah
17
+ blah
18
+ end
19
+
20
+ def repeat_blah(arg)
21
+ arg.times.map do
22
+ blah
23
+ end.to_a
24
+ end
25
+
26
+ def empty_method
27
+ end
28
+
29
+ def self.blah
30
+ [3, 2, 1]
31
+ end
32
+
33
+ def self.call_blah
34
+ self.blah
35
+ end
36
+ end
37
+
38
+ assert_equal [1, 2, 3], Foo.new.blah
39
+ assert_equal nil, Foo.new.empty_method
40
+ assert_equal [1, 2, 3], Foo.new.call_blah
41
+ assert_equal [[1, 2, 3], [1, 2, 3]], Foo.new.repeat_blah(2)
42
+ end
43
+
44
+ def teardown
45
+ end
46
+
47
+ def test_execute_instrumented__blank
48
+ instrumenter = ADSL::Extract::Instrumenter.new
49
+ assert_equal [1, 2, 3], instrumenter.execute_instrumented(Foo.new, :blah)
50
+ end
51
+
52
+ def test_execute_instrumented__plain_replace
53
+ instrumenter = ADSL::Extract::Instrumenter.new
54
+
55
+ instrumenter.replace :lit do |sexp|
56
+ s(:lit, sexp[1]*2)
57
+ end
58
+
59
+ assert_equal [2, 4, 6], instrumenter.execute_instrumented(Foo.new, :blah)
60
+ end
61
+
62
+ def test_execute_instrumented__instrumentation_does_not_wreck_empty_methods
63
+ instrumenter = ADSL::Extract::Instrumenter.new
64
+ assert_equal nil, instrumenter.execute_instrumented(Foo.new, :empty_method)
65
+ end
66
+
67
+ def test_execute_instrumented__calls_work
68
+ instrumenter = ADSL::Extract::Instrumenter.new
69
+ assert_equal [1, 2, 3], instrumenter.execute_instrumented(Foo.new, :call_blah)
70
+ end
71
+
72
+ def test_execute_instrumented__instrumentation_propagates_through_calls
73
+ instrumenter = ADSL::Extract::Instrumenter.new
74
+
75
+ instrumenter.replace :lit do |sexp|
76
+ s(:lit, sexp[1]*2)
77
+ end
78
+
79
+ assert_equal [2, 4, 6], instrumenter.execute_instrumented(Foo.new, :call_blah)
80
+ end
81
+
82
+ def test_execute_instrumented__instrumentation_happens_once
83
+ instrumenter = ADSL::Extract::Instrumenter.new
84
+
85
+ instrumenter.replace :lit do |sexp|
86
+ s(:lit, sexp[1]*2)
87
+ end
88
+
89
+ assert_equal [[2, 4, 6]], instrumenter.execute_instrumented(Foo.new, :repeat_blah, 1)
90
+ assert_equal [[2, 4, 6], [2, 4, 6]], instrumenter.execute_instrumented(Foo.new, :repeat_blah, 2)
91
+ assert_equal [2, 4, 6], instrumenter.execute_instrumented(Foo.new, :blah)
92
+ end
93
+
94
+ def test_execute_instrumented__instrumentation_propagates_through_class_level_calls
95
+ instrumenter = ADSL::Extract::Instrumenter.new
96
+
97
+ instrumenter.replace :lit do |sexp|
98
+ s(:lit, sexp[1]*2)
99
+ end
100
+
101
+ assert_equal [6, 4, 2], instrumenter.execute_instrumented(Foo, :call_blah)
102
+ end
103
+ end
@@ -0,0 +1,142 @@
1
+ require 'test/unit'
2
+ require 'adsl/extract/meta'
3
+ require 'pp'
4
+ require 'adsl/util/test_helper'
5
+
6
+ class ADSL::Util::MetaTest < Test::Unit::TestCase
7
+ def setup
8
+ assert !class_defined?(:Foo, :Bar)
9
+ end
10
+
11
+ def teardown
12
+ unload_class :Foo, :Bar
13
+ end
14
+
15
+ def test_object__replace_method__crashes_when_no_method_exists
16
+ eval <<-ruby
17
+ class Foo; end
18
+ ruby
19
+ assert_raise do
20
+ Foo.new.replace_method :a, "def a; end"
21
+ end
22
+ end
23
+
24
+ def test_object__replace_method__simple
25
+ eval <<-ruby
26
+ class Foo
27
+ def a; :old; end
28
+ end
29
+ ruby
30
+ assert_equal :old, Foo.new.a
31
+
32
+ Foo.new.replace_method :a, "def a; :new; end"
33
+
34
+ assert_equal :new, Foo.new.a
35
+ end
36
+
37
+ def test_object__replace_method__eigenclass
38
+ eval <<-ruby
39
+ class Foo
40
+ def a; :old; end
41
+ end
42
+ ruby
43
+
44
+ foo = Foo.new
45
+ def foo.a; :overridden; end
46
+
47
+ assert_equal :old, Foo.new.a
48
+ assert_equal :overridden, foo.a
49
+
50
+ foo.replace_method :a, "def a; :new; end"
51
+
52
+ assert_equal :old, Foo.new.a
53
+ assert_equal :new, foo.a
54
+ end
55
+
56
+ def test_object__replace_method__works_on_aliases
57
+ eval <<-ruby
58
+ class Foo
59
+ def a; :blah; end
60
+ alias_method :a_copy, :a
61
+ end
62
+ ruby
63
+
64
+ foo = Foo.new
65
+
66
+ assert_equal :blah, foo.a
67
+ assert_equal :blah, foo.a_copy
68
+
69
+ foo.replace_method :a, "def a; :kme; end"
70
+
71
+ assert_equal :kme, foo.a
72
+ assert_equal :kme, foo.a_copy
73
+ end
74
+
75
+ def test_object__replace_method__leaves_super_class_alone_if_overridden
76
+ eval <<-ruby
77
+ class Foo
78
+ def a; :old; end
79
+ end
80
+ class Bar < Foo
81
+ def a; :old; end
82
+ end
83
+ ruby
84
+ assert_equal :old, Foo.new.a
85
+ assert_equal :old, Bar.new.a
86
+
87
+ Bar.new.replace_method :a, "def a; :new; end"
88
+
89
+ assert_equal :old, Foo.new.a
90
+ assert_equal :new, Bar.new.a
91
+ end
92
+
93
+ def test_object__replace_method__targets_superclass
94
+ eval <<-ruby
95
+ class Foo
96
+ def a; :old; end
97
+ end
98
+ class Bar < Foo
99
+ end
100
+ ruby
101
+ assert_equal :old, Foo.new.a
102
+ assert_equal :old, Bar.new.a
103
+
104
+ Bar.new.replace_method :a, "def a; :new; end"
105
+
106
+ assert_equal :new, Foo.new.a
107
+ assert_equal :new, Bar.new.a
108
+ end
109
+
110
+ def test_object__replace_method__targets_module
111
+ eval <<-ruby
112
+ module Foo
113
+ def a; :old; end
114
+ end
115
+ class Bar
116
+ include Foo
117
+ end
118
+ ruby
119
+ assert_equal :old, Bar.new.a
120
+
121
+ Bar.new.replace_method :a, "def a; :new; end"
122
+
123
+ assert_equal :new, Bar.new.a
124
+ end
125
+
126
+ def test_objset__replace_method__block
127
+ eval <<-ruby
128
+ class Foo
129
+ def a; :old; end
130
+ end
131
+ ruby
132
+
133
+ assert_equal :old, Foo.new.a
134
+
135
+ Foo.new.replace_method :a do
136
+ :new
137
+ end
138
+
139
+ assert_equal :new, Foo.new.a
140
+ end
141
+
142
+ end
@@ -0,0 +1,178 @@
1
+ require 'adsl/extract/rails/action_block_builder'
2
+ require 'adsl/extract/rails/other_meta'
3
+ require 'adsl/parser/ast_nodes'
4
+
5
+ module ADSL::Extract::Rails
6
+ class ActionBlockBuilderTest < Test::Unit::TestCase
7
+ include ADSL::Parser
8
+
9
+ def test__in_stmt_frame
10
+ abb = ActionBlockBuilder.new
11
+
12
+ assert_equal([:a, :b, :d], abb.in_stmt_frame do
13
+ abb << :a
14
+ abb << :b
15
+ assert_equal([:c], abb.in_stmt_frame do
16
+ abb << :c
17
+ end)
18
+ abb << :d
19
+ end)
20
+
21
+ assert_equal([:a, :b, :d], abb.in_stmt_frame do
22
+ abb << :a
23
+ abb << :b
24
+ assert_equal([:c], abb.in_stmt_frame do
25
+ abb << :c
26
+ end)
27
+ abb << :d
28
+ end)
29
+ end
30
+
31
+ def test__all_stmts_so_far
32
+ abb = ActionBlockBuilder.new
33
+
34
+ abb.in_stmt_frame do
35
+ abb << :a
36
+ abb << :b
37
+ abb.in_stmt_frame do
38
+ abb << :c
39
+ assert_equal [:a, :b, :c], abb.all_stmts_so_far
40
+ end
41
+ abb << :d
42
+ assert_equal [:a, :b, :d], abb.all_stmts_so_far
43
+ end
44
+ assert abb.all_stmts_so_far.empty?
45
+
46
+ abb.in_stmt_frame do
47
+ abb << :a
48
+ abb << :b
49
+ abb.in_stmt_frame do
50
+ abb << :c
51
+ assert_equal [:a, :b, :c], abb.all_stmts_so_far
52
+ end
53
+ abb << :d
54
+ assert_equal [:a, :b, :d], abb.all_stmts_so_far
55
+ end
56
+ assert abb.all_stmts_so_far.empty?
57
+ end
58
+
59
+ def test__branch_choice__no_branches
60
+ abb = ActionBlockBuilder.new
61
+ abb.explore_all_choices do
62
+ abb << :a
63
+ end
64
+ assert_equal [[:a]], abb.root_paths
65
+ end
66
+
67
+ def test__branch_choice
68
+ abb = ActionBlockBuilder.new
69
+
70
+ abb.explore_all_choices do
71
+ abb << :a
72
+ abb << :b
73
+ if abb.branch_choice 1
74
+ abb << :c
75
+ if abb.branch_choice 2
76
+ abb << :d
77
+ abb.do_return :nil
78
+ abb << :e
79
+ else
80
+ abb << :f
81
+ end
82
+ else
83
+ abb << :g
84
+ abb.do_return :nil
85
+ abb << :h
86
+ end
87
+ abb << :i
88
+ if abb.branch_choice 3
89
+ abb << :j
90
+ else
91
+ abb << :k
92
+ end
93
+ abb << :l
94
+ end
95
+
96
+ expected_choices = [
97
+ [:a, :b, :c, :d],
98
+ [:a, :b, :c, :f, :i, :j, :l],
99
+ [:a, :b, :c, :f, :i, :k, :l],
100
+ [:a, :b, :g]
101
+ ]
102
+
103
+ assert_set_equal expected_choices, abb.root_paths
104
+ end
105
+
106
+ def test__common_return_value
107
+ abb = ActionBlockBuilder.new
108
+
109
+ assert_equal(:a, abb.explore_all_choices do
110
+ abb.do_return :a
111
+ end)
112
+
113
+ ret_value = abb.explore_all_choices do
114
+ if abb.branch_choice 1
115
+ abb.do_return :a
116
+ else
117
+ abb.do_return :b
118
+ end
119
+ end
120
+
121
+ assert_equal ::ADSL::Extract::Rails::MetaUnknown, ret_value.class
122
+ end
123
+
124
+ def test__common_return_value__ignores_duplicate_nils
125
+ abb = ActionBlockBuilder.new
126
+
127
+ assert_equal(nil, abb.explore_all_choices do
128
+ if abb.branch_choice 1
129
+ abb.do_return nil
130
+ else
131
+ abb.do_return nil
132
+ end
133
+ end)
134
+ end
135
+
136
+ def test__common_return_value__implicit
137
+ abb = ActionBlockBuilder.new
138
+
139
+ assert_equal(:c, abb.explore_all_choices do
140
+ abb << :b
141
+ abb << :c
142
+ end)
143
+
144
+ ret_value = abb.explore_all_choices do
145
+ abb << :c
146
+ if abb.branch_choice 1
147
+ abb << :a
148
+ else
149
+ abb << :c
150
+ end
151
+ end
152
+
153
+ assert_equal ::ADSL::Extract::Rails::MetaUnknown, ret_value.class
154
+ end
155
+
156
+ def test__common_return_value__looks_at_do_return_at_not_the_actual_return_value
157
+ abb = ActionBlockBuilder.new
158
+
159
+ assert_equal(:a, abb.explore_all_choices do
160
+ abb.do_return :a
161
+ abb << :b
162
+ end)
163
+ end
164
+
165
+ def test__adsl_ast__simple
166
+ abb = ActionBlockBuilder.new
167
+ abb.explore_all_choices do
168
+ abb << :a
169
+ abb << :b
170
+ abb << :c
171
+ end
172
+ adsl_ast = abb.adsl_ast
173
+ assert_equal ASTBlock, adsl_ast.class
174
+ assert_equal [:a, :b, :c], adsl_ast.statements
175
+ end
176
+
177
+ end
178
+ end
@@ -0,0 +1,68 @@
1
+ require 'test/unit'
2
+ require 'active_record'
3
+ require 'ruby_parser'
4
+ require 'ruby2ruby'
5
+ require 'adsl/util/test_helper'
6
+ require 'adsl/extract/rails/action_instrumenter'
7
+ require 'adsl/extract/rails/rails_test_helper'
8
+ require 'adsl/extract/rails/rails_instrumentation_test_case'
9
+
10
+ class ADSL::Extract::ActionInstrumenterTest < ADSL::Extract::Rails::RailsInstrumentationTestCase
11
+
12
+ def test__local_instance_class_variables_differ
13
+ instrumenter = ADSL::Extract::Rails::ActionInstrumenter.new ar_class_names, File.join(Dir.pwd, '/test/unit').to_s
14
+ input_code = <<-rails
15
+ def blah
16
+ a = 1
17
+ @a = 2
18
+ @@a = 3
19
+ return a, @a, @@a
20
+ end
21
+ rails
22
+
23
+ Asd.class_eval input_code
24
+ Kme.class_eval input_code
25
+
26
+ asd, kme = Asd.new, Kme.new
27
+ asd_values = asd.blah
28
+ kme_values = instrumenter.execute_instrumented kme, :blah
29
+
30
+ assert_equal [1, 2, 3], asd_values
31
+ assert_equal [1, 2, 3], kme_values
32
+
33
+ assert_equal 2, asd.instance_variable_get(:@a)
34
+ assert_equal 3, Asd.class_variable_get(:@@a)
35
+
36
+ assert_equal 2, kme.instance_variable_get(:@a)
37
+ assert_equal 3, Kme.class_variable_get(:@@a)
38
+ end
39
+
40
+ def test__multiassign_simple
41
+ instrumenter = ADSL::Extract::Rails::ActionInstrumenter.new ar_class_names, File.join(Dir.pwd, '/test/unit').to_s
42
+ input_codes = {
43
+ "def blah; @a, @b, @c = 1, 2, 3; end" => [1, 2, 3],
44
+ "def blah; @a, @b, @c = 4, 5; end" => [4, 5, nil],
45
+ "def blah; @a, @b = 6, 7, 8; end" => [6, 7, nil],
46
+ "def call3; [8, 9, 10]; end; def blah; @a, @b, @c = call3; end" => [8, 9, 10],
47
+ "def call2; [11, 12]; end; def blah; @a, @b, @c = call2; end" => [11, 12, nil],
48
+ "def blah; @a, @b = [13, 14]; end" => [13, 14, nil],
49
+ "def blah; @a, @b = [[15, 16], 17]; end" => [[15, 16], 17, nil]
50
+ }
51
+ input_codes.each do |code, expected_results|
52
+ Asd.class_eval code
53
+ Kme.class_eval code
54
+
55
+ asd, kme = Asd.new, Kme.new
56
+ asd.blah
57
+ instrumenter.execute_instrumented kme, :blah
58
+
59
+ assert_equal expected_results[0], asd.instance_variable_get(:@a), code
60
+ assert_equal expected_results[1], asd.instance_variable_get(:@b), code
61
+ assert_equal expected_results[2], asd.instance_variable_get(:@c), code
62
+
63
+ assert_equal expected_results[0], kme.instance_variable_get(:@a), code
64
+ assert_equal expected_results[1], kme.instance_variable_get(:@b), code
65
+ assert_equal expected_results[2], kme.instance_variable_get(:@c), code
66
+ end
67
+ end
68
+ end