em_aws 0.3.2 → 1.0.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.
@@ -1,35 +1,36 @@
1
1
  require 'spec_helper'
2
- require 'aws'
3
2
  describe Mutex do
4
- it "should be a fiber safe mutex" do
3
+ around(:each) do |example|
5
4
  EM.synchrony do
6
- AWS::Mutex.new.should be_kind_of(EM::Synchrony::Thread::Mutex)
5
+ example.run
7
6
  EM.stop
8
7
  end
9
8
  end
10
9
 
11
10
  it "should be a fiber safe mutex" do
12
- EM.synchrony do
13
- AWS.mutex.new.should be_kind_of(EM::Synchrony::Thread::Mutex)
14
- EM.stop
15
- end
11
+ expect(AWS::Mutex.new).to be_kind_of(EM::Synchrony::Thread::Mutex)
12
+ end
13
+
14
+ it "should be a fiber safe mutex" do
15
+ expect(AWS.mutex.new).to be_kind_of(EM::Synchrony::Thread::Mutex)
16
16
  end
17
17
 
18
18
  it "should not affect Mutex outside AWS" do
19
- Mutex.new.should be_kind_of(Mutex)
19
+ expect(Mutex.new).to be_kind_of(Mutex)
20
20
  end
21
21
  end
22
22
 
23
23
  describe Kernel, '#sleep' do
24
+
24
25
  it "should be a fiber safe sleep from with AWS module" do
25
26
  EM.synchrony do
26
27
  EM::Synchrony.stub(:sleep).and_return("fiber safe")
27
- Kernel.sleep(1).should eql("fiber safe")
28
+ expect(Kernel.sleep(1)).to eql("fiber safe")
28
29
  EM.stop
29
30
  end
30
31
  end
31
32
 
32
33
  it "should not affect normal Kernel.sleep if not in EM" do
33
- Kernel.sleep(1).should eql(1)
34
+ expect(Kernel.sleep(1)).to eql(1)
34
35
  end
35
36
  end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+ require 'aws-sdk-v1'
3
+ require 'aws/core/http/em_http_handler'
4
+
5
+ describe AWS::DynamoDB do
6
+ if ENV['AWS_ACCESS_KEY_ID'] && ENV['AWS_SECRET_ACCESS_KEY']
7
+
8
+ around(:each) do |example|
9
+ EM.synchrony do
10
+ example.run
11
+ EM.stop
12
+ end
13
+ end
14
+
15
+ it "should work" do
16
+ begin
17
+ AWS.config( :http_handler => AWS::Http::EMHttpHandler.new(:pool_size => 20))
18
+ dynamo_db = AWS::DynamoDB.new
19
+ dynamo_db.tables['mytable'].delete if dynamo_db.tables['mytable'].exists?
20
+
21
+ # Create table
22
+ dynamo_db.tables.create('mytable', 10, 5) unless dynamo_db.tables['mytable'].exists?
23
+ table = dynamo_db.tables['mytable']
24
+
25
+ sleep 1 while table.status == :creating
26
+
27
+ expect(table).to be_exists
28
+
29
+ # Concurrent writes
30
+ fibers = []
31
+ 5.times.each do |i|
32
+ fiber = Fiber.new do
33
+ table.batch_put([{ :id => "id#{i}"}])
34
+ end
35
+ fiber.resume
36
+ fibers << fiber
37
+ end
38
+
39
+ # Wait until work is done
40
+ while fibers.detect(&:alive?)
41
+ EM::Synchrony.sleep(0.01)
42
+ end
43
+
44
+ # Read our results
45
+ items = %w(id0 id1 id2 id3 id4)
46
+ expect(table.batch_get('id',items).to_a.collect{ |h| h['id']}.sort).to eql(['id0','id1','id2','id3','id4'])
47
+ ensure
48
+ table.delete if table && table.status != :deleting && table.exists? #clean up
49
+ end
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+ require 'aws-sdk-v1'
3
+ require 'aws/core/http/em_http_handler'
4
+
5
+ describe AWS::S3 do
6
+ if ENV['AWS_ACCESS_KEY_ID'] && ENV['AWS_SECRET_ACCESS_KEY']
7
+
8
+ around(:each) do |example|
9
+ EM.synchrony do
10
+ example.run
11
+ EM.stop
12
+ end
13
+ end
14
+
15
+ it "should work" do
16
+ begin
17
+ AWS.config( :http_handler => AWS::Http::EMHttpHandler.new )
18
+ s3 = AWS::S3.new
19
+
20
+ # Create bucket
21
+ s3.buckets.create('em_test_bucket')
22
+ bucket = s3.buckets['em_test_bucket']
23
+ expect(bucket).to be_exists
24
+
25
+ # Concurrent writes
26
+ filler = '1'*1048576
27
+
28
+ fibers = []
29
+ 5.times.each do |i|
30
+ fiber = Fiber.new do
31
+ bucket.objects["test#{i}"].write(filler)
32
+ end
33
+ fiber.resume
34
+ fibers << fiber
35
+ end
36
+
37
+ # Wait until work is done
38
+ while fibers.detect(&:alive?)
39
+ EM::Synchrony.sleep(0.01)
40
+ end
41
+
42
+ # Streaming/Read
43
+ streamed = []
44
+ bucket.objects["test1"].read do |chunk|
45
+ streamed << chunk
46
+ end
47
+ expect(streamed.length).to be > 1 # make sure streaming took place
48
+ expect(streamed.join).to eql(filler)
49
+ ensure
50
+ bucket.delete! if bucket # clean up
51
+ end
52
+ end
53
+ end
54
+
55
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,11 +1,14 @@
1
1
  #$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  #$LOAD_PATH.unshift(File.dirname(__FILE__))
3
- require 'em_aws'
4
- require 'aws/core/http/em_http_handler'
3
+ require 'em-aws'
5
4
  require 'rspec'
6
5
  require 'bundler/setup'
7
6
  require 'logger'
8
- require 'em-http'
7
+
8
+ begin
9
+ require 'byebug'
10
+ rescue LoadError
11
+ end
9
12
 
10
13
  # Requires supporting files with custom matchers and macros, etc,
11
14
  # in ./support/ and its subdirectories.
@@ -15,7 +18,13 @@ class StubLogger
15
18
  #we don't care
16
19
  end
17
20
  end
21
+
22
+
18
23
  AWS.config(:logger => StubLogger.new)
19
24
 
25
+ # EM::HotTub.logger = Logger.new(STDOUT)
26
+ # EM::HotTub.trace = true
27
+
20
28
  RSpec.configure do |config|
29
+
21
30
  end
metadata CHANGED
@@ -1,121 +1,138 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em_aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
5
- prerelease:
4
+ version: 1.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Joshua Mckinney
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-06-19 00:00:00.000000000 Z
11
+ date: 2015-12-28 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: aws-sdk
14
+ name: aws-sdk-v1
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
- version: 1.9.3
19
+ version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
- version: 1.9.3
26
+ version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: em-synchrony
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: em-http-request
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
- name: hot_tub
56
+ name: em-hot_tub
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ~>
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
- version: 0.2.4
61
+ version: 1.1.0
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ~>
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.1.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
76
81
  - !ruby/object:Gem::Version
77
- version: 0.2.4
82
+ version: '1.7'
78
83
  - !ruby/object:Gem::Dependency
79
84
  name: rspec
80
85
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
86
  requirements:
83
- - - ! '>='
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec-autotest
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
84
102
  - !ruby/object:Gem::Version
85
103
  version: '0'
86
104
  type: :development
87
105
  prerelease: false
88
106
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
107
  requirements:
91
- - - ! '>='
108
+ - - ">="
92
109
  - !ruby/object:Gem::Version
93
110
  version: '0'
94
111
  - !ruby/object:Gem::Dependency
95
- name: builder
112
+ name: autotest
96
113
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
114
  requirements:
99
- - - ! '>='
115
+ - - ">="
100
116
  - !ruby/object:Gem::Version
101
117
  version: '0'
102
118
  type: :development
103
119
  prerelease: false
104
120
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
121
  requirements:
107
- - - ! '>='
122
+ - - ">="
108
123
  - !ruby/object:Gem::Version
109
124
  version: '0'
110
- description: Adds EM-Synchrony support to AWS-SDK gem
125
+ description: An em-http-request handler for the aws-sdk for Fiber based asynchronous
126
+ ruby application using EM-Synchrony
111
127
  email:
112
128
  - joshmckin@gmail.com
113
129
  executables: []
114
130
  extensions: []
115
131
  extra_rdoc_files: []
116
132
  files:
117
- - .gitignore
118
- - .rspec
133
+ - ".gitignore"
134
+ - ".rspec"
135
+ - ".travis.yml"
119
136
  - Gemfile
120
137
  - Gemfile.lock
121
138
  - HISTORY.md
@@ -124,38 +141,43 @@ files:
124
141
  - Rakefile
125
142
  - em_aws.gemspec
126
143
  - lib/aws/core/http/em_http_handler.rb
144
+ - lib/em-aws.rb
145
+ - lib/em-aws/http_handler.rb
146
+ - lib/em-aws/patches.rb
147
+ - lib/em-aws/version.rb
127
148
  - lib/em_aws.rb
128
- - lib/em_aws/patches.rb
129
- - lib/em_aws/version.rb
130
- - spec/em_http_handler_spec.rb
131
- - spec/patches_spec.rb
149
+ - spec/em-aws/http_handler_spec.rb
150
+ - spec/em-aws/patches_spec.rb
151
+ - spec/integration/dynamo_db_spec.rb
152
+ - spec/integration/s3_spec.rb
132
153
  - spec/spec_helper.rb
133
154
  homepage: https://github.com/JoshMcKin/em_aws
134
155
  licenses:
135
156
  - MIT
157
+ metadata: {}
136
158
  post_install_message:
137
159
  rdoc_options: []
138
160
  require_paths:
139
161
  - lib
140
162
  required_ruby_version: !ruby/object:Gem::Requirement
141
- none: false
142
163
  requirements:
143
- - - ! '>='
164
+ - - ">="
144
165
  - !ruby/object:Gem::Version
145
166
  version: '0'
146
167
  required_rubygems_version: !ruby/object:Gem::Requirement
147
- none: false
148
168
  requirements:
149
- - - ! '>='
169
+ - - ">="
150
170
  - !ruby/object:Gem::Version
151
171
  version: '0'
152
172
  requirements: []
153
173
  rubyforge_project: em_aws
154
- rubygems_version: 1.8.25
174
+ rubygems_version: 2.5.1
155
175
  signing_key:
156
- specification_version: 3
176
+ specification_version: 4
157
177
  summary: Adds EM-Synchrony support to AWS-SDK gem
158
178
  test_files:
159
- - spec/em_http_handler_spec.rb
160
- - spec/patches_spec.rb
179
+ - spec/em-aws/http_handler_spec.rb
180
+ - spec/em-aws/patches_spec.rb
181
+ - spec/integration/dynamo_db_spec.rb
182
+ - spec/integration/s3_spec.rb
161
183
  - spec/spec_helper.rb
@@ -1,3 +0,0 @@
1
- module EmAws
2
- VERSION = "0.3.2"
3
- end
@@ -1,250 +0,0 @@
1
- # Copyright 2011 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License"). You
4
- # may not use this file except in compliance with the License. A copy of
5
- # the License is located at
6
- #
7
- # http://aws.amazon.com/apache2.0/
8
- #
9
- # or in the "license" file accompanying this file. This file is
10
- # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
- # ANY KIND, either express or implied. See the License for the specific
12
- # language governing permissions and limitations under the License.
13
-
14
- require 'spec_helper'
15
- require 'eventmachine'
16
- require 'evma_httpserver'
17
- module AWS::Core
18
- module Http
19
- class EMFooIO
20
- def path
21
- "/my_path/test.text"
22
- end
23
- end
24
-
25
- # A slow server for testing timeout,
26
- # borrowed from: http://www.igvita.com/2008/05/27/ruby-eventmachine-the-speed-demon/
27
- class SlowServer < EventMachine::Connection
28
- include EventMachine::HttpServer
29
-
30
- def process_http_request
31
- resp = EventMachine::DelegatedHttpResponse.new( self )
32
-
33
- sleep 2 # Simulate a long running request
34
-
35
- resp.status = 200
36
- resp.content = "Hello World!"
37
- resp.send_response
38
- end
39
- end
40
-
41
- describe EMHttpHandler do
42
- let(:handler) { EMHttpHandler.new(default_request_options) }
43
-
44
- let(:default_request_options) { Hash.new }
45
-
46
- let(:req) do
47
- r = Http::Request.new
48
- r.host = "foo.bar.com"
49
- r.uri = "/my_path/?foo=bar"
50
- r.body_stream = StringIO.new("myStringIO")
51
- r
52
- end
53
-
54
- let(:resp) { Http::Response.new }
55
-
56
- let(:em_http_options) do
57
- options = nil
58
- EMHttpHandler.should_receive(:fetch_response).with do |url, _, opts|
59
- options = opts
60
- double("http response",
61
- :response => "<foo/>",
62
- :code => 200,
63
- :to_hash => {})
64
- end
65
-
66
- handler.handle(req, resp)
67
-
68
- options
69
- end
70
-
71
- it 'should be accessible from AWS as well as AWS::Core' do
72
- AWS::Http::EMHttpHandler.new
73
- .should be_an(AWS::Core::Http::EMHttpHandler)
74
- end
75
-
76
- it "should not timeout" do
77
- EM.synchrony do
78
- response = Http::Response.new
79
- request = Http::Request.new
80
- request.host = "127.0.0.1"
81
- request.port = "8081"
82
- request.uri = "/"
83
- request.body_stream = StringIO.new("myStringIO")
84
-
85
- # turn on our test server
86
- EventMachine::run do
87
- EventMachine::start_server request.host, request.port, SlowServer
88
- end
89
-
90
- handler.stub(:fetch_url).and_return("http://127.0.0.1:8081")
91
-
92
- handler.handle(request,response)
93
-
94
- response.network_error.should be_nil
95
-
96
- EM.stop
97
- end
98
- end
99
-
100
- it "should timeout after 0.1 seconds" do
101
- EM.synchrony do
102
- response = Http::Response.new
103
- request = Http::Request.new
104
- request.host = "127.0.0.1"
105
- request.port = "8081"
106
- request.uri = "/"
107
- request.body_stream = StringIO.new("myStringIO")
108
-
109
- # turn on our test server
110
- EventMachine::run do
111
- EventMachine::start_server request.host, request.port, SlowServer
112
- end
113
-
114
- handler.stub(:fetch_url).and_return("http://127.0.0.1:8081")
115
- request.stub(:read_timeout).and_return(0.01)
116
- handler.stub(:connect_timeout).and_return(1) #just to speed up the test
117
-
118
- handler.handle(request,response)
119
-
120
- response.network_error.should be_a(Timeout::Error)
121
-
122
- EM.stop
123
- end
124
- end
125
-
126
- describe '#handle' do
127
- context 'timeouts' do
128
- it 'should rescue Timeout::Error' do
129
- handler
130
- .stub(:fetch_response)
131
- .and_raise(Timeout::Error)
132
-
133
- expect {
134
- handler.handle(req, resp)
135
- }.to_not raise_error
136
- end
137
-
138
- it 'should rescue Errno::ETIMEDOUT' do
139
- handler
140
- .stub(:fetch_response)
141
- .and_raise(Errno::ETIMEDOUT)
142
-
143
- expect {
144
- handler.handle(req, resp)
145
- }.to_not raise_error
146
- end
147
-
148
- it 'should indicate that there was a network_error' do
149
- handler
150
- .stub(:fetch_response)
151
- .and_raise(Errno::ETIMEDOUT)
152
-
153
- handler.handle(req, resp)
154
-
155
- resp.network_error?.should be_true
156
- end
157
- end
158
-
159
- context 'default request options' do
160
- before(:each) do
161
- handler
162
- .stub(:default_request_options)
163
- .and_return(:foo => "BAR", :private_key_file => "blarg")
164
- end
165
-
166
- it 'passes extra options through to synchrony' do
167
- handler.default_request_options[:foo].should == "BAR"
168
- end
169
-
170
- it 'uses the default when the request option is not set' do
171
- #puts handler.default_request_options
172
- handler.default_request_options[:private_key_file].should == "blarg"
173
- end
174
- end
175
- end
176
-
177
- describe '#fetch_request_options' do
178
- it "should set :query and :body to request.querystring" do
179
- opts = handler.send(:fetch_request_options, req)
180
- opts[:query].should eql(req.querystring)
181
- end
182
-
183
- it "should set :path to request.path" do
184
- opts = handler.send(:fetch_request_options, req)
185
- opts[:path].should eql(req.path)
186
- end
187
-
188
- context "request.body_stream is a StringIO" do
189
- it "should set :body to request.body_stream" do
190
- opts = handler.send(:fetch_request_options, req)
191
- opts[:body].should eql("myStringIO")
192
- end
193
- end
194
-
195
- context "request.body_stream is an object that responds to :path" do
196
- let(:io_object) { EMFooIO.new }
197
-
198
- before(:each) do
199
- req
200
- .stub(:body_stream)
201
- .and_return(io_object)
202
- end
203
-
204
- it "should set :file to object.path " do
205
- opts = handler.send(:fetch_request_options, req)
206
- opts[:file].should eql(io_object.path)
207
- end
208
- end
209
- end
210
-
211
- describe '#fetch_client_options' do
212
- it "should remove pool related options" do
213
- opts = handler.send(:fetch_client_options)
214
-
215
- opts.has_key?(:size).should be_false
216
- opts.has_key?(:never_block).should be_false
217
- opts.has_key?(:blocking_timeout).should be_false
218
- end
219
-
220
- context "when with_pool is true" do
221
- before(:each) do
222
- handler
223
- .stub(:with_pool?)
224
- .and_return(true)
225
- end
226
-
227
- it "should set keepalive as true" do
228
- opts = handler.send(:fetch_client_options)
229
-
230
- opts[:keepalive].should be_true
231
- end
232
- end
233
-
234
- context "when with_pool is false" do
235
- before(:each) do
236
- handler
237
- .stub(:with_pool?)
238
- .and_return(false)
239
- end
240
-
241
- it "should keepalive be false" do
242
- opts = handler.send(:fetch_client_options)
243
-
244
- opts[:keepalive].should_not be_true
245
- end
246
- end
247
- end
248
- end
249
- end
250
- end