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,421 @@
1
+ require 'adsl/util/test_helper'
2
+ require 'test/unit'
3
+
4
+ class ControlFlowTranslationTest < Test::Unit::TestCase
5
+ def test_either__blank
6
+ adsl_assert :correct, <<-ADSL
7
+ class Class{}
8
+ action blah() {
9
+ either {} or {}
10
+ }
11
+ invariant exists(Class o)
12
+ ADSL
13
+ adsl_assert :correct, <<-ADSL
14
+ class Class{}
15
+ action blah() {
16
+ either {} or {}
17
+ }
18
+ invariant not exists(Class o)
19
+ ADSL
20
+ end
21
+
22
+ def test_either__doesnt_break_others
23
+ adsl_assert :correct, <<-ADSL
24
+ class Class{}
25
+ action blah() {
26
+ create(Class)
27
+ either {} or {}
28
+ }
29
+ invariant exists(Class o)
30
+ ADSL
31
+ adsl_assert :correct, <<-ADSL
32
+ class Class{}
33
+ action blah() {
34
+ either {} or {}
35
+ create(Class)
36
+ }
37
+ invariant exists(Class o)
38
+ ADSL
39
+ adsl_assert :incorrect, <<-ADSL
40
+ class Class{}
41
+ action blah() {
42
+ either {} or {}
43
+ create(Class)
44
+ }
45
+ invariant not exists(Class o)
46
+ ADSL
47
+ end
48
+
49
+ def test_either__may_delete_an_object
50
+ adsl_assert :incorrect, <<-ADSL
51
+ class Class{}
52
+ action blah() {
53
+ either {
54
+ delete allof(Class)
55
+ } or {}
56
+ }
57
+ invariant exists(Class o)
58
+ ADSL
59
+ end
60
+
61
+ def test_either__blank_is_noop
62
+ adsl_assert :incorrect, <<-ADSL
63
+ class Class{}
64
+ action blah() {
65
+ create(Class)
66
+ either {} or {} or {} or {}
67
+ }
68
+ invariant not exists(Class c)
69
+ ADSL
70
+ end
71
+
72
+ def test_either__may_delete_and_create_an_object
73
+ adsl_assert :incorrect, <<-ADSL
74
+ class Class{}
75
+ action blah() {
76
+ either {
77
+ delete allof(Class)
78
+ create(Class)
79
+ } or {}
80
+ }
81
+ invariant not exists(Class o)
82
+ ADSL
83
+ end
84
+
85
+ def test_either__branches_symmetrical
86
+ adsl_assert :incorrect, <<-ADSL
87
+ class Class{}
88
+ action blah() {
89
+ either {
90
+ delete allof(Class)
91
+ create(Class)
92
+ } or {}
93
+ }
94
+ invariant not exists(Class o)
95
+ ADSL
96
+ adsl_assert :incorrect, <<-ADSL
97
+ class Class{}
98
+ action blah() {
99
+ either {} or {
100
+ delete allof(Class)
101
+ create(Class)
102
+ }
103
+ }
104
+ invariant not exists(Class o)
105
+ ADSL
106
+ end
107
+
108
+ def test_either__false_dichotomy
109
+ adsl_assert :incorrect, <<-ADSL
110
+ class Class{}
111
+ action blah() {
112
+ either {
113
+ create(Class)
114
+ } or {
115
+ create(Class)
116
+ }
117
+ }
118
+ invariant not exists(Class o)
119
+ ADSL
120
+ adsl_assert :correct, <<-ADSL
121
+ class Class{}
122
+ action blah() {
123
+ either {
124
+ create(Class)
125
+ } or {
126
+ create(Class)
127
+ }
128
+ }
129
+ invariant exists(Class o)
130
+ ADSL
131
+ end
132
+
133
+ def test_either__multiple_options
134
+ adsl_assert :correct, <<-ADSL
135
+ class Class {}
136
+ action blah() {
137
+ either {} or {
138
+ delete allof(Class)
139
+ create(Class)
140
+ } or {
141
+ create(Class)
142
+ }
143
+ }
144
+ invariant exists(Class o)
145
+ ADSL
146
+ adsl_assert :incorrect, <<-ADSL
147
+ class Class {}
148
+ action blah() {
149
+ either {
150
+ create(Class)
151
+ } or {
152
+ delete allof(Class)
153
+ create(Class)
154
+ } or {
155
+ delete allof(Class)
156
+ }
157
+ }
158
+ invariant exists(Class o)
159
+ ADSL
160
+ end
161
+
162
+ def test_either__delete_and_create_an_object
163
+ adsl_assert :correct, <<-ADSL
164
+ class Class{}
165
+ action blah() {
166
+ either {
167
+ delete allof(Class)
168
+ create(Class)
169
+ } or {
170
+ delete allof(Class)
171
+ create(Class)
172
+ }
173
+ }
174
+ invariant forall(Class a, Class b: a == b)
175
+ ADSL
176
+ end
177
+
178
+ def test_either__variables
179
+ adsl_assert :incorrect, <<-ADSL
180
+ class Class{}
181
+ action blah() {
182
+ either {
183
+ a = create(Class)
184
+ delete a
185
+ } or {
186
+ create(Class)
187
+ }
188
+ }
189
+ invariant forall(Class a, Class b: a == b)
190
+ ADSL
191
+ adsl_assert :incorrect, <<-ADSL
192
+ class Class{}
193
+ action blah() {
194
+ a = create(Class)
195
+ either {
196
+ delete a
197
+ } or {
198
+ }
199
+ }
200
+ invariant not exists(Class a)
201
+ ADSL
202
+ end
203
+
204
+ def test_either__lambda
205
+ adsl_assert :incorrect, <<-ADSL
206
+ class Class{}
207
+ action blah() {
208
+ a = create(Class)
209
+ either {
210
+ } or {
211
+ delete a
212
+ }
213
+ }
214
+ invariant forall(Class a, Class b: a == b)
215
+ ADSL
216
+ adsl_assert :incorrect, <<-ADSL
217
+ class Class{}
218
+ action blah() {
219
+ a = create(Class)
220
+ either {
221
+ delete a
222
+ } or {
223
+ }
224
+ }
225
+ invariant forall(Class a, Class b: a == b)
226
+ ADSL
227
+ adsl_assert :correct, <<-ADSL
228
+ class Class{}
229
+ action blah() {
230
+ a = create(Class)
231
+ either {
232
+ delete a
233
+ } or {
234
+ delete a
235
+ }
236
+ }
237
+ invariant not exists(Class a)
238
+ ADSL
239
+ adsl_assert :correct, <<-ADSL
240
+ class Class{}
241
+ action blah() {
242
+ a = create(Class)
243
+ either {
244
+ delete a
245
+ } or {
246
+ delete a
247
+ }
248
+ }
249
+ invariant forall(Class a, Class b: a == b)
250
+ ADSL
251
+ adsl_assert :correct, <<-ADSL
252
+ class Class{}
253
+ action blah() {
254
+ a = allof(Class)
255
+ either {
256
+ a = create(Class)
257
+ } or {
258
+ a = create(Class)
259
+ a = oneof(allof(Class))
260
+ } or {
261
+ a = create(Class)
262
+ }
263
+ delete a
264
+ }
265
+ invariant forall(Class a, Class b: a == b)
266
+ ADSL
267
+ end
268
+
269
+ def test_for_each__no_contradictions
270
+ adsl_assert :incorrect, <<-ADSL, :conjecture => false
271
+ class Class{}
272
+ action blah() {
273
+ foreach c: allof(Class) {
274
+ }
275
+ }
276
+ ADSL
277
+ end
278
+
279
+ def test_for_each__no_contradictions_at_least_once
280
+ adsl_assert :incorrect, <<-ADSL, :conjecture => false
281
+ class Class{}
282
+ action blah() {
283
+ create(Class)
284
+ foreach c: allof(Class) {
285
+ }
286
+ }
287
+ ADSL
288
+ end
289
+
290
+ def test_for_each__no_iterations
291
+ adsl_assert :correct, <<-ADSL
292
+ class Class1{}
293
+ class Class2{}
294
+ action blah() {
295
+ create(Class1)
296
+ delete allof(Class2)
297
+ foreach i: allof(Class2) {
298
+ delete allof(Class1)
299
+ }
300
+ }
301
+ invariant exists(Class1 o)
302
+ ADSL
303
+ adsl_assert :correct, <<-ADSL
304
+ class Class1{}
305
+ class Class2{}
306
+ action blah() {
307
+ delete allof(Class2)
308
+ foreach i: allof(Class2) {
309
+ create(Class1)
310
+ }
311
+ }
312
+ invariant not exists(Class1 o)
313
+ ADSL
314
+ adsl_assert :incorrect, <<-ADSL
315
+ class Class1{}
316
+ class Class2{}
317
+ action blah() {
318
+ delete allof(Class1)
319
+ create(Class1)
320
+ delete allof(Class2)
321
+ foreach i: allof(Class2) {
322
+ delete allof(Class1)
323
+ }
324
+ }
325
+ invariant !exists(Class1 o)
326
+ ADSL
327
+ end
328
+
329
+ def test_for_each__single_iteration
330
+ adsl_assert :correct, <<-ADSL
331
+ class Class1{}
332
+ class Class2{}
333
+ action blah() {
334
+ delete allof(Class1)
335
+ delete allof(Class2)
336
+
337
+ create(Class1)
338
+ foreach c: allof(Class1) {
339
+ create(Class2)
340
+ }
341
+ }
342
+ invariant exists(Class1 a)
343
+ invariant exists(Class2 a)
344
+ invariant forall(Class2 a, Class2 b: a == b)
345
+ ADSL
346
+ adsl_assert :incorrect, <<-ADSL
347
+ class Class1 {}
348
+ class Class2 {}
349
+ action blah() {
350
+ delete allof(Class1)
351
+ delete allof(Class2)
352
+
353
+ create(Class1)
354
+ foreach c: allof(Class1) {
355
+ create(Class2)
356
+ }
357
+ }
358
+ invariant exists(Class2 a, Class2 b: not a == b)
359
+ ADSL
360
+ end
361
+
362
+ def test_for_each__two_iterations_parallelizable
363
+ adsl_assert :correct, <<-ADSL
364
+ class Class1{}
365
+ class Class2{}
366
+ action blah() {
367
+ delete allof(Class1)
368
+ delete allof(Class2)
369
+
370
+ create(Class1)
371
+ create(Class1)
372
+ foreach c: allof(Class1) {
373
+ create(Class2)
374
+ }
375
+ }
376
+ invariant exists(Class1 a)
377
+ invariant exists(Class2 a)
378
+ invariant forall(Class2 a, Class2 b, Class2 c: a == b or b == c or a == c)
379
+ ADSL
380
+ adsl_assert :incorrect, <<-ADSL
381
+ class Class1{}
382
+ class Class2{}
383
+ action blah() {
384
+ delete allof(Class1)
385
+ delete allof(Class2)
386
+
387
+ create(Class1)
388
+ create(Class1)
389
+ foreach c: allof(Class1) {
390
+ create(Class2)
391
+ }
392
+ }
393
+ invariant exists(Class2 a, Class2 b, Class2 c: !a == b and !b == c and !a == c)
394
+ ADSL
395
+ end
396
+
397
+ def test__single_ref
398
+ adsl_assert :correct, <<-ADSL
399
+ class Class { 0+ Class rel }
400
+ action blah() {
401
+ allof(Class).rel -= allof(Class)
402
+ foreach c: allof(Class) {
403
+ c2 = oneof(allof(Class))
404
+ c.rel += c2
405
+ }
406
+ }
407
+ invariant forall(Class o: not empty(o.rel))
408
+ ADSL
409
+ adsl_assert :correct, <<-ADSL
410
+ class Class { 0+ Class rel }
411
+ action blah() {
412
+ allof(Class).rel -= allof(Class)
413
+ foreach c: allof(Class) {
414
+ c2 = oneof(allof(Class))
415
+ c.rel += c2
416
+ }
417
+ }
418
+ invariant not exists(Class o, Class o2, Class o3: o2 in o.rel and o3 in o.rel and o2 != o3)
419
+ ADSL
420
+ end
421
+ end
@@ -0,0 +1,54 @@
1
+ require 'test/unit'
2
+ require 'adsl/ds/data_store_spec'
3
+ require 'pp'
4
+
5
+ class ADSL::DS::DataStoreSpecTest < Test::Unit::TestCase
6
+ def test_replace
7
+ assignment = ADSL::DS::DSAssignment.new :var => :kme, :objset => :objset
8
+ for_each = ADSL::DS::DSForEach.new :objset => :kme, :block => ADSL::DS::DSBlock.new
9
+ block = ADSL::DS::DSBlock.new :statements => [assignment, for_each]
10
+
11
+ assert block.replace(:kme, :replaced)
12
+ assert_false block.replace(:kme, :replaced)
13
+
14
+ assert_equal assignment, block.statements[0]
15
+ assert_equal for_each, block.statements[1]
16
+
17
+ assert_equal :replaced, assignment.var
18
+ assert_equal :replaced, for_each.objset
19
+ end
20
+
21
+ def test_replace__safe_against_recursion
22
+ block = ADSL::DS::DSBlock.new :statements => []
23
+ block.statements << block
24
+ assert_false block.replace :kme, :kme
25
+
26
+ block.statements << :kme
27
+
28
+ assert block.replace :kme, :replaced
29
+ assert_equal :replaced, block.statements.last
30
+ end
31
+
32
+ def test_class__superclass_of
33
+ parent = ADSL::DS::DSClass.new :name => 'parent'
34
+ child1 = ADSL::DS::DSClass.new :name => 'child1', :parent => parent
35
+ child2 = ADSL::DS::DSClass.new :name => 'child2', :parent => parent
36
+ grandchild = ADSL::DS::DSClass.new :name => 'grandchild', :parent => child1
37
+
38
+ assert parent.superclass_of? parent
39
+ assert parent.superclass_of? child1
40
+ assert parent.superclass_of? child2
41
+ assert parent.superclass_of? grandchild
42
+
43
+ assert !child1.superclass_of?(parent)
44
+ assert !child2.superclass_of?(parent)
45
+ assert !grandchild.superclass_of?(parent)
46
+
47
+ assert child1.superclass_of? child1
48
+ assert child1.superclass_of? grandchild
49
+ assert !child1.superclass_of?(child2)
50
+
51
+ assert !child2.superclass_of?(child1)
52
+ assert !child2.superclass_of?(grandchild)
53
+ end
54
+ end