tla-trace-arch 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9881430239c5bc604dcd31251f5d3d4f77f5cc50
4
+ data.tar.gz: 6ec39a64cbf83df55b596fd361cd477676a72cb9
5
+ SHA512:
6
+ metadata.gz: f48c2e3b8ae5dddb60c2c1cda737d396c6333976929130d094347c9d6e47c3c17a0c1399b24eb5771b7bb092849e150ce7c10192b7e8355e3de8e860a70f3684
7
+ data.tar.gz: 5241e5d5ba18f984fba05eecdf1953dc8b104f25520051000cf7a3c93e3375815aebf2dd7316a7421b320730e5a376b1b03abeea9d4c956a00130fa6823dfc11
@@ -0,0 +1,158 @@
1
+ * =tla-trace-arch= - Create a self extracting archive for Sbuilder API trace
2
+
3
+ A set of [[https://mustache.github.io/mustache.5.html][mustache]] templates extending [[https://github.com/jarjuk/tla-trace-filter][tla-trace-filter]] -tool to create
4
+ a self extracting achieve for API traces generated, when [[http://research.microsoft.com/en-us/um/people/lamport/tla/tools.html][model
5
+ checking]] formal models created by [[https://github.com/jarjuk/tla-sbuilder][Sbuilder]] -tool.
6
+
7
+ ** Use case
8
+
9
+ Formal models, built using [[https://github.com/jarjuk/tla-sbuilder][tla-sbuilder]], and model checked using
10
+ [[http://research.microsoft.com/en-us/um/people/lamport/tla/tools.html][TLA+tools]], can generate /API Traces/, which represent end-to-end
11
+ scenarios executing across system services in the formal model. An API
12
+ Trace is composed of steps, with each step giving 1) a (formal) system
13
+ state before the API call, 2) the API call exercised together with
14
+ (formal model) value bindings of request parameters, 3) API response
15
+ returned, and 4) the (formal) system state after the API call. An API
16
+ Trace can be mapped to /Unit Tests/ on implementation with each Unit
17
+ Test corresponding a step in the API Trace. After executing each of
18
+ the individual Unit Tests, the aggregate result can be interpreted as
19
+ an execution of a "virtual" System Test - considerably easier than
20
+ managing the execution a System Test as a single unit.
21
+
22
+ The purpose of =tla-trace-arch= GEM is create a self extracting
23
+ archive, which can be safely distributed to system service developers
24
+ for extracting API Trace Steps to create unit tests for the service
25
+ being developed by the developer.
26
+
27
+ ** Features
28
+
29
+
30
+ - Archive meta data
31
+ - [X] SHA1 hash to guarantee achieve integrity
32
+ - [X] Archive creation time stamp, hostname and userid
33
+ - [ ] Name of property generating API Trace
34
+ - Archive content for each Api Trace Step
35
+ - [X] Before state
36
+ - [X] Name of interface operation and parameter values
37
+ - [X] Return values and return status
38
+ - [X] After state
39
+ - Archive commands
40
+ - [X] Help
41
+ - [X] List steps
42
+ - [X] Extract by step number
43
+ - [X] Extract by interface name
44
+ - Archive options
45
+ - [X] Define target directory for achieve extract
46
+ - Extension points
47
+ - [X] Control content of Api Trace Step elements per interface name
48
+
49
+
50
+ *Notice*: Unchecked boxes have not yet been implemented.
51
+
52
+ Ref also [[https://cucumber.io/][Cucumber]] tests in directory [[./features][features]].
53
+
54
+ ** Installation
55
+
56
+ Create GEM file with the content
57
+
58
+ #+BEGIN_SRC ruby :eval no :exports code
59
+ source "https://rubygems.org"
60
+ gem "tla-trace-arch"
61
+ #+END_SRC
62
+
63
+ and run
64
+
65
+ #+BEGIN_SRC sh :eval no :results output
66
+ bundle install
67
+ #+END_SRC
68
+
69
+ ** Usage
70
+
71
+ =tla-trace-filter= uses TLA+tools model checker log output and a YAML
72
+ file mapping model checker log output to application interfaces.
73
+
74
+ For example, generating a formal model using =sbuilder= for =setup1=
75
+ with the command
76
+
77
+ #+name: sbuilder-gen
78
+ #+BEGIN_SRC sh :eval no :results output :exports code
79
+ bundle exec sbuilder.rb generate setup1
80
+ #+END_SRC
81
+
82
+ creates a YAML file =gen/$SETUP/tla/interfaces.yaml=, which allows
83
+ =tla-trace-filter= to map model checker log output to application
84
+ interfaces.
85
+
86
+ Using the commands below to model check the formal model, generated by
87
+ sbuilder, creates a file =gen/$SETUP/tlc.out=.
88
+
89
+ #+BEGIN_SRC sh :eval no :results output :exports code
90
+ (SETUP=setup1;export TLATOOLS_JAR=$(pwd)/java/tla2tools.jar; cd gen/$SETUP/tla && java -cp $TLATOOLS_JAR pcal.trans model)
91
+ (SETUP=setup1;export TLATOOLS_JAR=$(pwd)/java/tla2tools.jar; cd gen/$SETUP/tla && java -cp $TLATOOLS_JAR tlc2.TLC possible_bank_executed | tee ../tlc.out )
92
+ #+END_SRC
93
+
94
+ If the model checker finds a violation of property, it outputs a trace
95
+ of states leading to state violating the property. API calls leading
96
+ to the error state can be inspected with the command
97
+
98
+ #+BEGIN_SRC sh :eval no :results output :exports both
99
+ export SETUP=setup1; bundle exec tla-trace-filter.rb api-calls $SETUP --src-dir . --solc-line
100
+ #+END_SRC
101
+
102
+ and an self extracting archive created with the command:
103
+
104
+ #+name: api-arch
105
+ #+BEGIN_SRC sh :eval no :results output
106
+ export SETUP=setup1; bundle exec tla-trace-filter.rb api-calls $SETUP --src-dir . --solc-line --mustache tla-trace-arch | tee arch.sh
107
+ chmod +x arch.sh
108
+ #+END_SRC
109
+
110
+ To show instructions for using the archive run
111
+
112
+ #+name: exe-arch
113
+ #+Begin_SRC sh :eval no :results output :exports both
114
+ ./arch.sh
115
+ #+END_SRC
116
+
117
+ and observe
118
+
119
+ #+RESULTS: exe-arch
120
+ #+begin_example
121
+
122
+ Self extracting archive created on 2017-12-27 10:05:15 by jj@horsti
123
+
124
+ $ usage
125
+ ./arch.sh [options] cmd
126
+
127
+ cmd:
128
+ - step STEP : extract files for STEP#
129
+ - interface INTERFACE : extract files for INTERFACE
130
+ - list [INTERFACE] : list steps matching INTERFACE, all if not given
131
+
132
+ options:
133
+ --dir DIR | -d DIR : extract into directory DIR=tmp
134
+ --help : output this message
135
+ --awk-debug : output debug message from awk extract
136
+
137
+ Notice 1: STEP and INTERFACE parameters are treated as regexps,
138
+ and regexp special characters must be escaped with backslash
139
+ character.
140
+
141
+ Notice 2: Backslash characters must also be escaped. In effect,
142
+ use double backslash characters for escaping.
143
+
144
+
145
+ #+end_example
146
+
147
+ For a complete example, starting with installation of sbuilder- tool
148
+ and with creating a formal model, refer [[./test-trace.org][test-trace.org]].
149
+
150
+ ** Extension point =api-call-init=
151
+
152
+ These templates work with [[https://github.com/jarjuk/tla-trace-filter#api-call-init-extension-point][api-call-init extension point]] allowing to
153
+ create interface specific archive content.
154
+
155
+ ** License
156
+
157
+ MIT
158
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,10 @@
1
+ {{!
2
+
3
+ api-call-after-state-post.mustache: Override this template to change wrapping around api-calls
4
+
5
+ }}__END_OF_AFTER_STATE__
6
+ {{!
7
+ Local Variables:
8
+ require-final-newline: nil
9
+ End:
10
+ }}
@@ -0,0 +1,10 @@
1
+ {{!
2
+
3
+ api-call-after-state-pre.mustache: Override this template to change wrapping around api-calls
4
+
5
+ }}__START_OF_AFTER_STATE__
6
+ {{!
7
+ Local Variables:
8
+ require-final-newline: nil
9
+ End:
10
+ }}
@@ -0,0 +1,10 @@
1
+ {{!
2
+
3
+ api-call-before-state-post.mustache: Override this template to change wrapping around api-calls
4
+
5
+ }}__END_OF_BEFORE_STATE__
6
+ {{!
7
+ Local Variables:
8
+ require-final-newline: nil
9
+ End:
10
+ }}
@@ -0,0 +1,10 @@
1
+ {{!
2
+
3
+ api-call-before-state-pre.mustache: Override this template to change wrapping around api-calls
4
+
5
+ }}__START_OF_BEFORE_STATE__
6
+ {{!
7
+ Local Variables:
8
+ require-final-newline: nil
9
+ End:
10
+ }}
@@ -0,0 +1,10 @@
1
+ {{!
2
+
3
+ api-call-call-post.mustache: this template to change wrapping around api-calls
4
+
5
+ }}__END_OF_STEP_API_CALL__
6
+ {{!
7
+ Local Variables:
8
+ require-final-newline: nil
9
+ End:
10
+ }}
@@ -0,0 +1,10 @@
1
+ {{!
2
+
3
+ api-call-call-pre.mustache: Override this template to change wrapping around api-calls
4
+
5
+ }}__START_OF_STEP_API_CALL__
6
+ {{!
7
+ Local Variables:
8
+ require-final-newline: nil
9
+ End:
10
+ }}
@@ -0,0 +1,7 @@
1
+ {{!
2
+ api-call-header.mustache : output header for step, override to change
3
+ }}{{!
4
+ Local Variables:
5
+ require-final-newline: nil
6
+ End:
7
+ }}
@@ -0,0 +1,33 @@
1
+ {{!
2
+
3
+ Override api-call-init.mustache in tla-trace-filter GEM
4
+
5
+ }}
6
+ {{#API_BEFORE_STATE_INIT}}
7
+ default: arch-demo-beforeState
8
+ {{/API_BEFORE_STATE_INIT}}{{!
9
+
10
+ Configure templates to render API CALL
11
+
12
+ }}{{#API_CALL_INIT}}
13
+ default: arch-demo-api_input
14
+ {{/API_CALL_INIT}}{{!
15
+
16
+ Configure templates to render API_RETURN
17
+
18
+ }}{{#API_RETURN_INIT}}
19
+ default: arch-demo-api_return
20
+ {{/API_RETURN_INIT}}{{!
21
+
22
+ Configure templates to render state after API call
23
+
24
+ }}{{#API_AFTER_STATE_INIT}}
25
+ default: arch-demo-afterState
26
+ {{/API_AFTER_STATE_INIT}}{{!
27
+
28
+ Do not output new-line
29
+
30
+ Local Variables:
31
+ require-final-newline: nil
32
+ End:
33
+ }}
@@ -0,0 +1,9 @@
1
+ {{!
2
+
3
+ api-call-link.mustache: Override this template to change link output
4
+
5
+ }}{{!
6
+ Local Variables:
7
+ require-final-newline: nil
8
+ End:
9
+ }}
@@ -0,0 +1,7 @@
1
+ {{!
2
+
3
+ api-call-post.mustache: Override this template to change wrapping around api-calls
4
+
5
+ }}__END_OF_PAY_LOAD__
6
+ {{{sha1.inspect}}}
7
+ {{{sha1.hexdigest}}}
@@ -0,0 +1,13 @@
1
+ {{!
2
+
3
+ api-call-pre.mustache: Override this template to change wrapping around api-calls
4
+
5
+ }}{{!
6
+
7
+ Self extracting archieve starts with script
8
+
9
+ }}{{>arch-call-script}}{{!
10
+ Local Variables:
11
+ require-final-newline: nil
12
+ End:
13
+ }}
@@ -0,0 +1,10 @@
1
+ {{!
2
+
3
+ api-call-ret-post.mustache: Override this template to change wrapping around api-calls
4
+
5
+ }}__END_OF_STEP_API_RETURN__
6
+ {{!
7
+ Local Variables:
8
+ require-final-newline: nil
9
+ End:
10
+ }}
@@ -0,0 +1,10 @@
1
+ {{!
2
+
3
+ api-call-ret-pre.mustache: Override this template to change wrapping around api-calls
4
+
5
+ }}__START_OF_STEP_API_RETURN__
6
+ {{!
7
+ Local Variables:
8
+ require-final-newline: nil
9
+ End:
10
+ }}
@@ -0,0 +1,11 @@
1
+ {{!
2
+
3
+ api-call-step-post.mustache: Override this template to change wrapping around api-calls
4
+
5
+ }}
6
+ __END_OF_STEP__
7
+ {{!
8
+ Local Variables:
9
+ require-final-newline: nil
10
+ End:
11
+ }}
@@ -0,0 +1,16 @@
1
+ {{!
2
+
3
+ api-call-step-pre.mustache: Override this template to change wrapping around api-calls
4
+ Line __START_OF_STEP__ used to trigger extraction
5
+ Fields names extracted: now, interface, interface-implementation
6
+ Fields names must be followed by '=' -charecter
7
+ Fields value must be followed by '\t' TAB -charecter
8
+
9
+
10
+ }}__START_OF_STEP__ now={{now}} interface={{interface.interface_operation}} interface-implementation={{interface.implementation}}
11
+ jsust one lihe in st step {{now}} {{interface.interface_operation}}
12
+ {{!
13
+ Local Variables:
14
+ require-final-newline: nil
15
+ End:
16
+ }}
@@ -0,0 +1,268 @@
1
+ {{!
2
+
3
+ arch-call-script.mustache: self extracting stcript
4
+
5
+
6
+ }}
7
+ #!/bin/bash
8
+
9
+ echo ""
10
+ echo "Self extracting archive created on {{META.timestamp}} by {{META.user}}@{{META.hostname}}"
11
+ echo ""
12
+
13
+ # functions
14
+ usage() {
15
+ echo $ usage
16
+
17
+ cat <<EOF
18
+ $0 [options] cmd
19
+
20
+ cmd:
21
+ - step STEP : extract files for STEP#
22
+ - interface INTERFACE : extract files for INTERFACE
23
+ - list [INTERFACE] : list steps matching INTERFACE, all if not given
24
+
25
+ options:
26
+ --dir DIR | -d DIR : extract into directory DIR=$EXTRACT_DIR
27
+ --help : output this message
28
+ --awk-debug : output debug message from awk extract
29
+
30
+ Notice 1: STEP and INTERFACE parameters are treated as regexps,
31
+ and regexp special characters must be escaped with backslash
32
+ character.
33
+
34
+ Notice 2: Backslash characters must also be escaped. In effect,
35
+ use double backslash characters for escaping.
36
+
37
+
38
+ EOF
39
+ exit 1
40
+ }
41
+
42
+ # Validate SHA1 between lines 1-'endOfArchive' of 'file' equals 'sha1Archive'
43
+ checkSha1() {
44
+ local file=$1; shift
45
+ local endOfArchive=$1; shift
46
+ local sha1Archive=$1; shift
47
+
48
+ local sha1Calculated=$(cat $file | sed "1,$endOfArchive!d" | sha1sum | cut -f1 -d' ' )
49
+
50
+ echo ".. Checking SHA1 of $file" >&2
51
+ if [ "$sha1Archive" != "$sha1Calculated" ]; then
52
+ echo "SHA1 sum calculated '$sha1Calculated' does not match SHA1 in archive '$sha1Archive' - archive corrupted - exiting" >&2
53
+ exit 1
54
+ fi
55
+ echo ".. Archive SHA1 ok" >&2
56
+ }
57
+
58
+ # Extract 'step' or for steps for 'interface' from 'file' into files
59
+ # 'extractFileName' in 'extract_dir' where file name given by
60
+ extract() {
61
+
62
+ local cmd=$1; shift
63
+ local file=$1; shift
64
+ local step=$1; shift
65
+ local interface=$1; shift
66
+ local sha1Archive=$1; shift
67
+
68
+ if [ ! -d $EXTRACT_DIR ]; then
69
+ cat <<EOF >&2
70
+ Incorrect extraction directory=$EXTRACT_DIR - exiting
71
+
72
+ Hint: set directory using --dir option
73
+ EOF
74
+ exit 1
75
+ fi
76
+
77
+
78
+
79
+ echo ".. $cmd step=$step, interface=$interface" >&2
80
+ awk -v cmd=$cmd -v sha1Archive=$sha1Archive -v extract_dir=$EXTRACT_DIR -v awk_debug=$AWK_DEBUG -v step=$step -v interface=$interface '
81
+ function dbg( msg ){
82
+ if ( length( awk_debug) > 0 ) {
83
+ print msg
84
+ }
85
+ }
86
+ function escape_pattern(pat, safe) {
87
+ safe = pat
88
+ gsub(/[][^$.*?+{}\\()|]/, "\\\\&", safe)
89
+ return safe
90
+ }
91
+ # @return [String] name of of file where to extract
92
+ function extractFileName( dir, prefix ) {
93
+ # current_step using 3 digits
94
+ return dir "/" sprintf("%03d", current_step) "-" prefix "-" current_interface_implementation "-" sha1Archive
95
+ }
96
+ BEGIN {
97
+ extract_file=""
98
+ dbg( "starting step" step )
99
+ # step_start identify steps to work upon
100
+ step_start="^__START_OF_STEP__"
101
+ if ( length(interface) == 0 ) {
102
+ step_start= step_start ".*now=" step
103
+ }
104
+ else {
105
+ # step_start= step_start ".*interface=" escape_pattern(interface,interface)
106
+ step_start= step_start ".*interface=" interface
107
+ }
108
+ dbg( "step_start=" step_start " for interface=" interface )
109
+ # identify rules
110
+ step_end="^__END_OF_STEP__"
111
+ beforeState_start="^__START_OF_BEFORE_STATE__"
112
+ beforeState_end="^__END_OF_BEFORE_STATE__"
113
+ api_call_start="^__START_OF_STEP_API_CALL__"
114
+ api_call_end="^__END_OF_STEP_API_CALL__"
115
+ api_return_start="^__START_OF_STEP_API_RETURN__"
116
+ api_return_end="^__END_OF_STEP_API_RETURN__"
117
+ afterState_start="^__START_OF_AFTER_STATE__"
118
+ afterState_end="^__END_OF_AFTER_STATE__"
119
+ in_step=0
120
+ }
121
+ # activate step
122
+ match( $0, step_start) {
123
+ dbg( "step starteted" $0 )
124
+ in_step=1
125
+ # extract fields from Start of step line
126
+ match( $0, /now=([^\t]+)/, parsed )
127
+ current_step = parsed[1]
128
+ match( $0, /interface=([^\t]+)/, parsed )
129
+ current_interface = parsed[1]
130
+ match( $0, /interface-implementation=([^\t]+)/, parsed )
131
+ current_interface_implementation = parsed[1]
132
+ # step_start line consumed read next line
133
+ print "Step " current_step " interface " current_interface >"/dev/stderr"
134
+ next # getline
135
+ }
136
+ match( $0, step_end) {
137
+ in_step=0
138
+ }
139
+ # choose extract file
140
+ in_step && match( $0, beforeState_start ) {
141
+ extract_file = extractFileName( extract_dir, "01-inp" )
142
+ print "" > extract_file
143
+ dbg( "in_step && beforeState_start:" $0 ", extract_file=" extract_file)
144
+ next # getline
145
+ }
146
+ in_step && match( $0, api_call_start ) {
147
+ extract_file = extractFileName( extract_dir, "02-api" )
148
+ print "" > extract_file
149
+ dbg( "in_step && api_call_start:" $0 ", extract_file=" extract_file )
150
+ next # getline
151
+ }
152
+ in_step && match( $0, api_return_start ) {
153
+ extract_file = extractFileName( extract_dir, "03-ret" )
154
+ print "" > extract_file
155
+ dbg( "in_step && api_return_start:" $0 ", extract_file=" extract_file )
156
+ next # getline
157
+ }
158
+ in_step && match( $0, afterState_start ) {
159
+ extract_file = extractFileName( extract_dir, "04-out" )
160
+ print "" > extract_file
161
+ dbg( "in_step && afterState_start:" $0 ", extract_file=" extract_file )
162
+ next # getline
163
+ }
164
+ # quit extracting
165
+ length(extract_file) > 0 && match( $0, beforeState_end ) {
166
+ extract_file=""
167
+ dbg( "in_step && beforeState_end:" $0 )
168
+ next # getline
169
+ }
170
+ length(extract_file) > 0 && match( $0, api_call_end ) {
171
+ extract_file=""
172
+ dbg( "in_step && api_call_end:" $0 )
173
+ next # getline
174
+ }
175
+ length(extract_file) > 0 && match( $0, api_return_end ) {
176
+ extract_file=""
177
+ dbg( "in_step && api_return_end:" $0 )
178
+ next # getline
179
+ }
180
+ length(extract_file) > 0 && match( $0, afterState_end ) {
181
+ extract_file=""
182
+ dbg( "in_step && afterState_end:" $0 )
183
+ next # getline
184
+ }
185
+ # extract?
186
+ cmd != "list" && length(extract_file) > 0 {
187
+ print $0 >> extract_file
188
+ }
189
+ # done
190
+ END {
191
+ dbg( "end" )
192
+ }
193
+
194
+ ' $file
195
+ }
196
+
197
+ # Default options
198
+ A_VERSION=1.0.0
199
+ AWK_DEBUG=""
200
+ EXTRACT_DIR="."
201
+ # Option
202
+
203
+ while true
204
+ do
205
+ case "$1" in
206
+ --version | -v)
207
+ echo Archive version $A_VERSION
208
+ exit 0
209
+ ;;
210
+ --awk-debug)
211
+ AWK_DEBUG=1
212
+ shift
213
+ ;;
214
+ --dir | -d )
215
+ shift
216
+ EXTRACT_DIR=$1
217
+ shift
218
+ ;;
219
+ --debug)
220
+ set -x
221
+ shift
222
+ ;;
223
+ -h | --help)
224
+ usage
225
+ ;;
226
+ *)
227
+ break
228
+ ;;
229
+ esac
230
+ done
231
+
232
+
233
+
234
+ # Extract
235
+ # ARCHIVE_START=$(awk '/^__START_OF_PAY_LOAD__/ {print NR + 1; exit 0; }' $0)
236
+ ARCHIVE_END=$(awk '/^__END_OF_PAY_LOAD__/ {print NR -1; exit 0; }' $0)
237
+ SHA1_ARCHIVE=$(tail -1 $0)
238
+
239
+ checkSha1 $0 $ARCHIVE_END $SHA1_ARCHIVE
240
+
241
+ case "$1" in
242
+
243
+ step)
244
+ shift
245
+ extract step $0 "$1" "" $SHA1_ARCHIVE
246
+ shift
247
+ ;;
248
+
249
+ list)
250
+ shift
251
+ P1=$1; shift
252
+ extract list $0 "" "$P1" $SHA1_ARCHIVE
253
+ ;;
254
+
255
+ interface)
256
+ shift
257
+ extract interface $0 "" "$1" $SHA1_ARCHIVE
258
+ shift
259
+ ;;
260
+
261
+ *)
262
+ usage
263
+ ;;
264
+ esac
265
+
266
+
267
+ exit 0
268
+ __START_OF_PAY_LOAD__
@@ -0,0 +1,7 @@
1
+ now: {{{outputState.now.to_yaml}}}
2
+ eth_address: {{{outputState.eth_address.to_yaml}}}
3
+ {{!
4
+ Local Variables:
5
+ require-final-newline: nil
6
+ End:
7
+ }}
@@ -0,0 +1,6 @@
1
+ input: {{{api_input}}}
2
+ {{!
3
+ Local Variables:
4
+ require-final-newline: nil
5
+ End:
6
+ }}
@@ -0,0 +1,6 @@
1
+ {{{api_return}}}
2
+ {{!
3
+ Local Variables:
4
+ require-final-newline: nil
5
+ End:
6
+ }}
@@ -0,0 +1,9 @@
1
+ now: {{{beforeState.now}}}
2
+ eth_address: {{{beforeState.eth_accounts.to_a}}}
3
+ eth_storageRoot: {{{beforeState.eth_storageRoot.to_a}}}
4
+ eth_addressPool: {{{beforeState.eth_addressPool.to_a}}}
5
+ {{!
6
+ Local Variables:
7
+ require-final-newline: nil
8
+ End:
9
+ }}
@@ -0,0 +1,64 @@
1
+ # -*- encoding: utf-8; mode: ruby -*-
2
+
3
+ lib = File.expand_path('../lib/', __FILE__)
4
+ $:.unshift lib unless $:.include?(lib)
5
+
6
+
7
+ # http://guides.rubygems.org/make-your-own-gem/
8
+
9
+ Gem::Specification.new do |s|
10
+
11
+ # version = "0.0.1.pre"
12
+ version = File.open( "VERSION", "r" ) { |f| f.read }.strip.gsub( "-SNAPSHOT", ".pre" )
13
+
14
+ s.name = 'tla-trace-arch'
15
+ s.version = version
16
+ s.date = Time.now.strftime( "%Y-%m-%d" ) #'2014-09-10'
17
+ s.summary = "Mustache templates to create self extracing archieve for Sbuilder API-trace"
18
+ s.description =
19
+ <<EOF
20
+
21
+ A set of [mustache] templates extending [tla-trace-filter] -tool
22
+ to create a self extracting achieve for API traces generated, when
23
+ model checking formal models created by [tla-Sbuilder] -tool.
24
+
25
+ Use case:
26
+
27
+ Formal models, built using [tla-sbuilder], and model checked using
28
+ [TLA+tools]], can generate /API Traces/, which represent
29
+ end-to-end scenarios executing across system services in the
30
+ formal model. An API Trace is composed of steps, with each step
31
+ giving 1) a (formal) system state before the API call, 2) the API
32
+ call exercised together with (formal model) value bindings of
33
+ request parameters, 3) API response returned, and 4) the (formal)
34
+ system state after the API call. A API Trace can be mapped to
35
+ /Unit Tests/ on implementation with each Unit Test corresponding a
36
+ step in the API Trace. After executing each of the individual Unit
37
+ Tests, the aggregate result can be interpreted as an execution of
38
+ a "virtual" System Test - considerably easier than managing the
39
+ execution a System Test as a single unit.
40
+
41
+ The purpose of =tla-trace-arch= GEM is create a self extracting
42
+ archive, which can be safely distributed to system service
43
+ developers for extracting API Trace Steps to create unit tests for
44
+ the service being developed by the developer.
45
+
46
+
47
+ Ref:
48
+ - https://github.com/jarjuk/tla-trace-filter
49
+ - https://mustache.github.io/mustache.5.html
50
+ - https://github.com/jarjuk/tla-sbuilder
51
+ - http://research.microsoft.com/en-us/um/people/lamport/tla/tools.html
52
+ EOF
53
+
54
+ s.authors = ["jarjuk"]
55
+ s.files = ["README.org", "VERSION", "#{s.name}.gemspec" ] | Dir.glob("mustache/**/*")
56
+ s.require_paths = [ "lib" ]
57
+ # s.executables = [ "tla-trace-filter.rb" ]
58
+ s.license = 'MIT'
59
+
60
+ s.required_ruby_version = '~> 2', ">=2.3"
61
+
62
+ s.add_runtime_dependency 'tla-trace-filter', '~>0.0', ">=0.0.4"
63
+
64
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tla-trace-arch
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - jarjuk
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-01-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: tla-trace-filter
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.0.4
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.0.4
33
+ description: "\n A set of [mustache] templates extending [tla-trace-filter] -tool\n
34
+ \ to create a self extracting achieve for API traces generated, when\n model
35
+ checking formal models created by [tla-Sbuilder] -tool.\n\n Use case:\n\n Formal
36
+ models, built using [tla-sbuilder], and model checked using\n [TLA+tools]], can
37
+ generate /API Traces/, which represent\n end-to-end scenarios executing across
38
+ system services in the\n formal model. An API Trace is composed of steps, with
39
+ each step\n giving 1) a (formal) system state before the API call, 2) the API\n
40
+ \ call exercised together with (formal model) value bindings of\n request parameters,
41
+ 3) API response returned, and 4) the (formal)\n system state after the API call.
42
+ \ A API Trace can be mapped to\n /Unit Tests/ on implementation with each Unit
43
+ Test corresponding a\n step in the API Trace. After executing each of the individual
44
+ Unit\n Tests, the aggregate result can be interpreted as an execution of\n a
45
+ \"virtual\" System Test - considerably easier than managing the\n execution a
46
+ System Test as a single unit.\n\n The purpose of =tla-trace-arch= GEM is create
47
+ a self extracting\n archive, which can be safely distributed to system service\n
48
+ \ developers for extracting API Trace Steps to create unit tests for\n the
49
+ service being developed by the developer.\n \n\n Ref: \n - https://github.com/jarjuk/tla-trace-filter\n
50
+ \ - https://mustache.github.io/mustache.5.html\n - https://github.com/jarjuk/tla-sbuilder\n
51
+ \ - http://research.microsoft.com/en-us/um/people/lamport/tla/tools.html\n"
52
+ email:
53
+ executables: []
54
+ extensions: []
55
+ extra_rdoc_files: []
56
+ files:
57
+ - README.org
58
+ - VERSION
59
+ - mustache/api-call-after-state-post.mustache
60
+ - mustache/api-call-after-state-pre.mustache
61
+ - mustache/api-call-before-state-post.mustache
62
+ - mustache/api-call-before-state-pre.mustache
63
+ - mustache/api-call-call-post.mustache
64
+ - mustache/api-call-call-pre.mustache
65
+ - mustache/api-call-header.mustache
66
+ - mustache/api-call-init.mustache
67
+ - mustache/api-call-link.mustache
68
+ - mustache/api-call-post.mustache
69
+ - mustache/api-call-pre.mustache
70
+ - mustache/api-call-ret-post.mustache
71
+ - mustache/api-call-ret-pre.mustache
72
+ - mustache/api-call-step-post.mustache
73
+ - mustache/api-call-step-pre.mustache
74
+ - mustache/arch-call-script.mustache
75
+ - mustache/arch-demo-afterState.mustache
76
+ - mustache/arch-demo-api_input.mustache
77
+ - mustache/arch-demo-api_return.mustache
78
+ - mustache/arch-demo-beforeState.mustache
79
+ - tla-trace-arch.gemspec
80
+ homepage:
81
+ licenses:
82
+ - MIT
83
+ metadata: {}
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - "~>"
91
+ - !ruby/object:Gem::Version
92
+ version: '2'
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '2.3'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 2.6.14
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Mustache templates to create self extracing archieve for Sbuilder API-trace
107
+ test_files: []