test_server 0.0.11 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,9 +1,31 @@
1
- # TestServer
1
+ # TestServer - the endpoint for your proxy server tests
2
2
 
3
- TODO: Write a gem description
3
+ [![Build Status](https://travis-ci.org/dg-vrnetze/test_server.png?branch=master)](https://travis-ci.org/dg-vrnetze/test_server)
4
+ [![Code Climate](https://codeclimate.com/github/dg-vrnetze/test_server.png)](https://codeclimate.com/github/dg-vrnetze/test_server)
5
+ [![Coverage Status](https://coveralls.io/repos/dg-vrnetze/test_server/badge.png?branch=master)](https://coveralls.io/r/dg-vrnetze/test_server?branch=master)
6
+ [![Gem Version](https://badge.fury.io/rb/test_server.png)](http://badge.fury.io/rb/test_server)
7
+
8
+
9
+ `test_server` *serves two main purposes:*
10
+
11
+ * end point for your proxy tests.
12
+ * load generator via simple website driven by javascript
13
+
14
+ *Behind the scenes it mainly uses ...*
15
+
16
+ * [jquery](http://jquery.com/)
17
+ * [sinatra](http://www.sinatrarb.com)
18
+ * and other wonderfull gems
19
+
20
+ *Possible use cases:*
21
+
22
+ * Provide static data via web application to make your tests reliable
23
+ * Generate load via browsers typically used by your users
4
24
 
5
25
  ## Installation
6
26
 
27
+ ### Rubygems
28
+
7
29
  Add this line to your application's Gemfile:
8
30
 
9
31
  gem 'test_server'
@@ -16,9 +38,81 @@ Or install it yourself as:
16
38
 
17
39
  $ gem install test_server
18
40
 
41
+ ### Archlinux
42
+
43
+ ```bash
44
+ # Install via yaourt
45
+ yaourt -S test_server
46
+
47
+ # Install via cower + makepkg
48
+ cower -d test_server
49
+ cd <dir>
50
+ makepkg -is
51
+ ```
52
+
53
+ ### Firewall rules
54
+
55
+ Following you can find an example configuration for iptables to secure your server. It
56
+ opens ports only for your proxy servers to access `test_server`.
57
+
58
+ ```bash
59
+ # default policies
60
+ iptables -P INPUT -j DROP
61
+ iptables -P FORWARD -j DROP
62
+ iptables -P OUTPUT -j ACCEPT
63
+
64
+ # user defined chains
65
+ iptables -N TCP
66
+ iptables -N UDP
67
+
68
+ # rules
69
+ iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
70
+ iptables -A INPUT -i lo -j ACCEPT
71
+ iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
72
+ iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
73
+ iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
74
+ iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j TCP
75
+ iptables -A INPUT -p tcp -m recent --set --name TCP-PORTSCAN --mask 255.255.255.255 --rsource -j REJECT --reject-with tcp-reset
76
+ iptables -A INPUT -p udp -m recent --set --name UDP-PORTSCAN --mask 255.255.255.255 --rsource -j REJECT --reject-with icmp-port-unreachable
77
+ iptables -A INPUT -j REJECT --reject-with icmp-proto-unreachable
78
+ iptables -A TCP -p tcp -m recent --update --seconds 60 --name TCP-PORTSCAN --mask 255.255.255.255 --rsource -j REJECT --reject-with tcp-reset
79
+ iptables -A TCP -s <public ips proxies> -p tcp -m tcp --dport 8000 -j ACCEPT
80
+ iptables -A UDP -p udp -m recent --update --seconds 60 --name UDP-PORTSCAN --mask 255.255.255.255 --rsource -j REJECT --reject-with icmp-port-unreachable
81
+ COMMIT
82
+ ```
83
+
84
+ ## Screenshots
85
+
86
+ To be defined...
87
+
19
88
  ## Usage
20
89
 
21
- TODO: Write usage instructions here
90
+ *Starting Web Application*
91
+
92
+ ```
93
+ % test_server serve
94
+ ```
95
+
96
+ *Load testing*
97
+
98
+ Point your browser to `http://<your-domain.org>/v1/test/javascript/xhr/string`.
99
+ Fill out the form and run test.
100
+
101
+ *Testing your proxies*
102
+
103
+ * Write tests using `capybara` + `rspec`.
104
+
105
+ or
106
+
107
+ * Use [`proxy_tester`](https://github.com/dg-vrnetze/proxy_tester) for a fully
108
+ featured solution for writing proxy tests (**RECOMMENDED**). `proxy_tester` uses
109
+ `capybara` and `rspec`, but provides lots of helpers for writing proxy tests
110
+ to reduce the work on your site.
111
+
112
+ ## List of test end points
113
+
114
+ To be defined. Hopefully I can provide a `controller` which handles this within
115
+ the application.
22
116
 
23
117
  ## Contributing
24
118
 
data/Rakefile CHANGED
@@ -68,7 +68,7 @@ end
68
68
  namespace :package do
69
69
  desc 'build arch linux package'
70
70
  task :archlinux => [gem_file, archlinux_build_directory] do
71
- FileUtils.mv ::File.join(pkg_directory, "#{software}-#{version}.gem"), archlinux_build_directory
71
+ #FileUtils.mv ::File.join(pkg_directory, "#{software}-#{version}.gem"), archlinux_build_directory
72
72
 
73
73
  generator = Filegen::Rubygen.new
74
74
  template = File.read(File.expand_path('../share/archlinux/PKGBUILD.sh.erb', __FILE__))
Binary file
@@ -1,14 +1,6 @@
1
1
  //= require jquery
2
2
  //= require bootstrap-sass/dist/js/bootstrap
3
3
 
4
- //$(document).ready(function(){
5
- // $(".lp_show_fields").click(function(e){
6
- // e.preventDefault()
7
- // $(".lp_fields_close, .lp_fields_open").toggle();
8
- // $(".lp_button_show_fields_close, .lp_button_show_fields_open").toggle();
9
- // });
10
- //});
11
-
12
4
  function escapeHTML(s) {
13
5
  return String(s).replace(/&(?!\w+;)/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
14
6
  }
@@ -24,13 +16,15 @@ function result(url, timeout, start_time, result) {
24
16
  }
25
17
 
26
18
  $('#result').toggle(true);
27
- $('#result tr:last').after('<tr class="ts-result-row ' + result_klass + '"><td>' + url + '</td><td>' + timeout + '</td><td>' + run_time + '</td><td>' + result + '</td></tr>');
19
+ $('#result_table_header').after('<tr class="ts-result-row ' + result_klass + '"><td>' + url + '</td><td>' + timeout + '</td><td>' + run_time + '</td><td>' + result + '</td></tr>');
20
+
28
21
  }
29
22
 
30
23
  $(document).ready(function(){
31
24
  $("#reset").click(function () {
32
25
  $('#form')[0].reset();
33
26
  $('.ts-result-row').remove();
27
+ $('#result').toggle(false);
34
28
  });
35
29
  });
36
30
 
@@ -38,28 +32,53 @@ $(document).ready(function(){
38
32
  $("#submit").click(function (e) {
39
33
  e.preventDefault();
40
34
 
41
- var url = escapeHTML($('#url').val())
42
- var timeout = escapeHTML($('#timeout').val() * 1000)
43
- var count = escapeHTML($('#count').val())
35
+ var url = escapeHTML($('#url').val());
36
+ var timeout = escapeHTML($('#timeout').val() * 1000);
37
+ var count = escapeHTML($('#count').val());
44
38
 
45
- for (var i = 0, limit = count ; i < limit; i++) {
39
+ repeat_requests(url, count, timeout);
40
+ });
41
+ });
46
42
 
47
- var start_time = new Date().getTime();
43
+ function repeat_requests(url, count, timeout) {
44
+ var repeat = $('#repeat').is(":checked");
45
+ var requests = [];
48
46
 
49
- $.ajax({
50
- url: url,
51
- timeout: timeout,
52
- cache: false,
53
- success: function() {
54
- result(url, timeout, start_time, 'ok');
55
- },
56
- error: function(){
57
- result(url, timeout, start_time, 'fail');
58
- }
59
- });
47
+ var success_callback = function() {
48
+ $('#request-spinner').toggle(false);
49
+
50
+ if (repeat == true) {
51
+ setTimeout(repeat_requests(url, count, timeout), 1000);
60
52
  }
53
+ };
61
54
 
62
- });
63
- });
55
+ var failure_callback = function() {
56
+ $('#request-spinner').toggle(false);
57
+ };
58
+
59
+ $('#request-spinner').toggle(true);
64
60
 
65
- $('#notification').modal('hide');
61
+ for(i = 0; i < count; i++) {
62
+ requests.push(sendAjax(url, timeout));
63
+ }
64
+
65
+ $.when.apply(undefined, requests).then(function(results){success_callback()}, function(results){failure_callback()});
66
+ }
67
+
68
+ function sendAjax(url, timeout) {
69
+ var start_time = new Date().getTime();
70
+
71
+ return $.ajax(
72
+ {
73
+ url: url,
74
+ timeout: timeout,
75
+ cache: false,
76
+ success: function() {
77
+ result(url, timeout, start_time, 'ok');
78
+ },
79
+ error: function(){
80
+ result(url, timeout, start_time, 'fail');
81
+ }
82
+ }
83
+ );
84
+ }
@@ -110,6 +110,10 @@ a:focus {
110
110
  display: inline-block;
111
111
  }
112
112
 
113
+ .ts-field-repeat {
114
+ @extend .checkbox;
115
+ }
116
+
113
117
  .ts-field-count {
114
118
  @extend .form-control;
115
119
  display: inline-block;
@@ -148,3 +152,12 @@ a:focus {
148
152
  .ts-result-failed-request {
149
153
  color: red;
150
154
  }
155
+
156
+ #request-spinner {
157
+ margin: 20px;
158
+ display: none;
159
+ }
160
+
161
+ .ts-inline {
162
+ display: inline;
163
+ }
@@ -2,6 +2,12 @@
2
2
  module TestServer
3
3
  module App
4
4
  class JavascriptController < ApplicationController
5
+ use Rack::Cors do
6
+ allow do
7
+ origins '*'
8
+ resource '*', :headers => :any, :methods => [:get, :post]
9
+ end
10
+ end
5
11
 
6
12
  before do
7
13
  param :no_cache, Boolean, default: false
@@ -11,18 +17,17 @@ module TestServer
11
17
 
12
18
  configure_caching(params)
13
19
  end
14
- get '/xhr/string' do
20
+
21
+ get '/xhr/url/?' do
15
22
  param :count, Integer, default: 10
16
23
  param :timeout, Integer, default: 10
17
24
  param :url, String
25
+ param :repeat, Boolean, default: false
18
26
 
19
27
  @count = params[:count]
20
28
  @url = params[:url]
21
29
  @timeout = params[:timeout]
22
-
23
- #@data = encode do
24
- # generate_string(params[:count])
25
- #end
30
+ @repeat = params[:repeat]
26
31
 
27
32
  haml :'xhr/show', layout: :application
28
33
  end
@@ -10,29 +10,22 @@
10
10
  .ts-form-group
11
11
  %label{ for: :url}
12
12
  = t('views.javascript.xhr.fields.url')
13
- %input#url.ts-field-url{ type: :url, name: :url, value: @url }
14
- %button#submit.ts-button-submit{type: 'submit', value: t('views.application.buttons.submit'), 'data-toggle' => 'modal', 'data-target' => '#notification'}
13
+ %input#url.ts-field-url{ type: :url, name: :url, value: @url, placeholder: 'http://www.example.org' }
14
+ .ts-field-repeat
15
+ %label
16
+ %input#repeat{ type: :checkbox, value: @repeat }
17
+ = t('views.javascript.xhr.fields.repeat')
18
+ %button#submit.ts-button-submit{type: 'submit', name: 'submit', value: t('views.application.buttons.submit'), 'data-toggle' => 'modal', 'data-target' => '#notification'}
15
19
  = t('views.application.buttons.submit')
16
- %a#reset.ts-button-reset{href: '#'}
20
+ %a#reset.ts-button-reset{href: '#', name: 'reset'}
17
21
  = t('views.application.buttons.reset')
22
+ %span.ts-inline#request-spinner
23
+ %img{ src: '/assets/ajax-loader.gif', alt: t('views.javascript.xhr.spinner.text') }
24
+ = t('views.javascript.xhr.spinner.text')
18
25
 
19
26
  %table#result.ts-result-table
20
- %th= t('views.javascript.xhr.result_table.url')
21
- %th= t('views.javascript.xhr.result_table.timeout')
22
- %th= t('views.javascript.xhr.result_table.runtime')
23
- %th= t('views.javascript.xhr.result_table.status')
24
-
25
- .modal#notification{ role: 'dialog' , tabindex: '-1'}
26
- .modal-dialog
27
- .modal-content
28
- .modal-header
29
- %button.ts-button-close-headline{ type: 'button', 'data-dismiss' => 'modal', 'aria-hidden' => 'true'}
30
- &times;
31
- %h4
32
- = t('views.dialogs.notification.title')
33
- .modal-body
34
- %p.ts-text-centered
35
- = t('views.javascript.xhr.notification.text')
36
- .modal-footer
37
- %button.ts-button-close{ type: 'button', 'data-dismiss' => 'modal' }
38
- = t('views.application.buttons.close')
27
+ %tr#result_table_header
28
+ %th= t('views.javascript.xhr.result_table.url')
29
+ %th= t('views.javascript.xhr.result_table.timeout')
30
+ %th= t('views.javascript.xhr.result_table.runtime')
31
+ %th= t('views.javascript.xhr.result_table.status')
@@ -62,11 +62,12 @@ en:
62
62
  url: URL
63
63
  count: Count
64
64
  timeout: Timeout (s)
65
+ repeat: Repeat Requests
65
66
  result_table:
66
67
  url: URL
67
68
  runtime: Runtime (ms)
68
69
  timeout: Timeout (ms)
69
70
  status: Status
70
- notification:
71
- text: You asked me to send out requests.
71
+ spinner:
72
+ text: Requests were sent. Waiting for results.
72
73
 
@@ -1,4 +1,4 @@
1
1
  #main TestServer
2
2
  module TestServer
3
- VERSION = '0.0.11'
3
+ VERSION = '0.1.0'
4
4
  end
@@ -1,6 +1,14 @@
1
1
  # encoding: utf-8
2
2
  module TestServer
3
3
  module WebHelper
4
+ def base_url
5
+ mutex = Mutex.new
6
+
7
+ mutex.synchronize do
8
+ @base_url ||= "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}"
9
+ end
10
+ end
11
+
4
12
  def h(text)
5
13
  Rack::Utils.escape_html(text)
6
14
  end
data/lib/test_server.rb CHANGED
@@ -14,6 +14,7 @@ require 'sinatra/streaming'
14
14
  require 'json'
15
15
  require 'uglifier'
16
16
  require 'rack/protection'
17
+ require 'rack/cors'
17
18
  require 'thor'
18
19
  require 'base64'
19
20
  require 'zlib'
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec cucumber
4
+ bundle exec rspec spec/features
data/script/bootstrap ADDED
@@ -0,0 +1,63 @@
1
+ #!/bin/sh
2
+
3
+ function puts() {
4
+ echo -e $1 >&2
5
+ }
6
+
7
+ function install_package() {
8
+ if which pacman > /dev/null; then
9
+ if [ -z "$(pacman -Ss "^$1\$" | grep installed)" ]; then
10
+ puts "Installing $1"
11
+ sudo pacman -S --noconfirm $1
12
+ fi
13
+ else
14
+ puts "Please install $1 from your operating system repository."
15
+ fi
16
+ }
17
+
18
+ function install_gem() {
19
+ if which gem > /dev/null; then
20
+ if [ -z "$(gem list -l "^$1\$")" ]; then
21
+ puts "Installing $1"
22
+ gem install --no-ri --no-rdoc $1
23
+ fi
24
+ else
25
+ puts "Please install $1 via rubygems."
26
+ fi
27
+ }
28
+
29
+ function install_node() {
30
+ if which npm > /dev/null; then
31
+ if [ -z "$(npm list -g $1 | grep bower)" ]; then
32
+ puts "Installing $1"
33
+ npm install -g $1
34
+ fi
35
+ else
36
+ puts "Please install $1 via npm"
37
+ fi
38
+ }
39
+
40
+ function file_exist() {
41
+ if [ -f $1 ]; then
42
+ puts "$2"
43
+ return 0
44
+ else
45
+ puts "Warning file \"$1\" does not exist. Maybe this can cause problems during bootstrapping"
46
+ return 1
47
+ fi
48
+ }
49
+
50
+ echo "Bootstrapping development environment for application.." >&2
51
+
52
+ install_package ruby
53
+ install_package nodejs
54
+ install_package phantomjs
55
+
56
+ install_gem bundler
57
+ bundle install
58
+
59
+ file_exist "$HOME/.npmrc" "I found a .npmrc. Please make sure your npm configuration works with global install for users. If not please add something like \"prefix = /home/user/.local/share/npm\" to your .bashrc/.zshrc + export PATH=/home/user/.local/share/npm/bin:\$PATH"
60
+
61
+ install_node bower
62
+
63
+ bower install
data/script/ci ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec script/test_web &
4
+
5
+ bundle exec rake test:coveralls
6
+
7
+ pkill -P $$
data/script/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH << ::File.expand_path('../../lib', __FILE__)
4
+
5
+ # Pull in all of the gems including those in the `test` group
6
+ require 'bundler'
7
+ Bundler.require :default, :test, :development
8
+
9
+ require 'irb'
10
+ require 'irb/completion'
11
+ require 'test_server'
12
+
13
+ ARGV.clear
14
+ IRB.start
data/script/release ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec rake gem:release
data/script/test_web ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'sinatra/base'
4
+
5
+ class Webserver < Sinatra::Base
6
+ set :logging, :true
7
+
8
+ post '/rspec/:test' do
9
+ case params[:test]
10
+ when 'send'
11
+ return params[:data]
12
+ else
13
+ not_found
14
+ end
15
+ end
16
+
17
+ get '/rspec/:test' do
18
+ params[:test]
19
+ end
20
+ end
21
+
22
+ Webserver.set :bind,'127.0.0.1'
23
+ Webserver.run!
data/script/unit_test ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec script/test_web &
4
+
5
+ bundle exec rspec
6
+
7
+ pkill -P $$
@@ -9,9 +9,9 @@ license=('MIT')
9
9
  depends=('ruby' 'libatomic_ops')
10
10
  install=${pkgname}.install
11
11
  makedepends=(rubygems filegen phantomjs)
12
- #source=(http://gems.rubyforge.org/gems/$pkgname-$pkgver.gem)
12
+ source=(http://gems.rubyforge.org/gems/$pkgname-$pkgver.gem)
13
13
  backup=etc/${pkgname}/config.yaml
14
- source=($pkgname-$pkgver.gem)
14
+ #source=($pkgname-$pkgver.gem)
15
15
  noextract=($pkgname-$pkgver.gem)
16
16
  <%= lookup('sha') %>
17
17
 
@@ -2,17 +2,56 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe 'Fetch data via javascript', :js do
5
- context '/xhr/string/' do
6
- it 'submits requests to url' do
5
+ before :each do
6
+ config = Class.new do
7
+ include FeduxOrg::Stdlib::Filesystem
8
+
9
+ def root_directory
10
+ ::File.expand_path('../../../', __FILE__)
11
+ end
12
+
13
+ def log_level
14
+ :unknown
15
+ end
16
+
17
+ def access_log
18
+ File.join(working_directory, 'access.log')
19
+ end
20
+
21
+ def reload_config_signal
22
+ 'USR1'
23
+ end
24
+ end.new
25
+
26
+ TestServer.config = config
7
27
 
8
- visit '/xhr/string/'
28
+ Capybara.app = Rack::Builder.new do
29
+ map '/' do
30
+ run TestServer::App::JavascriptController
31
+ end
32
+
33
+ map '/assets' do
34
+ run TestServer::App::AssetsController.assets
35
+ end
36
+ end
37
+ end
38
+
39
+ context '/xhr/url/' do
40
+ it 'submits requests to url' do
41
+ url = '/v1/test/javascript/xhr/url'
42
+ visit '/xhr/url/'
9
43
 
10
44
  within '#form' do
11
- fill_in 'url', :with => '§ASDF$$'
45
+ fill_in 'url', :with => url
46
+ fill_in 'count', :with => 1
12
47
  end
13
48
 
14
- click_button '#submit'
15
- click_on('Search')
49
+
50
+ click_button('submit')
51
+
52
+ first '.ts-result-row'
53
+
54
+ expect(page).to have_content(url)
16
55
  end
17
56
 
18
57
  end
@@ -8,9 +8,9 @@ end
8
8
 
9
9
  RSpec.configure do |c|
10
10
  c.include TestServer::SpecHelper::Capybara
11
- c.beforc(:all) do
12
- Capybara.default_engine = :rack_test
13
- Capybara.javascript_engine = :poltergeist
11
+ c.before(:all) do
12
+ Capybara.default_driver = :rack_test
13
+ Capybara.javascript_driver = :poltergeist
14
14
  end
15
15
  end
16
16
 
data/test_server.gemspec CHANGED
@@ -36,5 +36,7 @@ Gem::Specification.new do |spec|
36
36
  spec.add_runtime_dependency 'pager'
37
37
  spec.add_runtime_dependency 'sinatra-param'
38
38
  spec.add_runtime_dependency 'sinatra-contrib'
39
+ spec.add_runtime_dependency 'sinatra-advanced-routes'
40
+ spec.add_runtime_dependency 'rack-cors'
39
41
  spec.add_runtime_dependency 'thor'
40
42
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test_server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-03 00:00:00.000000000 Z
12
+ date: 2014-04-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -299,6 +299,38 @@ dependencies:
299
299
  - - ! '>='
300
300
  - !ruby/object:Gem::Version
301
301
  version: '0'
302
+ - !ruby/object:Gem::Dependency
303
+ name: sinatra-advanced-routes
304
+ requirement: !ruby/object:Gem::Requirement
305
+ none: false
306
+ requirements:
307
+ - - ! '>='
308
+ - !ruby/object:Gem::Version
309
+ version: '0'
310
+ type: :runtime
311
+ prerelease: false
312
+ version_requirements: !ruby/object:Gem::Requirement
313
+ none: false
314
+ requirements:
315
+ - - ! '>='
316
+ - !ruby/object:Gem::Version
317
+ version: '0'
318
+ - !ruby/object:Gem::Dependency
319
+ name: rack-cors
320
+ requirement: !ruby/object:Gem::Requirement
321
+ none: false
322
+ requirements:
323
+ - - ! '>='
324
+ - !ruby/object:Gem::Version
325
+ version: '0'
326
+ type: :runtime
327
+ prerelease: false
328
+ version_requirements: !ruby/object:Gem::Requirement
329
+ none: false
330
+ requirements:
331
+ - - ! '>='
332
+ - !ruby/object:Gem::Version
333
+ version: '0'
302
334
  - !ruby/object:Gem::Dependency
303
335
  name: thor
304
336
  requirement: !ruby/object:Gem::Requirement
@@ -334,6 +366,7 @@ files:
334
366
  - LICENSE.md
335
367
  - README.md
336
368
  - Rakefile
369
+ - app/assets/images/ajax-loader.gif
337
370
  - app/assets/javascripts/application.js
338
371
  - app/assets/stylesheets/application.scss
339
372
  - app/controllers/application_controller.rb
@@ -383,6 +416,13 @@ files:
383
416
  - lib/test_server/ui_logger.rb
384
417
  - lib/test_server/version.rb
385
418
  - lib/test_server/web_helper.rb
419
+ - script/acceptance_test
420
+ - script/bootstrap
421
+ - script/ci
422
+ - script/console
423
+ - script/release
424
+ - script/test_web
425
+ - script/unit_test
386
426
  - share/archlinux/Makefile
387
427
  - share/archlinux/PKGBUILD.sh.erb
388
428
  - share/archlinux/config.yaml.erb