kymera 0.1.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.
- 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
|