af-addon-tester 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,5 +1,7 @@
1
1
  *.gem
2
2
  .bundle
3
3
  Gemfile.lock
4
+ .DS_store
4
5
  pkg/*
5
- manifest.json
6
+ *.ignore
7
+
data/README.md CHANGED
@@ -3,7 +3,7 @@ af-addon-tester
3
3
 
4
4
  <img src="http://appfog.com/images/logo.png" />
5
5
 
6
- Allows developers to test App Fog add-ons
6
+ Allows developers to test add-ons compatible with App Fog
7
7
 
8
8
  ## Setup ##
9
9
 
@@ -46,9 +46,9 @@ If cloned:
46
46
 
47
47
  $ bin/af-addon-tester <path to manifest>
48
48
 
49
- If Gem
49
+ If Gem:
50
50
 
51
- $ $ af-addon-tester <path to manifest>
51
+ $ af-addon-tester <path to manifest>
52
52
 
53
53
 
54
54
  ## Meta ##
data/bin/af-addon-tester CHANGED
@@ -7,8 +7,12 @@ require 'rubygems'
7
7
  require 'json'
8
8
  require 'digest/sha1'
9
9
  require 'af-addon-tester'
10
+ require 'restclient'
10
11
 
11
- manifest_path = ARGV.first
12
+ manifest_path = ARGV.last
13
+
14
+ do_asyc = ARGV.include?('-a')
15
+ username = nil
12
16
 
13
17
  begin
14
18
  manifest_file = File.open(File.expand_path(manifest_path), 'r')
@@ -16,11 +20,11 @@ begin
16
20
  manifest = JSON.parse(manifest_json)
17
21
 
18
22
  raise "Missing id" if manifest['id'].nil?
23
+ username = manifest['api']['username'] || manifest['id']
19
24
  raise "Missing api section" if manifest['api'].nil?
20
- raise "Missing api password" if manifest['api']['username'].nil?
21
25
  raise "Missing api password" if manifest['api']['password'].nil?
22
26
  raise "Missing apt test url" if manifest['api']['test'].nil?
23
- raise "Manifest must have atleast one plan" if manifest['api']['plans'].nil? || manifest['api']['plans'][0].nil? || manifest['api']['plans'][0]['id'].nil?
27
+ raise "Manifest must have atleast one plan" if manifest['plans'].nil? || manifest['plans'][0].nil? || manifest['plans'][0]['id'].nil?
24
28
  raise "missing api config_vars" if manifest['api']['config_vars'].nil?
25
29
  raise "Missing api sso_salt" if manifest['api']['sso_salt'].nil?
26
30
 
@@ -34,18 +38,26 @@ config_prefix = manifest['id'].gsub('-','_').upcase + '_'
34
38
  bad_user = 'bad_user'
35
39
  bad_password = 'bad_pass'
36
40
 
37
- addon = Rest.new(manifest['api']['test'], manifest['api']['username'], manifest['api']['password'])
41
+ addon = RestClient::Resource.new manifest['api']['test'], {:user => username, :password => manifest['api']['password']}
42
+ headers = { :accept => "application/json", :content_type => "application/json", "User-Agent" => "af-addon-tester/#{VERSION}" }
43
+
38
44
  resp = nil
45
+ code = nil
39
46
 
40
47
  validate "Provisioning" do
41
- params = {}
42
- payload = { 'customer_id' => manifest['id'], 'plan' => manifest['api']['plans'][0]['id'], 'callback_url' => callback_url, 'options' => '{}' }
43
- resp = addon.post(manifest['api']['test'], params, JSON.generate(payload))
44
- failed("response code: #{resp.code} - #{resp.message}") if resp.code != "200"
48
+ payload = { 'customer_id' => manifest['id'], 'plan' => manifest['plans'][0]['id'], 'callback_url' => callback_url, 'options' => '{}' }
49
+ begin
50
+ resp = addon['/provider/resources'].post JSON.generate(payload), headers
51
+ failed("response code: #{resp.code}") if resp.code != 200
52
+ code = 200
53
+ rescue RestClient::ExceptionWithResponse => rest_err
54
+ code = rest_err.http_code
55
+ failed("response code: #{rest_err.message}")
56
+ end
45
57
  passed
46
58
  end
47
59
 
48
- if resp.code == "200"
60
+ if code == 200
49
61
  provision_info = nil
50
62
  validate "Valid JSON response" do
51
63
  begin
@@ -90,81 +102,91 @@ end
90
102
  resource_id = provision_info['id']
91
103
  unless resource_id.nil?
92
104
  validate "Update resource" do
93
- params = {}
94
- payload = { 'plan' => 'paid', 'callback_url' => callback_url, 'options' => '{}' }
95
- resp = addon.put(manifest['api']['test'] + "/#{resource_id}", params, JSON.generate(payload))
96
- failed("response code: #{resp.code}") if resp.code != "200"
97
- passed
98
- end
99
-
100
- READLEN = 1024 * 10
101
- reader, writer = IO.pipe
102
- out = nil
103
- validate "Callback" do
104
- child = fork do
105
- reader.close
106
- server = TCPServer.open(9990)
107
- client = server.accept
108
- writer.write(client.readpartial(READLEN))
109
- client.write("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n")
110
- client.close
111
- writer.close
112
- end
113
- sleep(1)
114
- out = reader.readpartial(READLEN)
115
- passed
116
- end
117
-
118
- callback_info = nil
119
- isValidCallback = false
120
- validate "Valid callback response" do
121
- _, json = out.split("\r\n\r\n")
105
+ payload = { 'customer_id' => manifest['id'], 'plan' => 'sandbox' }
122
106
  begin
123
- callback_info = JSON.parse(json)
124
- rescue Exception => e
125
- failed e.message
107
+ resp = addon["/provider/resources/#{resource_id}"].put JSON.generate(payload), headers
108
+ failed("response code: #{resp.code}") if resp.code != 200
109
+ rescue RestClient::ExceptionWithResponse => rest_err
110
+ failed("response code: #{rest_err.message}")
126
111
  end
127
- isValidCallback = true
128
112
  passed
129
113
  end
130
114
 
131
- if isValidCallback
132
- validate "All callback config keys are in manifest" do
133
- callback_info['config'].each do |key, value|
134
- unless manifest['api']['config_vars'].include? key; failed "#{key} not found in config"; end
115
+ if do_asyc
116
+ READLEN = 1024 * 10
117
+ reader, writer = IO.pipe
118
+ out = nil
119
+ validate "Callback" do
120
+ child = fork do
121
+ reader.close
122
+ server = TCPServer.open(9990)
123
+ client = server.accept
124
+ writer.write(client.readpartial(READLEN))
125
+ client.write("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n")
126
+ client.close
127
+ writer.close
135
128
  end
129
+ sleep(1)
130
+ out = reader.readpartial(READLEN)
131
+ passed
136
132
  end
137
133
 
138
- validate "All callback manifest config keys are in response" do
139
- manifest['api']['config_vars'].each do |key, value|
140
- unless callback_info['config'].include? key; failed "#{key} not found in manifest"; end
134
+ callback_info = nil
135
+ isValidCallback = false
136
+ validate "Valid callback response" do
137
+ _, json = out.split("\r\n\r\n")
138
+ begin
139
+ callback_info = JSON.parse(json)
140
+ rescue Exception => e
141
+ failed e.message
141
142
  end
143
+ isValidCallback = true
144
+ passed
142
145
  end
143
146
 
144
- validate "All callback config keys are prefixed with addon name" do
145
- callback_info['config'].each do |key, value|
146
- unless key.start_with? config_prefix; failed "#{key} does not begin with #{config_prefix}"; end
147
+ if isValidCallback
148
+ validate "All callback config keys are in manifest" do
149
+ callback_info['config'].each do |key, value|
150
+ unless manifest['api']['config_vars'].include? key; failed "#{key} not found in config"; end
151
+ end
152
+ end
153
+
154
+ validate "All callback manifest config keys are in response" do
155
+ manifest['api']['config_vars'].each do |key, value|
156
+ unless callback_info['config'].include? key; failed "#{key} not found in manifest"; end
157
+ end
158
+ end
159
+
160
+ validate "All callback config keys are prefixed with addon name" do
161
+ callback_info['config'].each do |key, value|
162
+ unless key.start_with? config_prefix; failed "#{key} does not begin with #{config_prefix}"; end
163
+ end
164
+ passed
147
165
  end
148
- passed
149
166
  end
150
167
  end
151
-
168
+
152
169
  validate "SSO link" do
153
170
  timestamp = Time.now.to_i
154
171
  authstring = resource_id.to_s + ':' + manifest['api']['sso_salt'] + ':' + timestamp.to_s
155
172
  token = Digest::SHA1.hexdigest(authstring)
156
- resp = addon.get(manifest['api']['test'] + "/#{resource_id}?token=#{token}&timestamp=#{timestamp}")
157
- passed unless resp.code != "200"
158
- end
159
-
160
- validate "Deprovision" do
161
- params = {}
162
- payload = { 'customer_id' => manifest['id'], 'plan' => manifest['api']['plans'][0]['id'], 'callback_url' => callback_url, 'options' => '{}' }
163
- resp = addon.delete(manifest['api']['test'] + "/#{resource_id}", params, JSON.generate(payload))
164
- failed("response code: #{resp.code}") if resp.code != "200"
173
+ addon_sso = RestClient::Resource.new manifest['api']['test']
174
+ sso_headers = { :accept => "text/html", :content_type => "text/html", "User-Agent" => "af-addon-tester/#{VERSION}" }
175
+ begin
176
+ resp = addon_sso["/provider/resources/#{resource_id}?token=#{token}&timestamp=#{timestamp}"].get sso_headers
177
+ failed("response code: #{resp.code}") if resp.code != 200
178
+ rescue RestClient::ExceptionWithResponse => rest_err
179
+ failed("response code: #{rest_err.message}")
180
+ end
165
181
  passed
166
182
  end
167
183
 
184
+ # validate "Deprovision" do
185
+ # resp = addon["/provider/resources/#{resource_id}"].delete
186
+ # failed("response code: #{resp.code}") if resp.code != 200
187
+ # passed
188
+ #end
189
+
168
190
  end
169
191
  end
170
192
 
@@ -173,12 +195,16 @@ else
173
195
  end
174
196
 
175
197
  validate "Bad credentials test" do
176
- params = {}
177
- payload = { 'customer_id' => manifest['id'], 'plan' => manifest['api']['plans'][0]['id'], 'callback_url' => callback_url, 'options' => '{}' }
198
+ payload = { 'customer_id' => manifest['id'], 'plan' => manifest['plans'][0]['id'], 'callback_url' => callback_url, 'options' => '{}' }
178
199
 
179
- addon_bad_auth = Rest.new(manifest['api']['test'], bad_user, bad_password)
180
- resp = addon.post(manifest['api']['test'], params, JSON.generate(payload))
200
+ addon_bad_auth = RestClient::Resource.new manifest['api']['test'], { :username => bad_user, :password => bad_password }
181
201
 
182
- failed if resp.code == "200"
183
- passed
202
+ code = nil
203
+ begin
204
+ resp = addon_bad_auth["/provider/resources"].post JSON.generate(payload), headers
205
+ code = resp.code
206
+ rescue RestClient::ExceptionWithResponse => rest_err
207
+ code = rest_err.http_code
208
+ end
209
+ passed unless code == 200
184
210
  end
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "id":"myaddon",
3
+ "plans":[
4
+ {"id":"free"}
5
+ ],
3
6
  "api":{
4
- "plans":[
5
- {"id":"free"}
6
- ],
7
7
  "config_vars": {
8
8
  "MYADDON_URL":"http://some.url.com",
9
9
  "MYADDON_VAR1":"cats",
10
10
  "MYADDON_VAR2":"dogs"
11
11
  },
12
- "test":"http://localhost:4567/myaddon/resources",
12
+ "test":"http://localhost:4567",
13
13
  "username":"myaddon",
14
- "password":"cavef6azebRewruvecuch",
14
+ "password":"NVUQ1OqNtuc74HiE",
15
15
  "sso_salt":"8ouy3ayLEyOA7HLAKO2Yo"
16
16
  }
17
17
  }
@@ -1,4 +1,3 @@
1
1
  require "af-addon-tester/version"
2
2
  require "af-addon-tester/colorize"
3
3
  require "af-addon-tester/test"
4
- require "af-addon-tester/rest"
@@ -1,5 +1,5 @@
1
1
  module AppFog
2
2
  module AddonTester
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Tim Santeford
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2012-01-12 00:00:00 -08:00
17
+ date: 2012-01-15 00:00:00 -08:00
18
18
  default_executable: af-addon-tester
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -48,7 +48,6 @@ files:
48
48
  - config/manifest.example.json
49
49
  - lib/af-addon-tester.rb
50
50
  - lib/af-addon-tester/colorize.rb
51
- - lib/af-addon-tester/rest.rb
52
51
  - lib/af-addon-tester/test.rb
53
52
  - lib/af-addon-tester/version.rb
54
53
  has_rdoc: true
@@ -1,106 +0,0 @@
1
- require 'net/http'
2
- require 'net/https'
3
- require 'uri'
4
- require 'cgi'
5
-
6
- class Rest
7
-
8
- $user = nil
9
- $password = nil
10
- $http = nil
11
- $cookies = {}
12
- $last_resp = nil
13
- $last_params = nil
14
-
15
- $useragent = ''
16
-
17
- def initialize(url, user = nil, password = nil)
18
- $user = user
19
- $password = password
20
-
21
- uri = URI(url)
22
- $http = Net::HTTP.new(uri.host, uri.port)
23
-
24
- if uri.scheme == 'https'
25
- $http.use_ssl = true
26
- $http.verify_mode = OpenSSL::SSL::VERIFY_NONE
27
- else
28
- $http.use_ssl = false
29
- end
30
- end
31
-
32
- def get(url, params = nil, additional_header = nil)
33
- header = { 'Cookie' => cookie_to_s, 'User-Agent' => $useragent }
34
- header = header.merge(additional_header) unless additional_header.nil?
35
- req = Net::HTTP::Get.new(url, header)
36
- make_request(req, params)
37
- end
38
-
39
- def post(url, params, payload = nil, additional_header = nil)
40
- header = { 'Cookie' => cookie_to_s, 'User-Agent' => $useragent }
41
- header = header.merge(additional_header) unless additional_header.nil?
42
- req = Net::HTTP::Post.new(url, { 'Cookie' => cookie_to_s, 'User-Agent' => $useragent })
43
- make_request(req, params, payload)
44
- end
45
-
46
- def put(url, params, payload = nil)
47
- req = Net::HTTP::Put.new(url, { 'Cookie' => cookie_to_s, 'User-Agent' => $useragent })
48
- make_request(req, params, payload)
49
- end
50
-
51
- def delete(url, params = nil, payload = nil)
52
- req = Net::HTTP::Delete.new(url, { 'Cookie' => cookie_to_s, 'User-Agent' => $useragent })
53
- make_request(req, params, payload)
54
- end
55
-
56
- def cookies
57
- $cookies
58
- end
59
- def cookies=(dough)
60
- $cookies = dough
61
- end
62
-
63
- def inspect
64
- puts "#{bwhite(resp.code)} - #{$last_resp.message}"
65
- puts $last_params.inspect
66
- puts "Cookies: " + $cookies.inspect
67
- puts $last_resp.body
68
- end
69
-
70
- private
71
-
72
- def cookie_to_s
73
- cookiestr = ''
74
- $cookies.each do |key, value|
75
- cookiestr += "#{key}=#{value}, "
76
- end
77
- cookiestr[0..-2]
78
- end
79
-
80
- def make_request(req, params = nil, payload = nil)
81
- $last_params = params
82
- req.basic_auth($user, $password) unless $user.nil?
83
- req.set_form_data(params, ';') unless params.nil?
84
-
85
- unless payload.nil?
86
- req.body = payload
87
- req.set_content_type('multipart/form-data')
88
- end
89
-
90
- begin
91
- $last_resp = $http.request(req)
92
-
93
- unless $last_resp['set-cookie'].nil?
94
- $last_resp['set-cookie'].split(', ').each do |cookie|
95
- key, value = cookie.split('=')
96
- $cookies[key] = value
97
- end
98
- end
99
- rescue NoMethodError
100
- return Net::HTTPInternalServerError.new '1.1', '500', 'Internal server error'
101
- end
102
-
103
- $last_resp
104
- end
105
-
106
- end