kymera 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.idea/.name +1 -0
- data/.idea/.rakeTasks +7 -0
- data/.idea/encodings.xml +5 -0
- data/.idea/inspectionProfiles/Project_Default.xml +7 -0
- data/.idea/inspectionProfiles/profiles_settings.xml +7 -0
- data/.idea/kymera.iml +187 -0
- data/.idea/misc.xml +5 -0
- data/.idea/modules.xml +9 -0
- data/.idea/scopes/scope_settings.xml +5 -0
- data/.idea/vcs.xml +7 -0
- data/.idea/workspace.xml +1035 -0
- data/Gemfile +13 -0
- data/LICENSE.txt +22 -0
- data/README.md +96 -0
- data/Rakefile +1 -0
- data/bin/kymera +63 -0
- data/kymera.gemspec +31 -0
- data/lib/kymera/broker.rb +112 -0
- data/lib/kymera/client.rb +98 -0
- data/lib/kymera/config/config.rb +36 -0
- data/lib/kymera/cucumber/cucumber_html_parser.rb +80 -0
- data/lib/kymera/cucumber/cucumber_results_parser.rb +93 -0
- data/lib/kymera/cucumber/cucumber_test_runner.rb +76 -0
- data/lib/kymera/cucumber/dry_run_formatter.rb +31 -0
- data/lib/kymera/cucumber/test_parser.rb +36 -0
- data/lib/kymera/mongo_driver.rb +39 -0
- data/lib/kymera/platform_utils.rb +64 -0
- data/lib/kymera/results_bus.rb +26 -0
- data/lib/kymera/szmq/szmq.rb +252 -0
- data/lib/kymera/test_results_collector.rb +126 -0
- data/lib/kymera/version.rb +3 -0
- data/lib/kymera/worker.rb +83 -0
- data/lib/kymera.rb +88 -0
- data/lib/spec/broker_spec.rb +25 -0
- data/lib/spec/client_spec.rb +21 -0
- data/lib/spec/client_test_run_spec.rb +3 -0
- data/lib/spec/config_options.txt +51 -0
- data/lib/spec/full_run_for_linux_spec.rb +44 -0
- data/lib/spec/full_run_spec.rb +44 -0
- data/lib/spec/get_bus_data.rb +43 -0
- data/lib/spec/html_parser_spec.rb +61 -0
- data/lib/spec/html_parsing_alg.txt +31 -0
- data/lib/spec/json_message_example.txt +6 -0
- data/lib/spec/mongo_driver_spec.rb +5 -0
- data/lib/spec/plain_broker_spec.rb +44 -0
- data/lib/spec/plain_reply_socket_spec.rb +13 -0
- data/lib/spec/plain_request_socket_spec.rb +13 -0
- data/lib/spec/result_bus_spec.rb +13 -0
- data/lib/spec/results_parser_test_run_spec.rb +18 -0
- data/lib/spec/send_bus_data.rb +16 -0
- data/lib/spec/startup_broker_bus_collector_spec.rb +35 -0
- data/lib/spec/test_file_paths_spec.rb +2 -0
- data/lib/spec/worker_spec.rb +15 -0
- data/lib/spec/worker_test_run_spec.rb +21 -0
- data/lib/spec/zmq_network_test_spec.rb +13 -0
- metadata +228 -0
@@ -0,0 +1,83 @@
|
|
1
|
+
require_relative 'szmq/szmq'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Kymera
|
5
|
+
class Worker
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
config = Kymera::Config.new
|
9
|
+
@test_address = config.worker["broker_address"]
|
10
|
+
@results_address = config.worker["result_collector_address"]
|
11
|
+
@result_bus_address = config.worker["result_bus_address"]
|
12
|
+
@zmq = SZMQ.new
|
13
|
+
#For the moment I am using a push/pull configuration for running of tests. Initial runs indicated that this may not work as all tests are being sent to just one
|
14
|
+
#worker at a time instead of load balancing them. It may be more advantageous to use a request/reply structure for sending tests and managing the test run queue
|
15
|
+
#manually.
|
16
|
+
@test_socket = @zmq.socket(@test_address, 'reply')
|
17
|
+
@results_socket = @zmq.socket(@results_address, 'push')
|
18
|
+
@result_bus_socket = @zmq.socket(@result_bus_address, 'pub')
|
19
|
+
@result_bus_socket.connect
|
20
|
+
@test_socket.connect
|
21
|
+
#Even though this is a push socket, I am connecting instead of binding because the static point is going to be the pull socket where the results are aggregated
|
22
|
+
#Static points are bound, dynamic points are connected
|
23
|
+
@results_socket.connect
|
24
|
+
end
|
25
|
+
|
26
|
+
def listen
|
27
|
+
puts "Worker started..."
|
28
|
+
@test_socket.receive do |message|
|
29
|
+
#This is a preliminary kill command. I will need to give more thought into the life cycle of the workers
|
30
|
+
if message == 'STOP'
|
31
|
+
stop
|
32
|
+
break
|
33
|
+
else
|
34
|
+
results = run_test(message)
|
35
|
+
@results_socket.send_message(results)
|
36
|
+
@test_socket.send_message ''
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
#I need to pass in the runner and runner options. Thinking about using JSON to get those options and instantiate a runner object based on that information
|
43
|
+
#The idea is to be able to take in any number of different test runners (cucumber/rspec) without having the restart the worker object
|
44
|
+
#This is why passing in the runner on worker instantiation isnt really an option
|
45
|
+
def run_test(test)
|
46
|
+
test = JSON.parse(test)
|
47
|
+
runner = get_runner(test["runner"], test["options"], test["run_id"])
|
48
|
+
test_path = nil
|
49
|
+
if Kymera.is_linux?
|
50
|
+
if test["test"].include? 'c:'
|
51
|
+
test_path = test["test"].gsub('c:','~')
|
52
|
+
else
|
53
|
+
test_path = test["test"].gsub('C:','~')
|
54
|
+
end
|
55
|
+
else
|
56
|
+
test_path = test["test"]
|
57
|
+
end
|
58
|
+
|
59
|
+
results = runner.run_test(test_path, test['branch'])
|
60
|
+
JSON.generate({:run_id => test["run_id"], :test_count => test["test_count"], :runner => test["runner"], :results => results, :start_time => test["start_time"]} )
|
61
|
+
end
|
62
|
+
|
63
|
+
def stop
|
64
|
+
@test_socket.close
|
65
|
+
@results_socket.close
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
#TODO - I would like to add a way to dynamically add runners so that a user can custom build a runner and use it with this gem.
|
71
|
+
#Right now I am just doing some simple if/then logic to get predefined runners.
|
72
|
+
def get_runner(runner, options, run_id)
|
73
|
+
if runner.downcase == 'cucumber'
|
74
|
+
Kymera::Cucumber::Runner.new(options, run_id, @result_bus_socket)
|
75
|
+
else
|
76
|
+
nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
data/lib/kymera.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'ffi-rzmq'
|
2
|
+
require_relative 'kymera/szmq/szmq'
|
3
|
+
require_relative 'kymera/cucumber/cucumber_test_runner'
|
4
|
+
require_relative 'kymera/worker'
|
5
|
+
require_relative 'kymera/broker'
|
6
|
+
require_relative 'kymera/client'
|
7
|
+
require_relative 'kymera/cucumber/test_parser'
|
8
|
+
require_relative 'kymera/results_bus'
|
9
|
+
require_relative 'kymera/platform_utils'
|
10
|
+
require_relative 'kymera/test_results_collector'
|
11
|
+
require_relative 'kymera/cucumber/cucumber_results_parser'
|
12
|
+
require_relative '../lib/kymera/cucumber/cucumber_html_parser'
|
13
|
+
require_relative 'kymera/config/config'
|
14
|
+
|
15
|
+
module Kymera
|
16
|
+
|
17
|
+
#Start a test run
|
18
|
+
def self.run_tests(tests, test_runner, options, branch, real_time = true)
|
19
|
+
Kymera::Client.new(real_time).run_tests(tests, test_runner, options, branch)
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
#Start the test broker
|
24
|
+
def self.start_broker
|
25
|
+
Kymera::Broker.new.start_broker
|
26
|
+
end
|
27
|
+
|
28
|
+
#Start a worker
|
29
|
+
def self.start_worker
|
30
|
+
Kymera::Worker.new.listen
|
31
|
+
end
|
32
|
+
|
33
|
+
#Start the results collector
|
34
|
+
def self.start_collector
|
35
|
+
Kymera::TestResultsCollector.new.listen
|
36
|
+
end
|
37
|
+
|
38
|
+
#Start the results bus
|
39
|
+
def self.start_bus
|
40
|
+
Kymera::ResultsBus.new.start_bus
|
41
|
+
end
|
42
|
+
|
43
|
+
#Generate the default config.yaml file
|
44
|
+
def self.generate_config
|
45
|
+
require 'yaml'
|
46
|
+
puts "Generating congfig.yaml"
|
47
|
+
config_options = {
|
48
|
+
"client" => {
|
49
|
+
"broker_address" => 'tcp://127.0.0.1:5550',
|
50
|
+
"results_bus_address" => 'tcp://127.0.0.1:7001'
|
51
|
+
},
|
52
|
+
"broker" =>{
|
53
|
+
"client_listening_port" => '5550',
|
54
|
+
"worker_listening_port" => '5552',
|
55
|
+
"internal_worker_port" => '5551',
|
56
|
+
"number_of_connections" => '20'
|
57
|
+
|
58
|
+
},
|
59
|
+
"worker" => {
|
60
|
+
'broker_address' => 'tcp://127.0.0.1:5552',
|
61
|
+
'result_collector_address' => 'tcp://127.0.0.1:5556',
|
62
|
+
'result_bus_address' => 'tcp://127.0.0.1:7000'
|
63
|
+
},
|
64
|
+
'result_collector' =>{
|
65
|
+
'inc_listening_port' => '5556',
|
66
|
+
'result_bus_address' => 'tcp://127.0.0.1:7000',
|
67
|
+
'send_mongo_results' => false,
|
68
|
+
'mongodb_address' => '127.0.0.1',
|
69
|
+
'mongodb_port' => 27017,
|
70
|
+
'mongodb_database_name' => 'default_db',
|
71
|
+
'mongodb_collection_name' => 'default_collection'
|
72
|
+
|
73
|
+
},
|
74
|
+
'result_bus' => {
|
75
|
+
'pub_port' => '7000',
|
76
|
+
'sub_port' => '7001'
|
77
|
+
}
|
78
|
+
}
|
79
|
+
puts Dir.pwd
|
80
|
+
puts File.join(Dir.pwd, '/kymera_config.yaml')
|
81
|
+
config_file = File.open(File.join(Dir.pwd, '/kymera_config.yaml'), 'w+')
|
82
|
+
config_options.to_yaml.split('\n').each do |line|
|
83
|
+
config_file.write(line)
|
84
|
+
end
|
85
|
+
config_file.close
|
86
|
+
config_options.to_yaml
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'ffi-rzmq'
|
2
|
+
require_relative '../../lib/kymera'
|
3
|
+
#require_relative '../../lib/kymera/v_3/kymera'
|
4
|
+
#
|
5
|
+
#broker = Kymera::Broker.new
|
6
|
+
#broker.set_test_queue('tcp://*:5556', 'tcp://*:5557')
|
7
|
+
#broker.set_confiq_queue('tcp://*:5540', 'tcp://*:5541')
|
8
|
+
#broker.set_result_queue('tcp://*:5530', 'tcp://*:5531')
|
9
|
+
#broker.start_broker
|
10
|
+
|
11
|
+
#zmq = Kymera::SZMQ.new
|
12
|
+
#
|
13
|
+
#front_end = zmq.socket('tcp://*:5555', 'router')
|
14
|
+
#back_end = zmq.socket('tcp://*:5556', 'dealer')
|
15
|
+
#zmq.start_proxy(front_end, back_end)
|
16
|
+
|
17
|
+
#context = ZMQ::Context.new
|
18
|
+
#front_end = context.socket(ZMQ::ROUTER)
|
19
|
+
#back_end = context.socket(ZMQ::DEALER)
|
20
|
+
|
21
|
+
broker = Kymera::Broker.new('tcp://*:5550', 'tcp://127.0.0.1:5551', 'tcp://*:5552', 20)
|
22
|
+
broker.start_broker
|
23
|
+
|
24
|
+
|
25
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'ffi-rzmq'
|
2
|
+
require_relative '../../lib/kymera/v_4/kymera'
|
3
|
+
#client = Kymera::Client.new('tcp://localhost:5556')
|
4
|
+
#client.send_message("This is the message")
|
5
|
+
zmq = SZMQ.new
|
6
|
+
|
7
|
+
client = zmq.socket('tcp://127.0.0.1:5555', 'request')
|
8
|
+
client.connect
|
9
|
+
|
10
|
+
reply = client.send_message("This is a test")
|
11
|
+
puts reply
|
12
|
+
|
13
|
+
#context = ZMQ::Context.new
|
14
|
+
#socket = context.socket(ZMQ::PUSH)
|
15
|
+
#socket.bind('tcp://*:5555')
|
16
|
+
#socket.send_string("This is a message")
|
17
|
+
#reply = ''
|
18
|
+
#unless socket.recv_string(reply) == -1
|
19
|
+
# socket.recv_string(reply)
|
20
|
+
# puts reply
|
21
|
+
#end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
This is a list of different config options for the kymera gem
|
2
|
+
|
3
|
+
Client -
|
4
|
+
Broker address: ip address and port where the test broker is located
|
5
|
+
Results bus address: the ip address and port where the results bus is located
|
6
|
+
|
7
|
+
Broker -
|
8
|
+
Client Listening Port: what port to listen to for incoming test run requests
|
9
|
+
Worker Listening Port: What port to listen to for incoming worker connections
|
10
|
+
Number of Connections: This parameter is used to set the number of threads the broker will spawn for running tests. It is important to note that this number
|
11
|
+
needs to be larger than the number of connected workers. If not, the workers connected in excess of the number of threads will not be utilized
|
12
|
+
There are plans to change this behavior in the future
|
13
|
+
|
14
|
+
Worker -
|
15
|
+
Broker address: the ip address and port where the broker is located
|
16
|
+
Results Collector Address: the ip address and port where the results collector is located
|
17
|
+
Results Bus Address: the ip address and port where the results bus is located
|
18
|
+
|
19
|
+
Results Collector -
|
20
|
+
Incoming Listening Port: The port number where results will be coming in
|
21
|
+
Results Bus Address: The ip address and port where the outgoing aggregated results will be sent
|
22
|
+
Use Mongo DB: This is a bool telling the collector whether or not to send the results to a mongodb instance
|
23
|
+
MongoDB Address: The ip address and port number where the completed results will be sent for archiving
|
24
|
+
MongoDB Name: The name of the database that test collector will send the results to
|
25
|
+
MongoDB Collection Name: The name of the collection that the results will belong to
|
26
|
+
|
27
|
+
Results Bus -
|
28
|
+
Publish Port: The port which will be used for publishers to publish messages to the bus
|
29
|
+
Subscription Port: The port which will be used for subscribers to subscribe to
|
30
|
+
|
31
|
+
|
32
|
+
Passable arguments for each component of Kymera
|
33
|
+
|
34
|
+
Client -
|
35
|
+
real_time : This parameter is used to tell the client whether or not to display the realtime output from all of the test workers
|
36
|
+
tests : The file or director that contains the tests that need to be run
|
37
|
+
test_runner : This is the runner that Kymera will used to run the tests. Currently only Cucumber is supported. There are plans to extend that later
|
38
|
+
test_runner_options: These are the options specific to the test runner.
|
39
|
+
branch : This is the branch that the Kymera Workers should pull from to get the code that the user wishes to execute or test against
|
40
|
+
|
41
|
+
Broker -
|
42
|
+
none
|
43
|
+
|
44
|
+
Worker -
|
45
|
+
none
|
46
|
+
|
47
|
+
Results Collector -
|
48
|
+
none
|
49
|
+
|
50
|
+
Results Bus -
|
51
|
+
none
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'kymera'
|
2
|
+
threads = []
|
3
|
+
|
4
|
+
trap('INT') do
|
5
|
+
threads.each do |thread|
|
6
|
+
thread.kill
|
7
|
+
end unless threads.empty?
|
8
|
+
end
|
9
|
+
|
10
|
+
#Results bus thread
|
11
|
+
threads << Thread.new {
|
12
|
+
bus = Kymera::ResultsBus.new('tcp://*:7000', 'tcp://*:7001')
|
13
|
+
bus.start_bus
|
14
|
+
}
|
15
|
+
|
16
|
+
#Broker thread
|
17
|
+
threads << Thread.new {
|
18
|
+
broker = Kymera::Broker.new('tcp://*:5550', 'tcp://127.0.0.1:5551', 'tcp://127.0.0.1:5552', 20)
|
19
|
+
broker.start_broker
|
20
|
+
}
|
21
|
+
|
22
|
+
#Results collector thread
|
23
|
+
threads << Thread.new {
|
24
|
+
results_collector = Kymera::TestResultsCollector.new('tcp://*:5556', 'tcp://127.0.0.1:7000')
|
25
|
+
results_collector.listen
|
26
|
+
}
|
27
|
+
|
28
|
+
#Worker thread
|
29
|
+
threads << Thread.new {
|
30
|
+
worker = Kymera::Worker.new('tcp://127.0.0.1:5552', 'tcp://127.0.0.1:5556', 'tcp://127.0.0.1:7000')
|
31
|
+
worker.listen
|
32
|
+
}
|
33
|
+
|
34
|
+
#give stuff a chance to start up
|
35
|
+
sleep 2
|
36
|
+
|
37
|
+
client = Kymera::Client.new('tcp://127.0.0.1:5550','tcp://127.0.0.1:7001')
|
38
|
+
client.run_tests('~/apollo/source/integration_tests/features/login_and_session/logout.feature', 'cucumber', ['-p default'])
|
39
|
+
#client.run_tests('c:/apollo/source/integration_tests/features', 'cucumber', ['-p dev'])
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'kymera'
|
2
|
+
threads = []
|
3
|
+
|
4
|
+
trap('INT') do
|
5
|
+
threads.each do |thread|
|
6
|
+
thread.kill
|
7
|
+
end unless threads.empty?
|
8
|
+
end
|
9
|
+
|
10
|
+
#Results bus thread
|
11
|
+
threads << Thread.new {
|
12
|
+
bus = Kymera::ResultsBus.new('tcp://*:7000', 'tcp://*:7001')
|
13
|
+
bus.start_bus
|
14
|
+
}
|
15
|
+
|
16
|
+
#Broker thread
|
17
|
+
threads << Thread.new {
|
18
|
+
broker = Kymera::Broker.new('tcp://*:5550', 'tcp://127.0.0.1:5551', 'tcp://127.0.0.1:5552', 20)
|
19
|
+
broker.start_broker
|
20
|
+
}
|
21
|
+
|
22
|
+
#Results collector thread
|
23
|
+
threads << Thread.new {
|
24
|
+
results_collector = Kymera::TestResultsCollector.new('tcp://*:5556', 'tcp://127.0.0.1:7000')
|
25
|
+
results_collector.listen
|
26
|
+
}
|
27
|
+
|
28
|
+
#Worker thread
|
29
|
+
threads << Thread.new {
|
30
|
+
worker = Kymera::Worker.new('tcp://127.0.0.1:5552', 'tcp://127.0.0.1:5556', 'tcp://127.0.0.1:7000')
|
31
|
+
worker.listen
|
32
|
+
}
|
33
|
+
|
34
|
+
#give stuff a chance to start up
|
35
|
+
sleep 2
|
36
|
+
|
37
|
+
client = Kymera::Client.new('tcp://127.0.0.1:5550','tcp://127.0.0.1:7001')
|
38
|
+
client.run_tests('c:/apollo/source/integration_tests/features/login_and_session/logout.feature', 'cucumber', ['-p default'])
|
39
|
+
client.run_tests('c:/apollo/source/integration_tests/features', 'cucumber', ['-p dev'])
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative '../../lib/kymera'
|
2
|
+
|
3
|
+
zmq = Kymera::SZMQ.new
|
4
|
+
sub_socket = zmq.socket('tcp://127.0.0.1:7001', 'sub')
|
5
|
+
|
6
|
+
#sub_socket2 = zmq.socket('tcp://127.0.0.1:7001', 'sub')
|
7
|
+
|
8
|
+
sub_socket.subscribe('results') do |channel, message|
|
9
|
+
$stdout << "."
|
10
|
+
puts channel
|
11
|
+
puts message
|
12
|
+
end
|
13
|
+
#Thread.new {
|
14
|
+
# sub_socket2.subscribe('BVTCQD0CZ11') do |channel, message|
|
15
|
+
# $stdout << "."
|
16
|
+
# end
|
17
|
+
#}
|
18
|
+
#
|
19
|
+
#
|
20
|
+
#sub_socket.subscribe('end_BVTCQD0CZ11') do |channel, message|
|
21
|
+
# puts channel
|
22
|
+
# puts message
|
23
|
+
#end
|
24
|
+
|
25
|
+
|
26
|
+
#context = ZMQ::Context.new
|
27
|
+
#socket = context.socket(ZMQ::SUB)
|
28
|
+
#socket.setsockopt(ZMQ::SUBSCRIBE, 'end_BVTCQD0CZ11')
|
29
|
+
#socket.connect('tcp://127.0.0.1:7001')
|
30
|
+
#
|
31
|
+
#socket_2 = context.socket(ZMQ::SUB)
|
32
|
+
#socket_2.setsockopt(ZMQ::SUBSCRIBE, 'BVTCQD0CZ11')
|
33
|
+
#socket_2.connect('tcp://127.0.0.1:7001')
|
34
|
+
#
|
35
|
+
#channel = ''
|
36
|
+
#message = ''
|
37
|
+
#
|
38
|
+
#loop do
|
39
|
+
# socket.recv_string(channel)
|
40
|
+
# socket.recv_string(message)
|
41
|
+
# puts channel
|
42
|
+
# puts message
|
43
|
+
#end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
|
2
|
+
# require 'kymera'
|
3
|
+
require_relative '../../lib/kymera/cucumber/cucumber_html_parser'
|
4
|
+
|
5
|
+
results = "Using the default profile...
|
6
|
+
[36m@smoke_prod[0m
|
7
|
+
Feature: Login
|
8
|
+
|
9
|
+
As a user
|
10
|
+
I want to login
|
11
|
+
So that I can do freight matching
|
12
|
+
|
13
|
+
# JS - no longer valid
|
14
|
+
# Scenario: e. the footer is present on the login page
|
15
|
+
# Given I am at the login page
|
16
|
+
# Then I see the Terms and Conditions link
|
17
|
+
# And I see the Privacy link
|
18
|
+
# And I see the DAT copyright string
|
19
|
+
Scenario: f. the footer is present on the welcome page[90m # c:\apollo\source\integration_tests\features\login_and_session\login.feature:39[0m
|
20
|
+
[32mGiven I am logged in[90m # features/step_definitions/login/login_steps.rb:5[0m[0m
|
21
|
+
[32mThen I see the home page has the Terms and Conditions link[90m # features/step_definitions/login/login_steps.rb:109[0m[0m
|
22
|
+
[32mAnd I see the home page has the Privacy link[90m # features/step_definitions/login/login_steps.rb:113[0m[0m
|
23
|
+
[32mAnd I see the home page has the DAT copyright string[90m # features/step_definitions/login/login_steps.rb:117[0m[0m
|
24
|
+
|
25
|
+
1 scenario ([32m1 passed[0m)
|
26
|
+
4 steps ([32m4 passed[0m)
|
27
|
+
0m14.218s
|
28
|
+
Using the default profile...
|
29
|
+
[36m@smoke_prod[0m
|
30
|
+
Feature: Login
|
31
|
+
|
32
|
+
As a user
|
33
|
+
I want to login
|
34
|
+
So that I can do freight matching
|
35
|
+
|
36
|
+
Scenario: d. invalid username, valid password[90m # c:\apollo\source\integration_tests\features\login_and_session\login.feature:28[0m
|
37
|
+
[32mGiven I login with invalid username and valid password[90m # features/step_definitions/login/login_steps.rb:14[0m[0m
|
38
|
+
[32mThen I see an invalid login message[90m # features/step_definitions/login/login_steps.rb:78[0m[0m
|
39
|
+
|
40
|
+
1 scenario ([32m1 passed[0m)
|
41
|
+
2 steps ([32m2 passed[0m)
|
42
|
+
0m22.000s
|
43
|
+
Using the default profile...
|
44
|
+
[36m@smoke_prod[0m
|
45
|
+
Feature: Login
|
46
|
+
|
47
|
+
As a user
|
48
|
+
I want to login
|
49
|
+
So that I can do freight matching
|
50
|
+
|
51
|
+
Scenario: c. valid username, invalid password[90m # c:\apollo\source\integration_tests\features\login_and_session\login.feature:23[0m
|
52
|
+
[32mGiven I login with valid username and invalid password[90m # features/step_definitions/login/login_steps.rb:9[0m[0m
|
53
|
+
[32mThen I see an invalid login message[90m # features/step_definitions/login/login_steps.rb:78[0m[0m
|
54
|
+
|
55
|
+
1 scenario ([32m1 passed[0m)
|
56
|
+
2 steps ([32m2 passed[0m)
|
57
|
+
0m23.261s"
|
58
|
+
|
59
|
+
|
60
|
+
parsed_results = Kymera::Cucumber::HTMLResultsParser.to_html(results)
|
61
|
+
puts parsed_results
|
@@ -0,0 +1,31 @@
|
|
1
|
+
1. take the results and parse them into an array with new line (\n) as the delimiter
|
2
|
+
2. iterate over the array
|
3
|
+
3. if line starts with "Using"
|
4
|
+
3a. create a string variable with an open div hmtl tag with the class feature
|
5
|
+
3b. append a open paragraph html tag to that variable
|
6
|
+
3c. append the line to the variable
|
7
|
+
|
8
|
+
4. until line starts with "Using"
|
9
|
+
4a. move to the next line
|
10
|
+
4b. if the line contains \e
|
11
|
+
4c. iterate over the line and for every \e do the following
|
12
|
+
4d. if the next 3 characters match 36m
|
13
|
+
4e. append an open span tag to the string variable with the style color blue
|
14
|
+
4f. if the next 3 characters match 90m
|
15
|
+
4g.append an open span tag to the string variable with the style color gray
|
16
|
+
4h. if the next 3 characters match 31m
|
17
|
+
4i. append an open span tag to the string variable with the style color red
|
18
|
+
4j if the next 3 characters match 0m
|
19
|
+
4k. append a closing span tag to the string variable and start again at step 4a
|
20
|
+
4l. if there are no other instances of \e
|
21
|
+
4m. append the remainder of the line and a close span tag to the string variable
|
22
|
+
4n. if there are more instances of \e
|
23
|
+
4o. until you reach the next instance of \e
|
24
|
+
4p. continue iterating over the line, appending each character to the sting variable
|
25
|
+
4q. when you reach the next instance of \e start again at step 4d
|
26
|
+
|
27
|
+
add check for characters after 0m
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'ffi-rzmq'
|
2
|
+
|
3
|
+
context = ZMQ::Context.new
|
4
|
+
front_end_socket = context.socket(ZMQ::ROUTER)
|
5
|
+
front_end_socket.bind('tcp://*:5550')
|
6
|
+
|
7
|
+
back_end_socket = context.socket(ZMQ::DEALER)
|
8
|
+
back_end_socket.bind('tcp://*:5551')
|
9
|
+
|
10
|
+
ZMQ::Device.new(front_end_socket, back_end_socket)
|
11
|
+
|
12
|
+
#require 'rubygems'
|
13
|
+
#require 'ffi-rzmq'
|
14
|
+
#
|
15
|
+
#context = ZMQ::Context.new
|
16
|
+
#frontend = context.socket(ZMQ::ROUTER)
|
17
|
+
#backend = context.socket(ZMQ::DEALER)
|
18
|
+
#
|
19
|
+
#frontend.bind('tcp://*:5550')
|
20
|
+
#backend.connect('tcp://127.0.0.1:5551')
|
21
|
+
#
|
22
|
+
#message = []
|
23
|
+
#
|
24
|
+
#frontend.recv_strings message
|
25
|
+
#puts message
|
26
|
+
#
|
27
|
+
#backend.send_strings(message)
|
28
|
+
|
29
|
+
#poller = ZMQ::Poller.new
|
30
|
+
#poller.register(frontend, ZMQ::POLLIN)
|
31
|
+
#poller.register(backend, ZMQ::POLLIN)
|
32
|
+
#
|
33
|
+
#loop do
|
34
|
+
# poller.poll(:blocking)
|
35
|
+
# poller.readables.each do |socket|
|
36
|
+
# if socket === frontend
|
37
|
+
# socket.recv_strings(messages = [])
|
38
|
+
# backend.send_strings(messages)
|
39
|
+
# elsif socket === backend
|
40
|
+
# socket.recv_strings(messages = [])
|
41
|
+
# frontend.send_strings(messages)
|
42
|
+
# end
|
43
|
+
# end
|
44
|
+
#end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative '../../lib/kymera'
|
2
|
+
|
3
|
+
bus = Kymera::ResultsBus.new('tcp://*:7000', 'tcp://*:7001')
|
4
|
+
bus.start_bus
|
5
|
+
|
6
|
+
#context = ZMQ::Context.new
|
7
|
+
#front_end_socket = context.socket(ZMQ::XSUB)
|
8
|
+
#back_end_socket = context.socket(ZMQ::XPUB)
|
9
|
+
#
|
10
|
+
#front_end_socket.connect('tcp://127.0.0.1:7000')
|
11
|
+
#back_end_socket.bind('tcp://*:7001')
|
12
|
+
#
|
13
|
+
#ZMQ::Device.new(front_end_socket, back_end_socket)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative '../../lib/kymera'
|
2
|
+
#zmq = Kymera::SZMQ.new
|
3
|
+
#
|
4
|
+
#socket = zmq.socket('tcp://*:5556', 'pull')
|
5
|
+
#socket.bind
|
6
|
+
#socket.receive do |results|
|
7
|
+
# puts results
|
8
|
+
#end
|
9
|
+
|
10
|
+
#context = ZMQ::Context.new
|
11
|
+
#socket = context.socket(ZMQ::PULL)
|
12
|
+
#socket.bind('tcp://127.0.0.1:5555')
|
13
|
+
#message = ''
|
14
|
+
#socket.recv_string(message)
|
15
|
+
#puts message
|
16
|
+
|
17
|
+
results_parser = Kymera::TestResultsCollector.new('tcp://*:5556', 'tcp://127.0.0.1:7000')
|
18
|
+
results_parser.listen
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative '../../lib/kymera'
|
2
|
+
|
3
|
+
zmq = Kymera::SZMQ.new
|
4
|
+
#
|
5
|
+
pub_socket = zmq.socket('tcp://127.0.0.1:7000', 'pub')
|
6
|
+
pub_socket.connect
|
7
|
+
pub_socket.publish_message('results', 'these are results')
|
8
|
+
|
9
|
+
#context = ZMQ::Context.new
|
10
|
+
#socket = context.socket(ZMQ::PUB)
|
11
|
+
#socket.connect('tcp://127.0.0.1:7000')
|
12
|
+
#sleep 5
|
13
|
+
#socket.send_string('results', ZMQ::SNDMORE)
|
14
|
+
#socket.send_string('these are some more results')
|
15
|
+
|
16
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'kymera'
|
2
|
+
threads = []
|
3
|
+
|
4
|
+
trap('INT') do
|
5
|
+
threads.each do |thread|
|
6
|
+
thread.kill
|
7
|
+
end unless threads.empty?
|
8
|
+
@close = true
|
9
|
+
end
|
10
|
+
|
11
|
+
#Results bus thread
|
12
|
+
threads << Thread.new {
|
13
|
+
# bus = Kymera::ResultsBus.new('tcp://*:7000', 'tcp://*:7001')
|
14
|
+
# bus.start_bus
|
15
|
+
Kymera.start_bus
|
16
|
+
}
|
17
|
+
|
18
|
+
#Broker thread
|
19
|
+
threads << Thread.new {
|
20
|
+
# broker = Kymera::Broker.new('tcp://*:5550', 'tcp://*:5551', 'tcp://*:5552', 20)
|
21
|
+
# broker.start_broker
|
22
|
+
Kymera.start_broker
|
23
|
+
}
|
24
|
+
|
25
|
+
#Results collector thread
|
26
|
+
threads << Thread.new {
|
27
|
+
# results_collector = Kymera::TestResultsCollector.new('tcp://*:5556', 'tcp://127.0.0.1:7000')
|
28
|
+
# results_collector = Kymera::TestResultsCollector.new('tcp://*:5556', 'tcp://10.6.49.60:7000')
|
29
|
+
# results_collector.listen
|
30
|
+
Kymera.start_collector
|
31
|
+
}
|
32
|
+
|
33
|
+
loop do
|
34
|
+
raise SystemExit if @close
|
35
|
+
end
|