activerecord-aurora-serverless-adapter 1.0.0 → 5.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -1
  3. data/Gemfile.lock +55 -63
  4. data/activerecord-aurora-serverless-adapter.gemspec +5 -2
  5. data/lib/active_record/connection_adapters/aurora_serverless/client.rb +25 -0
  6. data/lib/active_record/connection_adapters/aurora_serverless/mysql2.rb +13 -14
  7. data/lib/active_record/connection_adapters/aurora_serverless/mysql2/client.rb +4 -0
  8. data/lib/active_record/connection_adapters/aurora_serverless/version.rb +1 -1
  9. data/test/aasa_helper.rb +163 -0
  10. data/test/aurora-serverless/bin/aurora-serverless.ts +17 -0
  11. data/test/aurora-serverless/cdk.context.json +3 -0
  12. data/test/aurora-serverless/cdk.json +3 -0
  13. data/test/aurora-serverless/lib/aurora-serverless-stack.ts +194 -0
  14. data/test/aurora-serverless/package-lock.json +6485 -0
  15. data/test/aurora-serverless/package.json +21 -0
  16. data/test/aurora-serverless/tsconfig.json +23 -0
  17. data/test/bin/_deploy-aurora +8 -0
  18. data/test/bin/_wakeup +17 -0
  19. data/test/bin/deploy-aurora +8 -0
  20. data/test/bin/wakeup +8 -0
  21. data/test/cases/aasa/mysql_client_test.rb +59 -0
  22. data/test/cases/aasa/mysql_result_test.rb +63 -0
  23. data/test/cases/aasa/mysql_types_test.rb +135 -0
  24. data/test/cases/coerced_tests.rb +151 -0
  25. data/test/config.yml +20 -0
  26. data/test/support/aasa_coerceable.rb +53 -0
  27. data/test/support/aasa_env.rb +11 -0
  28. data/test/support/aasa_fixtures.rb +9 -0
  29. data/test/support/aasa_minitest.rb +39 -0
  30. data/test/support/aasa_mysqlpatch.rb +8 -0
  31. data/test/support/aasa_paths.rb +47 -0
  32. data/test/support/aasa_rake.rb +102 -0
  33. metadata +43 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d55e3b914364d41374c560c6183e7def09de56c9d3e90a9cba15bac946c10353
4
- data.tar.gz: 5266a9a3be80080fbdfe5b24a85611251ac2724994f3883066e6b2c045845168
3
+ metadata.gz: 60b59ea21f9e813832a9b157fd65ae5d9d686afb0f04c51700cd5664eeb2edcd
4
+ data.tar.gz: 6555d62f42ccb9c421382353f5fa14990c456a2d3555437b03965a3ed0d3d97d
5
5
  SHA512:
6
- metadata.gz: 347d5f9690887b426f7d290295c92ee402ed2a8d808097f2e796e46bcbf3bc201c133a531a1b7a20e8e3790fed4859d191fa1f1be6a25a7ca16a519ddb8dc34b
7
- data.tar.gz: 30192a0925ad931dd541da411a9817ac5c58d86c2f9d7c5c2ef70cf9117f3cb9cca39664946c03eafb2ea2fe03324bc56abad3c9cfa6882bec2b6b30a306e1d0
6
+ metadata.gz: 4271e26bc9ad5f0a8de508b30914cd39d7d870e45c5985a6857ec1881fcc2c6ff6b23a38d1c611c9beba607a658cabd4723b8d45140afd365121a0d992f9b762
7
+ data.tar.gz: 4cc64d2e19eff3da7f7fdc5d939f90a40c952cfdaf72fd6168b3fd7280fec7aa409038707c6c691da3522a29c49dc313f0949e5f01b6fb21b43d3fe491bb9e2a
data/Gemfile CHANGED
@@ -2,7 +2,7 @@ source "https://rubygems.org"
2
2
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
3
  gemspec
4
4
 
5
- ENV['RAILS_VERSION'] = '6.0.2.1'
5
+ ENV['RAILS_VERSION'] = '5.2.4.1'
6
6
 
7
7
  # This allows us to bundle to Rails via Git to get the ActiveRecord test files
8
8
  # which comes down to a git tag. We can also use the `RAILS_VERSION` env variable
@@ -28,3 +28,5 @@ version = ENV['RAILS_VERSION'] || begin
28
28
  end
29
29
  end
30
30
  gem 'rails', github: "rails/rails", tag: "v#{version}"
31
+ gem 'mocha', '1.9.0', require: false
32
+ gem 'bcrypt'
data/Gemfile.lock CHANGED
@@ -1,91 +1,76 @@
1
1
  GIT
2
2
  remote: https://github.com/rails/rails
3
- revision: 3a6e8a3ff94f8690dcd68d5184600eabc9e05664
4
- tag: v6.0.2.1
3
+ revision: 56f45bedd617a76e8e3596c84c872a37c8be9795
4
+ tag: v5.2.4.1
5
5
  specs:
6
- actioncable (6.0.2.1)
7
- actionpack (= 6.0.2.1)
6
+ actioncable (5.2.4.1)
7
+ actionpack (= 5.2.4.1)
8
8
  nio4r (~> 2.0)
9
9
  websocket-driver (>= 0.6.1)
10
- actionmailbox (6.0.2.1)
11
- actionpack (= 6.0.2.1)
12
- activejob (= 6.0.2.1)
13
- activerecord (= 6.0.2.1)
14
- activestorage (= 6.0.2.1)
15
- activesupport (= 6.0.2.1)
16
- mail (>= 2.7.1)
17
- actionmailer (6.0.2.1)
18
- actionpack (= 6.0.2.1)
19
- actionview (= 6.0.2.1)
20
- activejob (= 6.0.2.1)
10
+ actionmailer (5.2.4.1)
11
+ actionpack (= 5.2.4.1)
12
+ actionview (= 5.2.4.1)
13
+ activejob (= 5.2.4.1)
21
14
  mail (~> 2.5, >= 2.5.4)
22
15
  rails-dom-testing (~> 2.0)
23
- actionpack (6.0.2.1)
24
- actionview (= 6.0.2.1)
25
- activesupport (= 6.0.2.1)
16
+ actionpack (5.2.4.1)
17
+ actionview (= 5.2.4.1)
18
+ activesupport (= 5.2.4.1)
26
19
  rack (~> 2.0, >= 2.0.8)
27
20
  rack-test (>= 0.6.3)
28
21
  rails-dom-testing (~> 2.0)
29
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
30
- actiontext (6.0.2.1)
31
- actionpack (= 6.0.2.1)
32
- activerecord (= 6.0.2.1)
33
- activestorage (= 6.0.2.1)
34
- activesupport (= 6.0.2.1)
35
- nokogiri (>= 1.8.5)
36
- actionview (6.0.2.1)
37
- activesupport (= 6.0.2.1)
22
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
23
+ actionview (5.2.4.1)
24
+ activesupport (= 5.2.4.1)
38
25
  builder (~> 3.1)
39
26
  erubi (~> 1.4)
40
27
  rails-dom-testing (~> 2.0)
41
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
42
- activejob (6.0.2.1)
43
- activesupport (= 6.0.2.1)
28
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
29
+ activejob (5.2.4.1)
30
+ activesupport (= 5.2.4.1)
44
31
  globalid (>= 0.3.6)
45
- activemodel (6.0.2.1)
46
- activesupport (= 6.0.2.1)
47
- activerecord (6.0.2.1)
48
- activemodel (= 6.0.2.1)
49
- activesupport (= 6.0.2.1)
50
- activestorage (6.0.2.1)
51
- actionpack (= 6.0.2.1)
52
- activejob (= 6.0.2.1)
53
- activerecord (= 6.0.2.1)
32
+ activemodel (5.2.4.1)
33
+ activesupport (= 5.2.4.1)
34
+ activerecord (5.2.4.1)
35
+ activemodel (= 5.2.4.1)
36
+ activesupport (= 5.2.4.1)
37
+ arel (>= 9.0)
38
+ activestorage (5.2.4.1)
39
+ actionpack (= 5.2.4.1)
40
+ activerecord (= 5.2.4.1)
54
41
  marcel (~> 0.3.1)
55
- activesupport (6.0.2.1)
42
+ activesupport (5.2.4.1)
56
43
  concurrent-ruby (~> 1.0, >= 1.0.2)
57
44
  i18n (>= 0.7, < 2)
58
45
  minitest (~> 5.1)
59
46
  tzinfo (~> 1.1)
60
- zeitwerk (~> 2.2)
61
- rails (6.0.2.1)
62
- actioncable (= 6.0.2.1)
63
- actionmailbox (= 6.0.2.1)
64
- actionmailer (= 6.0.2.1)
65
- actionpack (= 6.0.2.1)
66
- actiontext (= 6.0.2.1)
67
- actionview (= 6.0.2.1)
68
- activejob (= 6.0.2.1)
69
- activemodel (= 6.0.2.1)
70
- activerecord (= 6.0.2.1)
71
- activestorage (= 6.0.2.1)
72
- activesupport (= 6.0.2.1)
47
+ rails (5.2.4.1)
48
+ actioncable (= 5.2.4.1)
49
+ actionmailer (= 5.2.4.1)
50
+ actionpack (= 5.2.4.1)
51
+ actionview (= 5.2.4.1)
52
+ activejob (= 5.2.4.1)
53
+ activemodel (= 5.2.4.1)
54
+ activerecord (= 5.2.4.1)
55
+ activestorage (= 5.2.4.1)
56
+ activesupport (= 5.2.4.1)
73
57
  bundler (>= 1.3.0)
74
- railties (= 6.0.2.1)
58
+ railties (= 5.2.4.1)
75
59
  sprockets-rails (>= 2.0.0)
76
- railties (6.0.2.1)
77
- actionpack (= 6.0.2.1)
78
- activesupport (= 6.0.2.1)
60
+ railties (5.2.4.1)
61
+ actionpack (= 5.2.4.1)
62
+ activesupport (= 5.2.4.1)
79
63
  method_source
80
64
  rake (>= 0.8.7)
81
- thor (>= 0.20.3, < 2.0)
65
+ thor (>= 0.19.0, < 2.0)
82
66
 
83
67
  PATH
84
68
  remote: .
85
69
  specs:
86
- activerecord-aurora-serverless-adapter (1.0.0)
87
- activerecord (>= 6.0)
70
+ activerecord-aurora-serverless-adapter (5.2.2)
71
+ activerecord (~> 5.2.0)
88
72
  aws-sdk-rdsdataservice
73
+ retriable
89
74
 
90
75
  GEM
91
76
  remote: https://rubygems.org/
@@ -95,9 +80,10 @@ GEM
95
80
  bundler
96
81
  rake
97
82
  thor (>= 0.14.0)
83
+ arel (9.0.0)
98
84
  aws-eventstream (1.0.3)
99
- aws-partitions (1.260.0)
100
- aws-sdk-core (3.86.0)
85
+ aws-partitions (1.265.0)
86
+ aws-sdk-core (3.89.1)
101
87
  aws-eventstream (~> 1.0, >= 1.0.2)
102
88
  aws-partitions (~> 1, >= 1.239.0)
103
89
  aws-sigv4 (~> 1.1)
@@ -107,6 +93,7 @@ GEM
107
93
  aws-sigv4 (~> 1.1)
108
94
  aws-sigv4 (1.1.0)
109
95
  aws-eventstream (~> 1.0, >= 1.0.2)
96
+ bcrypt (3.1.13)
110
97
  builder (3.2.4)
111
98
  coderay (1.1.2)
112
99
  concurrent-ruby (1.1.5)
@@ -125,6 +112,7 @@ GEM
125
112
  mini_mime (>= 0.1.1)
126
113
  marcel (0.3.3)
127
114
  mimemagic (~> 0.3.2)
115
+ metaclass (0.0.4)
128
116
  method_source (0.9.2)
129
117
  mimemagic (0.3.3)
130
118
  mini_mime (1.0.2)
@@ -137,6 +125,8 @@ GEM
137
125
  ruby-progressbar
138
126
  minitest-retry (0.1.9)
139
127
  minitest (>= 5.0)
128
+ mocha (1.9.0)
129
+ metaclass (~> 0.0.1)
140
130
  nio4r (2.5.2)
141
131
  nokogiri (1.10.7)
142
132
  mini_portile2 (~> 2.4.0)
@@ -152,6 +142,7 @@ GEM
152
142
  rails-html-sanitizer (1.3.0)
153
143
  loofah (~> 2.3)
154
144
  rake (13.0.1)
145
+ retriable (3.1.2)
155
146
  ruby-progressbar (1.10.1)
156
147
  sprockets (4.0.0)
157
148
  concurrent-ruby (~> 1.0)
@@ -168,7 +159,6 @@ GEM
168
159
  websocket-driver (0.7.1)
169
160
  websocket-extensions (>= 0.1.0)
170
161
  websocket-extensions (0.1.4)
171
- zeitwerk (2.2.2)
172
162
 
173
163
  PLATFORMS
174
164
  ruby
@@ -176,10 +166,12 @@ PLATFORMS
176
166
  DEPENDENCIES
177
167
  activerecord-aurora-serverless-adapter!
178
168
  appraisal
169
+ bcrypt
179
170
  dotenv
180
171
  minitest
181
172
  minitest-reporters
182
173
  minitest-retry
174
+ mocha (= 1.9.0)
183
175
  pry
184
176
  rails!
185
177
  rake
@@ -12,13 +12,16 @@ Gem::Specification.new do |spec|
12
12
  spec.homepage = 'https://github.com/customink/activerecord-aurora-serverless-adapter'
13
13
  spec.license = 'MIT'
14
14
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
15
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
15
+ `git ls-files -z`.split("\x0").reject do |f|
16
+ f.match(%r{^(test|spec|features|docker)/i})
17
+ end
16
18
  end
17
19
  spec.bindir = 'exe'
18
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
21
  spec.require_paths = ['lib']
20
- spec.add_runtime_dependency 'activerecord', '>= 6.0'
22
+ spec.add_runtime_dependency 'activerecord', '~> 5.2.0'
21
23
  spec.add_runtime_dependency 'aws-sdk-rdsdataservice'
24
+ spec.add_runtime_dependency 'retriable'
22
25
  spec.add_development_dependency 'appraisal'
23
26
  spec.add_development_dependency 'dotenv'
24
27
  spec.add_development_dependency 'minitest'
@@ -23,6 +23,14 @@ module ActiveRecord
23
23
  "#<#{self.class} database: #{database.inspect}, raw_client: #{raw_client.inspect}>"
24
24
  end
25
25
 
26
+ def execute_statement_retry(sql)
27
+ if @connected
28
+ execute_statement(sql)
29
+ else
30
+ auto_paused_retry { execute_statement(sql) }
31
+ end
32
+ end
33
+
26
34
  def execute_statement(sql)
27
35
  id = @transactions.first
28
36
  debug_transactions "EXECUTE: #{sql}", id
@@ -34,6 +42,7 @@ module ActiveRecord
34
42
  include_result_metadata: true,
35
43
  transaction_id: id
36
44
  }).tap do |r|
45
+ @connected = true
37
46
  @affected_rows = affected_rows_result(r)
38
47
  @last_id = last_id_result(r)
39
48
  end
@@ -100,6 +109,22 @@ module ActiveRecord
100
109
  field.long_value || field.string_value || field.double_value
101
110
  end
102
111
 
112
+ def auto_paused_retry
113
+ error_klass = Aws::RDSDataService::Errors::BadRequestException
114
+ error_msg = /last packet sent successfully to the server was/
115
+ retry_msg = 'Aurora auto paused, retrying...'
116
+ on_retry = Proc.new { sleep(1) ; ::Rails.logger.info(retry_msg) }
117
+ Retriable.retriable({
118
+ on: { error_klass => error_msg },
119
+ on_retry: on_retry,
120
+ tries: auto_paused_retry_count
121
+ }) { yield }
122
+ end
123
+
124
+ def auto_paused_retry_count
125
+ 10
126
+ end
127
+
103
128
  def debug_transactions(name, id = 'NOID')
104
129
  return unless @debug_transactions
105
130
  ActiveRecord::Base.logger.debug " \e[36m#{name} #{id} #{object_id}\e[0m"
@@ -33,33 +33,32 @@ module ActiveRecord
33
33
 
34
34
  # Abstract Mysql Adapter
35
35
 
36
- def translate_exception(exception, message:, sql:, binds:)
37
- msg = exception.message
38
- case msg
36
+ def translate_exception(exception, message)
37
+ case message
39
38
  when /Duplicate entry/
40
- RecordNotUnique.new(msg, sql: sql, binds: binds)
39
+ RecordNotUnique.new(message)
41
40
  when /foreign key constraint fails/
42
- InvalidForeignKey.new(msg, sql: sql, binds: binds)
41
+ InvalidForeignKey.new(message)
43
42
  when /Cannot add foreign key constraint/,
44
43
  /referenced column .* in foreign key constraint .* are incompatible/
45
- mismatched_foreign_key(msg, sql: sql, binds: binds)
44
+ mismatched_foreign_key(message)
46
45
  when /Data too long for column/
47
- ValueTooLong.new(msg, sql: sql, binds: binds)
46
+ ValueTooLong.new(message)
48
47
  when /Out of range value for column/
49
- RangeError.new(msg, sql: sql, binds: binds)
48
+ RangeError.new(message)
50
49
  when /Column .* cannot be null/,
51
50
  /Field .* doesn't have a default value/
52
- NotNullViolation.new(msg, sql: sql, binds: binds)
51
+ NotNullViolation.new(message)
53
52
  when /Deadlock found when trying to get lock/
54
- Deadlocked.new(msg, sql: sql, binds: binds)
53
+ Deadlocked.new(message)
55
54
  when /Lock wait timeout exceeded/
56
- LockWaitTimeout.new(msg, sql: sql, binds: binds)
55
+ LockWaitTimeout.new(message)
57
56
  when /max_statement_time exceeded/, /Sort aborted/
58
- StatementTimeout.new(msg, sql: sql, binds: binds)
57
+ StatementTimeout.new(message)
59
58
  when /Query execution was interrupted/
60
- QueryCanceled.new(msg, sql: sql, binds: binds)
59
+ QueryCanceled.new(message)
61
60
  else
62
- ActiveRecord::StatementInvalid.new(msg, sql: sql, binds: binds)
61
+ ActiveRecord::StatementInvalid.new(message)
63
62
  end
64
63
  end
65
64
 
@@ -63,6 +63,10 @@ module ActiveRecord
63
63
  nil
64
64
  end
65
65
 
66
+ def more_results?
67
+ false
68
+ end
69
+
66
70
  end
67
71
  end
68
72
  AuroraServerless::Client.include AuroraServerless::Mysql2::Client
@@ -1,7 +1,7 @@
1
1
  module ActiveRecord
2
2
  module ConnectionAdapters
3
3
  module AuroraServerless
4
- VERSION = "1.0.0"
4
+ VERSION = "5.2.2"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,163 @@
1
+ ENV['AASA_ENV'] = 'test'
2
+ require 'bundler/setup'
3
+ Bundler.require :default, :development
4
+ Dotenv.load('.env')
5
+ require 'minitest/spec'
6
+ require 'minitest/autorun'
7
+ require 'minitest/retry'
8
+ require 'minitest/reporters'
9
+ require_relative 'support/aasa_mysqlpatch'
10
+ require 'cases/helper' unless ENV['TEST_FILES'] || ENV['ONLY_AASA']
11
+ require_relative 'support/aasa_coerceable'
12
+ require_relative 'support/aasa_env'
13
+ require_relative 'support/aasa_fixtures'
14
+ require_relative 'support/aasa_minitest'
15
+ Rails.backtrace_cleaner.remove_silencers! if ENV['REMOVE_SILENCERS']
16
+
17
+ module ActiveRecord
18
+ module ConnectionAdapters
19
+ module AuroraServerless
20
+ class TestCase < Minitest::Spec
21
+
22
+ before { setup_table }
23
+ after { drop_table }
24
+
25
+ private
26
+
27
+ def client
28
+ @client ||= AuroraServerless::Client.new(
29
+ 'activerecord_unittest',
30
+ ENV['AASA_RESOURCE_ARN'],
31
+ ENV['AASA_SECRET_ARN']
32
+ )
33
+ end
34
+
35
+ def execute(sql)
36
+ r = client.execute_statement(sql)
37
+ # TODO: [PG] Make this a conditional result wrapper.
38
+ AuroraServerless::Mysql2::Result.new(r)
39
+ end
40
+
41
+ def setup_table
42
+ # TODO: [PG] Make this a conditional for constant SQL.
43
+ execute MYSQL_CREATE_TABLE_SQL
44
+ execute MYSQL_INSERT_SQL
45
+ end
46
+
47
+ def drop_table
48
+ execute 'DROP TABLE IF EXISTS aurora_test'
49
+ end
50
+
51
+ MYSQL_CREATE_TABLE_SQL = %[
52
+ CREATE TABLE IF NOT EXISTS aurora_test (
53
+ id int NOT NULL AUTO_INCREMENT,
54
+ PRIMARY KEY (id),
55
+ null_test VARCHAR(10),
56
+ bit_test BIT,
57
+ tiny_int_test TINYINT,
58
+ small_int_test SMALLINT,
59
+ medium_int_test MEDIUMINT,
60
+ int_test INT,
61
+ big_int_test BIGINT,
62
+ float_test FLOAT(10,3),
63
+ float_zero_test FLOAT(10,3),
64
+ double_test DOUBLE(10,3),
65
+ decimal_test DECIMAL(10,3),
66
+ decimal_zero_test DECIMAL(10,3),
67
+ date_test DATE,
68
+ date_time_test DATETIME,
69
+ timestamp_test TIMESTAMP,
70
+ time_test TIME,
71
+ year_test YEAR(4),
72
+ char_test CHAR(10),
73
+ varchar_test VARCHAR(10),
74
+ binary_test BINARY(10),
75
+ varbinary_test VARBINARY(10),
76
+ tiny_blob_test TINYBLOB,
77
+ tiny_text_test TINYTEXT,
78
+ blob_test BLOB,
79
+ text_test TEXT,
80
+ medium_blob_test MEDIUMBLOB,
81
+ medium_text_test MEDIUMTEXT,
82
+ long_blob_test LONGBLOB,
83
+ long_text_test LONGTEXT,
84
+ enum_test ENUM('val1', 'val2'),
85
+ set_test SET('val1', 'val2')
86
+ ) DEFAULT CHARSET=utf8
87
+ ]
88
+
89
+ MYSQL_INSERT_SQL = %[
90
+ INSERT INTO aurora_test (
91
+ null_test,
92
+ bit_test,
93
+ tiny_int_test,
94
+ small_int_test,
95
+ medium_int_test,
96
+ int_test,
97
+ big_int_test,
98
+ float_test,
99
+ float_zero_test,
100
+ double_test,
101
+ decimal_test,
102
+ decimal_zero_test,
103
+ date_test,
104
+ date_time_test,
105
+ timestamp_test,
106
+ time_test,
107
+ year_test,
108
+ char_test,
109
+ varchar_test,
110
+ binary_test,
111
+ varbinary_test,
112
+ tiny_blob_test,
113
+ tiny_text_test,
114
+ blob_test,
115
+ text_test,
116
+ medium_blob_test,
117
+ medium_text_test,
118
+ long_blob_test,
119
+ long_text_test,
120
+ enum_test,
121
+ set_test
122
+ )
123
+ VALUES (
124
+ NULL,
125
+ 1,
126
+ 5,
127
+ 32766,
128
+ 8388606,
129
+ 2147483646,
130
+ 9223372036854775806,
131
+ 156.68449197860963,
132
+ 0.0,
133
+ 606682.8877005348,
134
+ 676254.5454545454,
135
+ 0,
136
+ '2010-4-4',
137
+ '2010-4-4 11:44:00',
138
+ '2010-4-4 11:44:00',
139
+ '11:44:00',
140
+ 2019,
141
+ 'abcdefg',
142
+ 'abcdefg',
143
+ 'abcdefg',
144
+ 'abcdefg',
145
+ 'abcdefg',
146
+ 'abcdefg',
147
+ 'abcdefg',
148
+ 'abcdefg',
149
+ 'abcdefg',
150
+ 'abcdefg',
151
+ 'abcdefg',
152
+ 'abcdefg',
153
+ 'val1',
154
+ 'val1,val2'
155
+ )
156
+ ]
157
+
158
+ end
159
+ end
160
+ end
161
+ end
162
+
163
+ require "mocha/setup"