proxy_tester 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +22 -0
- data/.rdebugrc +7 -0
- data/.rspec +3 -0
- data/.simplecov +8 -0
- data/Gemfile +37 -0
- data/Gemfile.lock +199 -0
- data/LICENSE.txt +22 -0
- data/Procfile +1 -0
- data/README.md +582 -0
- data/Rakefile +64 -0
- data/bin/proxy_tester +11 -0
- data/db/migrate/20140314_create_environment.rb +8 -0
- data/files/config.yaml +1 -0
- data/files/example-config.erb +12 -0
- data/files/example-spec_helper.rb.erb +23 -0
- data/files/example-test_case.rb.erb +27 -0
- data/files/example-test_cases-gemfile.rb.erb +9 -0
- data/files/example-user_file.erb +4 -0
- data/lib/proxy_tester/actions/add_examples_to_test_cases_directory.rb +125 -0
- data/lib/proxy_tester/actions/clone_repository.rb +39 -0
- data/lib/proxy_tester/actions/create_directory.rb +33 -0
- data/lib/proxy_tester/actions/create_file.rb +55 -0
- data/lib/proxy_tester/actions/create_output.rb +36 -0
- data/lib/proxy_tester/actions/handle_error.rb +37 -0
- data/lib/proxy_tester/actions/initialize_application.rb +70 -0
- data/lib/proxy_tester/actions/show_config.rb +10 -0
- data/lib/proxy_tester/capybara_proxy.rb +54 -0
- data/lib/proxy_tester/capybara_proxy_pac.rb +62 -0
- data/lib/proxy_tester/cli/main.rb +59 -0
- data/lib/proxy_tester/config.rb +100 -0
- data/lib/proxy_tester/data.rb +23 -0
- data/lib/proxy_tester/database_session.rb +15 -0
- data/lib/proxy_tester/environment.rb +21 -0
- data/lib/proxy_tester/erb_generator.rb +34 -0
- data/lib/proxy_tester/error_handler.rb +107 -0
- data/lib/proxy_tester/error_messages.rb +82 -0
- data/lib/proxy_tester/exceptions.rb +53 -0
- data/lib/proxy_tester/git_file.rb +31 -0
- data/lib/proxy_tester/git_null_file.rb +32 -0
- data/lib/proxy_tester/git_repository.rb +120 -0
- data/lib/proxy_tester/handle_error.rb +37 -0
- data/lib/proxy_tester/locales/en-rails.yml +205 -0
- data/lib/proxy_tester/locales/en.yml +42 -0
- data/lib/proxy_tester/main.rb +46 -0
- data/lib/proxy_tester/models/user.rb +17 -0
- data/lib/proxy_tester/pac_result.rb +50 -0
- data/lib/proxy_tester/rspec/helper.rb +211 -0
- data/lib/proxy_tester/rspec_runner.rb +43 -0
- data/lib/proxy_tester/template_file.rb +19 -0
- data/lib/proxy_tester/template_repository.rb +22 -0
- data/lib/proxy_tester/ui_logger.rb +30 -0
- data/lib/proxy_tester/user_database.rb +24 -0
- data/lib/proxy_tester/version.rb +3 -0
- data/lib/proxy_tester.rb +54 -0
- data/proxy_tester.gemspec +34 -0
- data/script/acceptance_test +4 -0
- data/script/bootstrap +56 -0
- data/script/ci +3 -0
- data/script/console +14 -0
- data/script/release +3 -0
- data/script/test_web +22 -0
- data/script/unit_test +3 -0
- data/spec/actions/add_examples_to_test_cases_directory_spec.rb +52 -0
- data/spec/actions/clone_repository_spec.rb +83 -0
- data/spec/actions/create_directory_spec.rb +59 -0
- data/spec/actions/create_file_spec.rb +139 -0
- data/spec/actions/create_output_spec.rb +46 -0
- data/spec/actions/handle_error_spec.rb +74 -0
- data/spec/actions/initialize_application_spec.rb +40 -0
- data/spec/actions/show_config_spec.rb +22 -0
- data/spec/capybara_proxy_pac_spec.rb +42 -0
- data/spec/capybara_proxy_spec.rb +76 -0
- data/spec/config_spec.rb +86 -0
- data/spec/data_spec.rb +34 -0
- data/spec/environment_spec.rb +25 -0
- data/spec/erb_generator_spec.rb +31 -0
- data/spec/examples/proxy.pac +7 -0
- data/spec/factories.rb +8 -0
- data/spec/features/check_ssl_sites_spec.rb +8 -0
- data/spec/git_file_spec.rb +46 -0
- data/spec/git_repository_spec.rb +111 -0
- data/spec/main_spec.rb +25 -0
- data/spec/pac_result_spec.rb +20 -0
- data/spec/proxy_tester_spec_helper_spec.rb +137 -0
- data/spec/rspec_runner_spec.rb +29 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/support/capybara.rb +11 -0
- data/spec/support/database_cleaner.rb +14 -0
- data/spec/support/debugging.rb +3 -0
- data/spec/support/environment.rb +33 -0
- data/spec/support/example.rb +16 -0
- data/spec/support/factory_girl.rb +15 -0
- data/spec/support/filesystem.rb +19 -0
- data/spec/support/helper_features.rb +31 -0
- data/spec/support/matcher.rb +17 -0
- data/spec/support/reporting.rb +1 -0
- data/spec/support/rspec.rb +5 -0
- data/spec/support/string.rb +2 -0
- data/spec/template_file_spec.rb +25 -0
- data/spec/template_repository_spec.rb +44 -0
- data/spec/user_database_spec.rb +63 -0
- data/spec/user_spec.rb +62 -0
- metadata +398 -0
@@ -0,0 +1,205 @@
|
|
1
|
+
en:
|
2
|
+
date:
|
3
|
+
abbr_day_names:
|
4
|
+
- Sun
|
5
|
+
- Mon
|
6
|
+
- Tue
|
7
|
+
- Wed
|
8
|
+
- Thu
|
9
|
+
- Fri
|
10
|
+
- Sat
|
11
|
+
abbr_month_names:
|
12
|
+
-
|
13
|
+
- Jan
|
14
|
+
- Feb
|
15
|
+
- Mar
|
16
|
+
- Apr
|
17
|
+
- May
|
18
|
+
- Jun
|
19
|
+
- Jul
|
20
|
+
- Aug
|
21
|
+
- Sep
|
22
|
+
- Oct
|
23
|
+
- Nov
|
24
|
+
- Dec
|
25
|
+
day_names:
|
26
|
+
- Sunday
|
27
|
+
- Monday
|
28
|
+
- Tuesday
|
29
|
+
- Wednesday
|
30
|
+
- Thursday
|
31
|
+
- Friday
|
32
|
+
- Saturday
|
33
|
+
formats:
|
34
|
+
default: ! '%d-%m-%Y'
|
35
|
+
long: ! '%d %B, %Y'
|
36
|
+
short: ! '%d %b'
|
37
|
+
month_names:
|
38
|
+
-
|
39
|
+
- January
|
40
|
+
- February
|
41
|
+
- March
|
42
|
+
- April
|
43
|
+
- May
|
44
|
+
- June
|
45
|
+
- July
|
46
|
+
- August
|
47
|
+
- September
|
48
|
+
- October
|
49
|
+
- November
|
50
|
+
- December
|
51
|
+
order:
|
52
|
+
- :day
|
53
|
+
- :month
|
54
|
+
- :year
|
55
|
+
datetime:
|
56
|
+
distance_in_words:
|
57
|
+
about_x_hours:
|
58
|
+
one: about 1 hour
|
59
|
+
other: about %{count} hours
|
60
|
+
about_x_months:
|
61
|
+
one: about 1 month
|
62
|
+
other: about %{count} months
|
63
|
+
about_x_years:
|
64
|
+
one: about 1 year
|
65
|
+
other: about %{count} years
|
66
|
+
almost_x_years:
|
67
|
+
one: almost 1 year
|
68
|
+
other: almost %{count} years
|
69
|
+
half_a_minute: half a minute
|
70
|
+
less_than_x_minutes:
|
71
|
+
one: less than a minute
|
72
|
+
other: less than %{count} minutes
|
73
|
+
less_than_x_seconds:
|
74
|
+
one: less than 1 second
|
75
|
+
other: less than %{count} seconds
|
76
|
+
over_x_years:
|
77
|
+
one: over 1 year
|
78
|
+
other: over %{count} years
|
79
|
+
x_days:
|
80
|
+
one: 1 day
|
81
|
+
other: ! '%{count} days'
|
82
|
+
x_minutes:
|
83
|
+
one: 1 minute
|
84
|
+
other: ! '%{count} minutes'
|
85
|
+
x_months:
|
86
|
+
one: 1 month
|
87
|
+
other: ! '%{count} months'
|
88
|
+
x_seconds:
|
89
|
+
one: 1 second
|
90
|
+
other: ! '%{count} seconds'
|
91
|
+
prompts:
|
92
|
+
day: Day
|
93
|
+
hour: Hour
|
94
|
+
minute: Minute
|
95
|
+
month: Month
|
96
|
+
second: Seconds
|
97
|
+
year: Year
|
98
|
+
errors: &errors
|
99
|
+
format: ! '%{attribute} %{message}'
|
100
|
+
messages:
|
101
|
+
accepted: must be accepted
|
102
|
+
blank: can't be blank
|
103
|
+
confirmation: doesn't match confirmation
|
104
|
+
empty: can't be empty
|
105
|
+
equal_to: must be equal to %{count}
|
106
|
+
even: must be even
|
107
|
+
exclusion: is reserved
|
108
|
+
greater_than: must be greater than %{count}
|
109
|
+
greater_than_or_equal_to: must be greater than or equal to %{count}
|
110
|
+
inclusion: is not included in the list
|
111
|
+
invalid: is invalid
|
112
|
+
less_than: must be less than %{count}
|
113
|
+
less_than_or_equal_to: must be less than or equal to %{count}
|
114
|
+
not_a_number: is not a number
|
115
|
+
not_an_integer: must be an integer
|
116
|
+
odd: must be odd
|
117
|
+
record_invalid: ! 'Validation failed: %{errors}'
|
118
|
+
taken: has already been taken
|
119
|
+
too_long:
|
120
|
+
one: is too long (maximum is 1 character)
|
121
|
+
other: is too long (maximum is %{count} characters)
|
122
|
+
too_short:
|
123
|
+
one: is too short (minimum is 1 character)
|
124
|
+
other: is too short (minimum is %{count} characters)
|
125
|
+
wrong_length:
|
126
|
+
one: is the wrong length (should be 1 character)
|
127
|
+
other: is the wrong length (should be %{count} characters)
|
128
|
+
template:
|
129
|
+
body: ! 'There were problems with the following fields:'
|
130
|
+
header:
|
131
|
+
one: 1 error prohibited this %{model} from being saved
|
132
|
+
other: ! '%{count} errors prohibited this %{model} from being saved'
|
133
|
+
helpers:
|
134
|
+
select:
|
135
|
+
prompt: Please select
|
136
|
+
submit:
|
137
|
+
create: Create %{model}
|
138
|
+
submit: Save %{model}
|
139
|
+
update: Update %{model}
|
140
|
+
number:
|
141
|
+
currency:
|
142
|
+
format:
|
143
|
+
delimiter: ! ','
|
144
|
+
format: ! '%u%n'
|
145
|
+
precision: 2
|
146
|
+
separator: .
|
147
|
+
significant: false
|
148
|
+
strip_insignificant_zeros: false
|
149
|
+
unit: £
|
150
|
+
format:
|
151
|
+
delimiter: ! ','
|
152
|
+
precision: 3
|
153
|
+
separator: .
|
154
|
+
significant: false
|
155
|
+
strip_insignificant_zeros: false
|
156
|
+
human:
|
157
|
+
decimal_units:
|
158
|
+
format: ! '%n %u'
|
159
|
+
units:
|
160
|
+
billion: Billion
|
161
|
+
million: Million
|
162
|
+
quadrillion: Quadrillion
|
163
|
+
thousand: Thousand
|
164
|
+
trillion: Trillion
|
165
|
+
unit: ''
|
166
|
+
format:
|
167
|
+
delimiter: ''
|
168
|
+
precision: 3
|
169
|
+
significant: true
|
170
|
+
strip_insignificant_zeros: true
|
171
|
+
storage_units:
|
172
|
+
format: ! '%n %u'
|
173
|
+
units:
|
174
|
+
byte:
|
175
|
+
one: Byte
|
176
|
+
other: Bytes
|
177
|
+
gb: GB
|
178
|
+
kb: KB
|
179
|
+
mb: MB
|
180
|
+
tb: TB
|
181
|
+
percentage:
|
182
|
+
format:
|
183
|
+
delimiter: ''
|
184
|
+
precision:
|
185
|
+
format:
|
186
|
+
delimiter: ''
|
187
|
+
support:
|
188
|
+
array:
|
189
|
+
last_word_connector: ! ', and '
|
190
|
+
two_words_connector: ! ' and '
|
191
|
+
words_connector: ! ', '
|
192
|
+
time:
|
193
|
+
am: am
|
194
|
+
formats:
|
195
|
+
default: ! '%a, %d %b %Y %H:%M:%S %z'
|
196
|
+
long: ! '%d %B, %Y %H:%M'
|
197
|
+
short: ! '%d %b %H:%M'
|
198
|
+
pm: pm
|
199
|
+
# remove these aliases after 'activemodel' and 'activerecord' namespaces are removed from Rails repository
|
200
|
+
activemodel:
|
201
|
+
errors:
|
202
|
+
<<: *errors
|
203
|
+
activerecord:
|
204
|
+
errors:
|
205
|
+
<<: *errors
|
@@ -0,0 +1,42 @@
|
|
1
|
+
---
|
2
|
+
en:
|
3
|
+
errors:
|
4
|
+
default:
|
5
|
+
summary: Unexpected Error...
|
6
|
+
details: Sorry, but I cannot fullfill your request. An unexpected error occured. Please ask your administrator for support.
|
7
|
+
internal_error:
|
8
|
+
summary: Internal error...
|
9
|
+
details: 'Sorry, but I cannot fullfill your request. An internal error occured: "%{message}". Please notify the author of the software about the problem.'
|
10
|
+
user_error:
|
11
|
+
summary: User Error...
|
12
|
+
details: Sorry, but I cannot fullfill your request. An error occured. There should be a better error message displayed here. Please notify the author of the software about the problem.
|
13
|
+
unreadable_config_file:
|
14
|
+
summary: Unreadable config file...
|
15
|
+
details: 'Sorry, but I cannot fullfill your request. The config file "%{file}" given could not be read: "%{message}".'
|
16
|
+
invalid_proxy_user:
|
17
|
+
summary: Invalid proxy user...
|
18
|
+
details: 'Sorry, but you told me to use the user "#{user}" in your specs which does not exist in the user database. Please fix that and run the specs again.'
|
19
|
+
invalid_user_record:
|
20
|
+
summary: Invalid user record...
|
21
|
+
details: 'Sorry, but you told me to create a user resource from an invalid user record: "#{message}". Please fix that and run the specs again.'
|
22
|
+
unreadable_user_file:
|
23
|
+
summary: User file not found...
|
24
|
+
details: 'Sorry, but I cannot fullfill your request. I cannot find the user file "%{file}". Please fix that and run the specs again.'
|
25
|
+
request_timeout:
|
26
|
+
summary: Request timed out...
|
27
|
+
details: 'Sorry, but an error happend. A request timeout. Maybe the proxy or the web server is not reachable.'
|
28
|
+
invalid_synatx:
|
29
|
+
summary: Invalid syntax...
|
30
|
+
details: 'Sorry, but an error happend. The syntax used by you is invalid: %{message}.'
|
31
|
+
not_found_pac_file:
|
32
|
+
summary: Pac file not found...
|
33
|
+
details: 'Sorry, but I cannot fullfill your request. The pac file "%{file}" cannot be found.'
|
34
|
+
invalid_pac_result:
|
35
|
+
summary: Invalid result from pac file...
|
36
|
+
details: 'Sorry, but I cannot fullfill your request. The result "%{result}" of proxy.pac "%{file}" is invalid. Please fix the proxy.pac and try again.'
|
37
|
+
invalid_proxy_type:
|
38
|
+
summary: Invalid proxy type...
|
39
|
+
details: 'Sorry, but I cannot fullfill your request. You provided an invalid proxy type "%{type}". Allowed values are ":none", ":http" or ":socks5".'
|
40
|
+
views:
|
41
|
+
application:
|
42
|
+
title: Proxy Tester
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module ProxyTester;
|
3
|
+
@environment = ProxyTester::Environment.new
|
4
|
+
@config = ProxyTester::Config.new
|
5
|
+
@ui_logger = ProxyTester::UiLogger.new
|
6
|
+
@session = ProxyTester::DatabaseSession.new
|
7
|
+
|
8
|
+
class << self
|
9
|
+
attr_accessor :session, :environment, :config, :ui_logger
|
10
|
+
|
11
|
+
def root_path
|
12
|
+
::File.expand_path('../../..', __FILE__)
|
13
|
+
end
|
14
|
+
|
15
|
+
def enable_debug_mode
|
16
|
+
ProxyTester.ui_logger.info "Activating debug mode."
|
17
|
+
|
18
|
+
require 'pry'
|
19
|
+
require 'debugger'
|
20
|
+
rescue LoadError
|
21
|
+
ProxyTester.ui_logger.error "You tried to enable debug-mode, but either 'pry'- or 'debugger'-gem are not installed. Please fix that before using the debug-switch again."
|
22
|
+
end
|
23
|
+
|
24
|
+
def configure_i18n
|
25
|
+
I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
|
26
|
+
I18n.load_path = Dir[::File.join(ProxyTester.root_path, 'lib', 'proxy_tester', 'locales', '*.yml')]
|
27
|
+
I18n.backend.load_translations
|
28
|
+
I18n.enforce_available_locales = true
|
29
|
+
end
|
30
|
+
|
31
|
+
def load_user_database
|
32
|
+
User.load_from(UserDatabase.new)
|
33
|
+
end
|
34
|
+
|
35
|
+
def clear_environment
|
36
|
+
%w{
|
37
|
+
http_proxy
|
38
|
+
https_proxy
|
39
|
+
HTTP_PROXY
|
40
|
+
HTTPS_PROXY
|
41
|
+
}.each { |var| ENV.delete(var) }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
ProxyTester.configure_i18n
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module ProxyTester
|
3
|
+
class User < ActiveRecord::Base
|
4
|
+
#crypt_keeper :password, :encryptor => :aes, :key => ProxyTester.environment.password, salt: 'salt'
|
5
|
+
|
6
|
+
validates :name, presence: true
|
7
|
+
validates :password, presence: true
|
8
|
+
|
9
|
+
def self.load_from(source)
|
10
|
+
source.create_users(self)
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_string
|
14
|
+
sprintf '%s:%s', name, password
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module ProxyTester
|
3
|
+
class PacResult
|
4
|
+
|
5
|
+
attr_reader :proxy, :proxy_port, :request_type
|
6
|
+
|
7
|
+
def initialize(verbatim_content = nil)
|
8
|
+
|
9
|
+
if verbatim_content.blank?
|
10
|
+
parsed_content = {}
|
11
|
+
else
|
12
|
+
parsed_content = parse(verbatim_content) || {}
|
13
|
+
end
|
14
|
+
|
15
|
+
@proxy = parsed_content[:proxy]
|
16
|
+
@proxy_port = parsed_content[:proxy_port]
|
17
|
+
@request_type = parsed_content[:request_type]
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def parse(string)
|
23
|
+
regex.match(string)
|
24
|
+
end
|
25
|
+
|
26
|
+
def regex
|
27
|
+
%r{
|
28
|
+
\A
|
29
|
+
"?
|
30
|
+
(?<request_type>
|
31
|
+
[A-Z]+
|
32
|
+
)
|
33
|
+
(?:
|
34
|
+
\s+
|
35
|
+
(?<proxy>
|
36
|
+
[0-9]{1,3}(:?\.[0-9]{1,3}){3} ||
|
37
|
+
[[:alnum:]]+(?:\.[[:alnum:]]+)*\.?
|
38
|
+
)
|
39
|
+
(?:
|
40
|
+
:
|
41
|
+
(?<proxy_port>[0-9]+)
|
42
|
+
)?
|
43
|
+
)?
|
44
|
+
;?
|
45
|
+
"?
|
46
|
+
\Z
|
47
|
+
}x
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,211 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module ProxyTester
|
3
|
+
module SpecHelper
|
4
|
+
module Capybara
|
5
|
+
include ::Capybara::DSL
|
6
|
+
|
7
|
+
@__runtime = Time.now.strftime('%Y-%m-%d_%H:%M:%S')
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def runtime
|
11
|
+
@__runtime
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def proxy
|
16
|
+
@__proxy
|
17
|
+
end
|
18
|
+
|
19
|
+
def proxy_pac
|
20
|
+
@__proxy_pac
|
21
|
+
end
|
22
|
+
|
23
|
+
def keep_report_directories
|
24
|
+
@__keep_report_directories ||= 5
|
25
|
+
end
|
26
|
+
|
27
|
+
def cleanup_reports
|
28
|
+
old_report_directories.each { |d| FileUtils.rm_rf d }
|
29
|
+
end
|
30
|
+
|
31
|
+
def take_screenshot
|
32
|
+
page.save_screenshot(screenshot_path, full: true)
|
33
|
+
|
34
|
+
screenshot_path
|
35
|
+
end
|
36
|
+
|
37
|
+
def view_screenshot
|
38
|
+
show_image(take_screenshot)
|
39
|
+
end
|
40
|
+
alias_method :show_screenshot, :view_screenshot
|
41
|
+
|
42
|
+
def use_user_agent(agent)
|
43
|
+
page.driver.headers = { "User-Agent" => agent }
|
44
|
+
end
|
45
|
+
|
46
|
+
def visit(url)
|
47
|
+
@__proxy ||= ProxyTester::CapybaraProxy.new
|
48
|
+
@__proxy_pac ||= ProxyTester::CapybaraProxyPac.new
|
49
|
+
|
50
|
+
proxy_pac.url = url
|
51
|
+
|
52
|
+
if !proxy_pac.blank? and !proxy_pac.direct?
|
53
|
+
proxy.host = proxy_pac.host
|
54
|
+
proxy.port = proxy_pac.port
|
55
|
+
end
|
56
|
+
|
57
|
+
register_driver proxy
|
58
|
+
use_driver proxy
|
59
|
+
use_user_agent 'Mozilla/5.0 (X11; Linux x86_64; rv:27.0) Gecko/20100101 Firefox/27.0'
|
60
|
+
|
61
|
+
begin
|
62
|
+
super(url)
|
63
|
+
rescue ::Capybara::Poltergeist::TimeoutError
|
64
|
+
raise ProxyTester::Exceptions::FetchUrlTimeout
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
def use_user(name)
|
70
|
+
@__proxy ||= ProxyTester::CapybaraProxy.new
|
71
|
+
proxy.user = ProxyTester::User.find_by!(name: name)
|
72
|
+
|
73
|
+
rescue ActiveRecord::RecordNotFound
|
74
|
+
ProxyTester.ui_logger.fatal "User \"#{name}\" could not be found. Please make use he's in the user database. Exiting."
|
75
|
+
raise ProxyTester::Exceptions::ProxyUserInvalid, user: name
|
76
|
+
end
|
77
|
+
|
78
|
+
def use_client_ip(ip)
|
79
|
+
@__proxy_pac ||= ProxyTester::CapybaraProxyPac.new
|
80
|
+
|
81
|
+
proxy_pac.client_ip = ip
|
82
|
+
end
|
83
|
+
|
84
|
+
def use_time(time)
|
85
|
+
@__proxy_pac ||= ProxyTester::CapybaraProxyPac.new
|
86
|
+
|
87
|
+
proxy_pac.time = time
|
88
|
+
end
|
89
|
+
|
90
|
+
def use_proxy(*args)
|
91
|
+
@__proxy ||= ProxyTester::CapybaraProxy.new
|
92
|
+
@__proxy_pac ||= ProxyTester::CapybaraProxyPac.new
|
93
|
+
|
94
|
+
if args.first.kind_of? Symbol
|
95
|
+
case args.first
|
96
|
+
when :host
|
97
|
+
proxy.host, proxy.port = args.second.split(/:/)
|
98
|
+
when :pac
|
99
|
+
proxy_pac.pac_file = args.second
|
100
|
+
else
|
101
|
+
fail ProxyTester::Exceptions::SyntaxInvalid, message: "Unknown symbol: #{args.first}"
|
102
|
+
end
|
103
|
+
else
|
104
|
+
proxy.host, proxy.port = args.first.split(/:/)
|
105
|
+
end
|
106
|
+
|
107
|
+
proxy.type = args.last[:type] if args.last.kind_of? Hash
|
108
|
+
end
|
109
|
+
|
110
|
+
def use_timeout(threshold, &block)
|
111
|
+
old_timeout = ::Capybara.default_wait_time
|
112
|
+
::Capybara.default_wait_time = threshold
|
113
|
+
|
114
|
+
block.call
|
115
|
+
ensure
|
116
|
+
::Capybara.default_wait_time = old_timeout
|
117
|
+
end
|
118
|
+
|
119
|
+
private
|
120
|
+
|
121
|
+
def use_driver(proxy)
|
122
|
+
::Capybara.current_driver = proxy.to_sym
|
123
|
+
end
|
124
|
+
|
125
|
+
def register_driver(local_proxy)
|
126
|
+
if local_proxy.blank?
|
127
|
+
options = {
|
128
|
+
js_errors: false,
|
129
|
+
phantomjs_logger: $stderr,
|
130
|
+
}
|
131
|
+
else
|
132
|
+
options = {
|
133
|
+
phantomjs_options: local_proxy.as_phantomjs_arguments,
|
134
|
+
js_errors: false,
|
135
|
+
phantomjs_logger: $stderr,
|
136
|
+
}
|
137
|
+
end
|
138
|
+
|
139
|
+
ProxyTester.ui_logger.debug('options: ' + options.to_s)
|
140
|
+
|
141
|
+
::Capybara.register_driver local_proxy.to_sym do |app|
|
142
|
+
::Capybara::Poltergeist::Driver.new(app, options)
|
143
|
+
end
|
144
|
+
|
145
|
+
::Capybara.run_server = false
|
146
|
+
end
|
147
|
+
|
148
|
+
def screenshot_directory
|
149
|
+
if @__screenshot_dir.blank?
|
150
|
+
@__screenshot_dir = File.join(ProxyTester.config.reports_directory, ProxyTester::SpecHelper::Capybara.runtime)
|
151
|
+
FileUtils.mkdir_p @__screenshot_dir
|
152
|
+
end
|
153
|
+
|
154
|
+
@__screenshot_dir
|
155
|
+
end
|
156
|
+
|
157
|
+
def screenshot_path
|
158
|
+
return @__screenshot_path if @__screenshot_path
|
159
|
+
|
160
|
+
@__screenshot_path = File.join(screenshot_directory, "#{example.full_description.parameterize}.png")
|
161
|
+
end
|
162
|
+
|
163
|
+
def old_report_directories
|
164
|
+
Dir.glob(File.join(ProxyTester.config.reports_directory, '*')).keep_if { |d| FileTest.directory? d }.sort.reverse.drop(keep_report_directories)
|
165
|
+
end
|
166
|
+
|
167
|
+
def operating_system
|
168
|
+
case RUBY_PLATFORM.downcase
|
169
|
+
when /win32/
|
170
|
+
:win32
|
171
|
+
when /linux/
|
172
|
+
:linux
|
173
|
+
when /darwin/
|
174
|
+
:darwin
|
175
|
+
else
|
176
|
+
:unknown
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def show_image(image)
|
181
|
+
viewer = case operating_system
|
182
|
+
when :linux
|
183
|
+
'xdg-open'
|
184
|
+
when :win32
|
185
|
+
'start'
|
186
|
+
when :darwin
|
187
|
+
'open'
|
188
|
+
else
|
189
|
+
'xdg-open'
|
190
|
+
end
|
191
|
+
|
192
|
+
system("#{viewer} #{image.shellescape}")
|
193
|
+
end
|
194
|
+
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
RSpec.configure do |c|
|
200
|
+
c.include ProxyTester::SpecHelper::Capybara
|
201
|
+
|
202
|
+
c.before :each do
|
203
|
+
@__proxy = ProxyTester::CapybaraProxy.new
|
204
|
+
end
|
205
|
+
|
206
|
+
c.before :all do
|
207
|
+
cleanup_reports
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
Capybara.default_driver = :poltergeist
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'rspec'
|
3
|
+
|
4
|
+
module ProxyTester
|
5
|
+
class RspecRunner
|
6
|
+
private
|
7
|
+
|
8
|
+
attr_reader :test_cases_directory
|
9
|
+
|
10
|
+
public
|
11
|
+
|
12
|
+
def initialize(options = {})
|
13
|
+
@test_cases_directory = options.fetch(:test_cases_directory, ProxyTester.config.test_cases_directory)
|
14
|
+
end
|
15
|
+
|
16
|
+
def run(tags)
|
17
|
+
ProxyTester.load_user_database
|
18
|
+
ProxyTester.clear_environment
|
19
|
+
|
20
|
+
RSpec.configure do |c|
|
21
|
+
c.color = true
|
22
|
+
c.add_formatter 'Fuubar'
|
23
|
+
c.filter_run_including to_filter(tags) unless tags.blank?
|
24
|
+
end
|
25
|
+
|
26
|
+
$LOAD_PATH << test_cases_directory
|
27
|
+
RSpec::Core::Runner.run(spec_files)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def to_filter(a)
|
33
|
+
Hash[*a.collect { |e| e.to_sym }.zip([true] * a.size).flatten]
|
34
|
+
end
|
35
|
+
|
36
|
+
def spec_files
|
37
|
+
files = ::Dir.glob(::File.join(test_cases_directory, '**', '*_spec.rb'))
|
38
|
+
ProxyTester.ui_logger.warn "No spec files found at \"#{test_cases_directory}\"." if files.blank?
|
39
|
+
|
40
|
+
files
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module ProxyTester
|
3
|
+
class TemplateFile
|
4
|
+
|
5
|
+
attr_reader :path
|
6
|
+
|
7
|
+
def initialize(path)
|
8
|
+
@path = ::File.expand_path(path)
|
9
|
+
end
|
10
|
+
|
11
|
+
def name
|
12
|
+
::File.basename(path, '.*').to_sym
|
13
|
+
end
|
14
|
+
|
15
|
+
def read
|
16
|
+
::File.read(path)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module ProxyTester
|
3
|
+
class TemplateRepository
|
4
|
+
private
|
5
|
+
|
6
|
+
attr_reader :root_directory, :creator
|
7
|
+
|
8
|
+
public
|
9
|
+
|
10
|
+
def initialize(root_directory = ::File.expand_path('../../../files', __FILE__), creator = TemplateFile)
|
11
|
+
@root_directory = ::File.expand_path(root_directory)
|
12
|
+
@creator = creator
|
13
|
+
end
|
14
|
+
|
15
|
+
def find(name)
|
16
|
+
path = ::File.join(root_directory, "#{name.to_s}.erb")
|
17
|
+
fail Exceptions::ErbTemplateIsUnknown, "Template \"#{name}\" could not be found!" unless ::File.exist? path
|
18
|
+
|
19
|
+
creator.new(path)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ProxyTester
|
2
|
+
class UiLogger
|
3
|
+
def initialize
|
4
|
+
@logger = ::Logger.new($stderr)
|
5
|
+
end
|
6
|
+
|
7
|
+
def level=(l)
|
8
|
+
@logger.level = case l.to_s.to_sym
|
9
|
+
when :unknown
|
10
|
+
::Logger::UNKNOWN
|
11
|
+
when :fatal
|
12
|
+
::Logger::FATAL
|
13
|
+
when :error
|
14
|
+
::Logger::ERROR
|
15
|
+
when :warn
|
16
|
+
::Logger::WARN
|
17
|
+
when :info
|
18
|
+
::Logger::INFO
|
19
|
+
when :debug
|
20
|
+
::Logger::DEBUG
|
21
|
+
else
|
22
|
+
::Logger::ERROR
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def method_missing(method, *args, &block)
|
27
|
+
@logger.public_send method, *args
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|