xmlservice 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +19 -0
  3. data/README_IBM_i +62 -0
  4. data/lib/adapters/abstract_adapter.rb +82 -0
  5. data/lib/adapters/db2_adapter.rb +70 -0
  6. data/lib/adapters/rest_adapter.rb +32 -0
  7. data/lib/password/password.rb +229 -0
  8. data/lib/xmlservice.rb +2477 -0
  9. data/test/README_IBM_i +3 -0
  10. data/test/Rakefile +42 -0
  11. data/test/genpassword.rb +111 -0
  12. data/test/test_60000_toolkit_driver/Rakefile +11 -0
  13. data/test/test_60000_toolkit_driver/test_60010_DriverCallPgmZZCALL.rb +403 -0
  14. data/test/test_60000_toolkit_driver/test_60110_DriverCallSrvPgmZZARRAY.rb +149 -0
  15. data/test/test_60000_toolkit_driver/test_60310_DriverCMD.rb +77 -0
  16. data/test/test_60000_toolkit_driver/test_60510_DriverDataQueue.rb +126 -0
  17. data/test/test_60000_toolkit_driver/test_60610_DriverCallSrvPgmZZBINARY.rb +59 -0
  18. data/test/test_60000_toolkit_driver/test_60710_DriverSH.rb +73 -0
  19. data/test/test_60000_toolkit_driver/test_60910_DriverCallPgmZZMISS.rb +44 -0
  20. data/test/test_60000_toolkit_driver/test_65010_DriverCallDB2.rb +265 -0
  21. data/test/test_60000_toolkit_driver/zzassign.rb +66 -0
  22. data/test/test_60000_toolkit_driver/zzquick.rb +149 -0
  23. data/test/test_60000_toolkit_driver/zztestrest.rb +45 -0
  24. data/test/test_60000_toolkit_driver/zzthreadold.rb +78 -0
  25. data/test/test_70000_toolkit_testonly/Rakefile +11 -0
  26. data/test/test_70000_toolkit_testonly/test_70010_DriverCallPgmTestOnly.rb +270 -0
  27. data/test/test_80000_toolkit_dsl/Rakefile +11 -0
  28. data/test/test_80000_toolkit_dsl/test_80010_DSLCallPgmZZCALL.rb +162 -0
  29. data/test/test_80000_toolkit_dsl/test_80110_DSLCallSrvPgmZZARRAY.rb +150 -0
  30. data/test/test_authorization/README_IBM_i +15 -0
  31. data/test/test_authorization/auth.rb +101 -0
  32. data/test/test_authorization/key.yml +2 -0
  33. data/test/test_authorization/password.yml +3 -0
  34. data/test/test_authorization/xmlservice.yml +69 -0
  35. data/test/test_data/rowcol.rb +57 -0
  36. data/version.txt +1 -0
  37. metadata +92 -0
@@ -0,0 +1,150 @@
1
+ # File: test_80110_DSLCallSrvPgmZZARRAY.rb
2
+ require "../test_authorization/auth"
3
+ require "../test_data/rowcol"
4
+
5
+ # D ARRAYMAX c const(999)
6
+ # D dcRec_t ds qualified based(Template)
7
+ # D dcMyName 10A
8
+ # D dcMyJob 4096A
9
+ # D dcMyRank 10i 0
10
+ # D dcMyPay 12p 2
11
+ # *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12
+ # * zzarray: check return array aggregate
13
+ # *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
14
+ # P zzarray B export
15
+ # D zzarray PI likeds(dcRec_t) dim(ARRAYMAX)
16
+ # D myName 10A
17
+ # D myMax 10i 0
18
+ # D myCount 10i 0
19
+ class Test_80110_DSLCallSrvPgmZZARRAY < RowColUnitTest
20
+ # -------------------------------
21
+ # test functions (start with prefix test_)
22
+ # rake test -- Unit run alpha sort order
23
+ # run #1) test_0000_connect
24
+ # run #2) test_nnnn_xxx
25
+ # :
26
+ # run #n) test_9999_close
27
+ # -------------------------------
28
+
29
+ def test_0050_zzarray
30
+ count = 5
31
+ zzwho = 'Ranger'
32
+ zzarray = XMLService::I_SRVPGM.new("ZZSRV","ZZARRAY",$toolkit_test_lib,{'error'=>'on'})
33
+ zzarray.input_parms do
34
+ char "myName", 10
35
+ long "myMax"
36
+ long_enddo "myCount"
37
+ end
38
+ zzarray.return_parms do
39
+ struct_dou "dcRec_t", 999, "myCount" do
40
+ char "dcMyName", 10
41
+ char "dcMyJob", 4096
42
+ long "dcMyRank"
43
+ dec "dcMyPay", 12, 2
44
+ end
45
+ end
46
+
47
+ # set input variables for call
48
+ zzarray.input.PARM0.myName = 'Skippy'
49
+ zzarray.input.PARM1.myMax = 9
50
+ zzarray.input.PARM2.myCount= 0
51
+ puts "\n+++++++++ input normal ++++++++++++++++"
52
+ puts zzarray.to_xml
53
+ # verify
54
+ self.match_value(__method__,__LINE__,'myName' ,'Skippy' ,zzarray.input.PARM0.myName)
55
+ self.match_value(__method__,__LINE__,'myMax' ,9 ,zzarray.input.PARM1.myMax)
56
+ self.match_value(__method__,__LINE__,'myCount' ,0 ,zzarray.input.PARM2.myCount)
57
+
58
+
59
+ # set input variables for call
60
+ zzarray.input.myName = zzwho
61
+ zzarray.input.myMax = count
62
+ zzarray.input.myCount= 0
63
+ puts "\n+++++++++ input fewer ++++++++++++++++"
64
+ puts zzarray.to_xml
65
+ # verify
66
+ self.match_value(__method__,__LINE__,'myName' ,zzwho ,zzarray.input.PARM0.myName)
67
+ self.match_value(__method__,__LINE__,'myMax' ,count ,zzarray.input.PARM1.myMax)
68
+ self.match_value(__method__,__LINE__,'myCount' ,0 ,zzarray.input.PARM2.myCount)
69
+
70
+ # call IBM i
71
+ zzarray.call
72
+
73
+ # puts zzarray.inspect
74
+ puts "\n+++++++++ dump_inspect ++++++++++++++++"
75
+ puts zzarray.dump_inspect
76
+
77
+ # xmlservice error occurred?
78
+ rc = zzarray.xmlservice_error
79
+ if rc
80
+ puts zzcall.dump_error
81
+ self.match_value(__method__,__LINE__,'error' ,false,rc)
82
+ end
83
+
84
+ # output xml
85
+ puts "\n+++++++++ output xml ++++++++++++++++"
86
+ puts zzarray.out_xml
87
+
88
+
89
+ # output
90
+ puts "\n+++++++++ output ++++++++++++++++"
91
+ puts "#{zzarray.name}.#{zzarray.func}:\n"
92
+ puts " myName....#{zzarray.response.myName}\n"
93
+ puts " myMax.....#{zzarray.response.myMax}\n"
94
+ puts " myCount...#{zzarray.response.myCount}\n"
95
+ i = 0
96
+ zzarray.returndata.dcRec_t.each do |dcRec_t|
97
+ i += 1
98
+ puts "dcRec_t[#{i}]"
99
+ puts " Name...#{dcRec_t.dcMyName}"
100
+ puts " Job....#{dcRec_t.dcMyJob}"
101
+ puts " Rank...#{dcRec_t.dcMyRank}"
102
+ puts " Pay....#{dcRec_t.dcMyPay}"
103
+ end
104
+ # verify
105
+ self.match_value(__method__,__LINE__,'myName' ,zzwho ,zzarray.response.myName)
106
+ self.match_value(__method__,__LINE__,'myMax' ,count ,zzarray.response.myMax)
107
+ self.match_value(__method__,__LINE__,'myCount' ,count ,zzarray.response.myCount)
108
+ for i in 0..zzarray.returndata.dcRec_t.count-1
109
+ dcMyName = zzarray.response.myName.to_s + (i+1).to_s
110
+ dcMyJob = "Test " + (100 + i + 1).to_s
111
+ dcMyRank = 10 + i + 1
112
+ dcMyPay = 13.42 * (i+1)
113
+ self.match_value(__method__,__LINE__,'dcMyName' ,dcMyName ,zzarray.returndata.dcRec_t[i].dcMyName)
114
+ self.match_value(__method__,__LINE__,'dcMyJob' ,dcMyJob ,zzarray.returndata.dcRec_t[i].dcMyJob)
115
+ self.match_value(__method__,__LINE__,'dcMyRank' ,dcMyRank ,zzarray.returndata.dcRec_t[i].dcMyRank)
116
+ self.match_value(__method__,__LINE__,'dcMyPay' ,dcMyPay ,zzarray.returndata.dcRec_t[i].dcMyPay)
117
+ end
118
+
119
+ # output
120
+ puts "\n+++++++++ output long ++++++++++++++++"
121
+ puts "#{zzarray.name}.#{zzarray.func}:\n"
122
+ puts " myName....#{zzarray.response.PARM0.myName}\n"
123
+ puts " myMax.....#{zzarray.response.PARM1.myMax}\n"
124
+ puts " myCount...#{zzarray.response.PARM2.myCount}\n"
125
+ i = 0
126
+ zzarray.returndata.douaggr.dcRec_t.each do |dcRec_t|
127
+ i += 1
128
+ puts "dcRec_t[#{i}]"
129
+ puts " Name...#{dcRec_t.dcMyName}"
130
+ puts " Job....#{dcRec_t.dcMyJob}"
131
+ puts " Rank...#{dcRec_t.dcMyRank}"
132
+ puts " Pay....#{dcRec_t.dcMyPay}"
133
+ end
134
+ # verify
135
+ self.match_value(__method__,__LINE__,'myName' ,zzwho ,zzarray.response.PARM0.myName)
136
+ self.match_value(__method__,__LINE__,'myMax' ,count ,zzarray.response.PARM1.myMax)
137
+ self.match_value(__method__,__LINE__,'myCount' ,count ,zzarray.response.PARM2.myCount)
138
+ for i in 0..zzarray.returndata.douaggr.dcRec_t.count-1
139
+ dcMyName = zzarray.response.PARM0.myName.to_s + (i+1).to_s
140
+ dcMyJob = "Test " + (100 + i + 1).to_s
141
+ dcMyRank = 10 + i + 1
142
+ dcMyPay = 13.42 * (i+1)
143
+ self.match_value(__method__,__LINE__,'dcMyName' ,dcMyName ,zzarray.returndata.douaggr.dcRec_t[i].dcMyName)
144
+ self.match_value(__method__,__LINE__,'dcMyJob' ,dcMyJob ,zzarray.returndata.douaggr.dcRec_t[i].dcMyJob)
145
+ self.match_value(__method__,__LINE__,'dcMyRank' ,dcMyRank ,zzarray.returndata.douaggr.dcRec_t[i].dcMyRank)
146
+ self.match_value(__method__,__LINE__,'dcMyPay' ,dcMyPay ,zzarray.returndata.douaggr.dcRec_t[i].dcMyPay)
147
+ end
148
+ end
149
+
150
+ end
@@ -0,0 +1,15 @@
1
+ ===================
2
+ Encrypted passwords
3
+ ===================
4
+ cd xmlservice/test
5
+ > genpassword.rb
6
+ Syntax:
7
+ ruby genpassword.rb db user password [key]
8
+ db - *LOCAL (see WRKRDBDIRE)
9
+ user - user profile id
10
+ password - user profile password
11
+ Optional:"
12
+ key - pass key (generate if missing)
13
+ - /path/key.yml
14
+ - YIPS4321AAAAAAAAAAAAAAA132424245 (actual key)
15
+
@@ -0,0 +1,101 @@
1
+ require 'xmlservice'
2
+
3
+ # =================
4
+ # IBM i tests (see xmlservice/README_IBM_i)
5
+ # =================
6
+ $test_url = ENV['TEST_URL']
7
+ $test_db = ENV['TEST_DATABASE']
8
+ $test_user = ENV['TEST_USER']
9
+ $test_pwd = ENV['TEST_PWD']
10
+ $test_ctl = ENV['TEST_CTL']
11
+ $test_ipc = ENV['TEST_IPC']
12
+ $test_xmlservice = ENV['TEST_XMLSERVICE']
13
+ $test_lib = ENV['TEST_LIB']
14
+ if $test_url == nil
15
+ $test_url = "http://174.79.32.155/cgi-bin/xmlcgi.pgm"
16
+ end
17
+ if $test_db == nil
18
+ $test_db = "*LOCAL"
19
+ end
20
+ if $test_user == nil
21
+ $test_user = "*NONE"
22
+ end
23
+ if $test_pwd == nil
24
+ $test_pwd = "*NONE"
25
+ end
26
+ if $test_ctl == nil
27
+ $test_ctl = "*here"
28
+ end
29
+ if $test_ipc == nil
30
+ $test_ipc = "*na"
31
+ end
32
+ if $test_xmlservice == nil
33
+ $test_xmlservice = "XMLSERVICE"
34
+ end
35
+ if $test_lib == nil
36
+ $test_lib = "DB2"
37
+ end
38
+
39
+ # =================
40
+ # developer only yaml
41
+ # encrypt password tests
42
+ # =================
43
+ # $test_url = "yaml"
44
+ $test_env = ENV['TEST_ENV']
45
+ $test_yaml = ENV['TEST_YAML']
46
+ if $test_yaml == nil
47
+ $test_yaml = "../test_authorization/xmlservice.yml"
48
+ end
49
+ if $test_env == nil
50
+ $test_env = "db2public"
51
+ end
52
+
53
+
54
+ case $test_url
55
+ when "ibm_db"
56
+ # =================
57
+ # establish connection (DB2)
58
+ # =================
59
+ ActiveXMLService::Base.establish_connection(
60
+ :adapter => "ibm_db",
61
+ :connection => "ActiveRecord",
62
+ :database => $test_db,
63
+ :username => $test_user,
64
+ :password => $test_pwd,
65
+ :ctl => $test_ctl,
66
+ :ipc => $test_ipc,
67
+ :size => 15000000,
68
+ :head => "<?xml version='1.0'?>",
69
+ :test_i_lib => $test_xmlservice, # custom attributes (not xmlservice required)
70
+ :test_i_db2_lib => $test_lib # custom attributes (not xmlservice required)
71
+ )
72
+ when "yaml"
73
+ # =================
74
+ # establish connection (based on yaml)
75
+ # =================
76
+ ActiveXMLService::Base.establish_connection(
77
+ :test_yaml => $test_yaml,
78
+ :test_env => $test_env
79
+ )
80
+ else
81
+ # =================
82
+ # establish connection (REST)
83
+ # =================
84
+ ActiveXMLService::Base.establish_connection(
85
+ :connection => $test_url,
86
+ :database => $test_db,
87
+ :username => $test_user,
88
+ :password => $test_pwd,
89
+ :ctl => $test_ctl,
90
+ :ipc => $test_ipc,
91
+ :size => 15000000,
92
+ :head => "<?xml version='1.0'?>",
93
+ :test_i_lib => $test_xmlservice, # custom attributes (not xmlservice required)
94
+ :test_i_db2_lib => $test_lib # custom attributes (not xmlservice required)
95
+ )
96
+ end
97
+
98
+ # custom attributes (not xmlservice required)
99
+ $toolkit_test_lib = ActiveXMLService::Base.configurations[:test_i_lib];
100
+ $toolkit_test_db2_lib = ActiveXMLService::Base.configurations[:test_i_db2_lib];
101
+
@@ -0,0 +1,2 @@
1
+ pwd_key: "YIPS4321AAAAAAAAAAAAAAA132424245"
2
+
@@ -0,0 +1,3 @@
1
+ DB2:
2
+ pwd_enc: "YiYNfodSh5MGZVX7TXktEPSrnVlrAPjoyzzn48SdC/k=%0A"
3
+
@@ -0,0 +1,69 @@
1
+ # Profile DB2 (xmlcgi.pgm or ibm_db)
2
+ db2profile: &db2profile
3
+ # database: "LP0364D"
4
+ database: "*LOCAL"
5
+ username: DB2
6
+ #password: MYPWD
7
+ pwd_yaml: ../test_authorization/password.yml
8
+
9
+ # REST client to XMLSERVICE
10
+ xmlrest: &xmlrest
11
+ connection: "http://174.79.32.155/cgi-bin/xmlcgi.pgm"
12
+
13
+ # DB2 client to XMLSERVICE
14
+ xmldb2: &xmldb2
15
+ connection: "ActiveRecord"
16
+ adapter: ibm_db
17
+
18
+ # xmlservice common
19
+ xmlservicecommon: &xmlservicecommon
20
+ install: XMLSERVICE
21
+ size: 15000000
22
+ head: "<?xml version='1.0'?>"
23
+ test_i_lib: XMLSERVICE
24
+ test_i_db2_lib: DB2
25
+
26
+ # xmlservice state full private connection (yes XTOOLKIT job)
27
+ xmlserviceprivate: &xmlserviceprivate
28
+ ctl: "*sbmjob"
29
+ ipc: /tmp/ruby042
30
+
31
+ # xmlservice stateless public connection (no XTOOLKIT job)
32
+ xmlservicepublic: &xmlservicepublic
33
+ ctl: "*here"
34
+ ipc: "/none"
35
+
36
+ # ---------------------------------
37
+ # xmlservice using ibm_db
38
+ # ActiveXMLService::Base.establish_connection(
39
+ # :test_yaml => '/path/xmlservice.yml',
40
+ # :test_env => 'sqlpublic'
41
+ #)
42
+ db2private:
43
+ <<: *xmldb2
44
+ <<: *db2profile
45
+ <<: *xmlservicecommon
46
+ <<: *xmlserviceprivate
47
+ db2public:
48
+ <<: *xmldb2
49
+ <<: *db2profile
50
+ <<: *xmlservicecommon
51
+ <<: *xmlservicepublic
52
+
53
+ # ---------------------------------
54
+ # xmlservice using REST (xmlcgi.pgm)
55
+ # ActiveXMLService::Base.establish_connection(
56
+ # :test_yaml => '/path/xmlservice.yml',
57
+ # :test_env => 'restpublic'
58
+ #)
59
+ restprivate:
60
+ <<: *xmlrest
61
+ <<: *db2profile
62
+ <<: *xmlservicecommon
63
+ <<: *xmlserviceprivate
64
+ restpublic:
65
+ <<: *xmlrest
66
+ <<: *db2profile
67
+ <<: *xmlservicecommon
68
+ <<: *xmlservicepublic
69
+
@@ -0,0 +1,57 @@
1
+ # test data for various tables
2
+ require "../test_authorization/auth"
3
+ require "test/unit"
4
+
5
+ class RowColUnitTest < Test::Unit::TestCase
6
+ def match_hash(test,linenbr,text,a,b)
7
+ i = 0
8
+ a.each do |key, value|
9
+ if(b.has_key?(key))
10
+ self.match_value(test,linenbr,"#{text} => #{key}",a[key],b[key])
11
+ else
12
+ k1 = key
13
+ k2 = 'missing'
14
+ assert_match( k2, k1, "#{test}:#{linenbr} mismatch: #{text}[#{k1}] == #{text}[]")
15
+ end
16
+ end
17
+ end
18
+ def match_value(test,linenbr,text,a,b)
19
+ # float/real/decimal/string,
20
+ # you sir are a String/BigDecimal,
21
+ # therefore you must float yourself, etc. ...
22
+ # Ruby perfection be my name (Borg),
23
+ # perhaps yet another reason to use PHP
24
+ case a
25
+ when String
26
+ case b
27
+ when String
28
+ # ok
29
+ else
30
+ b = b.to_s()
31
+ end
32
+ when Integer
33
+ case b
34
+ when Integer
35
+ # ok
36
+ else
37
+ b = b.to_i()
38
+ end
39
+ when Float
40
+ case b
41
+ when Float
42
+ # ok
43
+ else
44
+ b = b.to_f()
45
+ end
46
+ else
47
+ end
48
+ # make a check
49
+ case a
50
+ when String
51
+ assert_match( a, b, "#{test}:#{linenbr} #{text} mismatch: #{a} == #{b}")
52
+ else
53
+ assert_equal( a, b, "#{test}:#{linenbr} #{text} mismatch: #{a} == #{b}")
54
+ end
55
+ end
56
+ end
57
+
@@ -0,0 +1 @@
1
+ 1.3.0 GA5-test
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xmlservice
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Tony Cairns
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Call IBM i PGM, SRVPGM, CMD, PASE
28
+ email: adc@us.ibm.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - LICENSE
34
+ - README_IBM_i
35
+ - lib/adapters/abstract_adapter.rb
36
+ - lib/adapters/db2_adapter.rb
37
+ - lib/adapters/rest_adapter.rb
38
+ - lib/password/password.rb
39
+ - lib/xmlservice.rb
40
+ - test/README_IBM_i
41
+ - test/Rakefile
42
+ - test/genpassword.rb
43
+ - test/test_60000_toolkit_driver/Rakefile
44
+ - test/test_60000_toolkit_driver/test_60010_DriverCallPgmZZCALL.rb
45
+ - test/test_60000_toolkit_driver/test_60110_DriverCallSrvPgmZZARRAY.rb
46
+ - test/test_60000_toolkit_driver/test_60310_DriverCMD.rb
47
+ - test/test_60000_toolkit_driver/test_60510_DriverDataQueue.rb
48
+ - test/test_60000_toolkit_driver/test_60610_DriverCallSrvPgmZZBINARY.rb
49
+ - test/test_60000_toolkit_driver/test_60710_DriverSH.rb
50
+ - test/test_60000_toolkit_driver/test_60910_DriverCallPgmZZMISS.rb
51
+ - test/test_60000_toolkit_driver/test_65010_DriverCallDB2.rb
52
+ - test/test_60000_toolkit_driver/zzassign.rb
53
+ - test/test_60000_toolkit_driver/zzquick.rb
54
+ - test/test_60000_toolkit_driver/zztestrest.rb
55
+ - test/test_60000_toolkit_driver/zzthreadold.rb
56
+ - test/test_70000_toolkit_testonly/Rakefile
57
+ - test/test_70000_toolkit_testonly/test_70010_DriverCallPgmTestOnly.rb
58
+ - test/test_80000_toolkit_dsl/Rakefile
59
+ - test/test_80000_toolkit_dsl/test_80010_DSLCallPgmZZCALL.rb
60
+ - test/test_80000_toolkit_dsl/test_80110_DSLCallSrvPgmZZARRAY.rb
61
+ - test/test_authorization/README_IBM_i
62
+ - test/test_authorization/auth.rb
63
+ - test/test_authorization/key.yml
64
+ - test/test_authorization/password.yml
65
+ - test/test_authorization/xmlservice.yml
66
+ - test/test_data/rowcol.rb
67
+ - version.txt
68
+ homepage: http://github.com/adc/xmlservice
69
+ licenses:
70
+ - BSD
71
+ metadata: {}
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 2.2.2
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: IBM i Access
92
+ test_files: []