oats 0.0.1
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.
- data/.gitignore +6 -0
- data/Gemfile +15 -0
- data/README.txt +165 -0
- data/Rakefile +2 -0
- data/bin/agent +204 -0
- data/bin/oats +10 -0
- data/bin/occ +29 -0
- data/bin/results_cleanup +6 -0
- data/doc/COPYING +55 -0
- data/doc/LICENSE +55 -0
- data/doc/OATS_Framework.doc +0 -0
- data/doc/classes/ApplicationLogs.html +239 -0
- data/doc/classes/Campaign.html +843 -0
- data/doc/classes/CommandlineOptions.html +131 -0
- data/doc/classes/Driver.html +182 -0
- data/doc/classes/Hash.html +137 -0
- data/doc/classes/Ide.html +194 -0
- data/doc/classes/MapSelenium.html +197 -0
- data/doc/classes/Net.html +107 -0
- data/doc/classes/Oats/OatsFilterError.html +119 -0
- data/doc/classes/Oats.html +998 -0
- data/doc/classes/OatsAssertError.html +119 -0
- data/doc/classes/OatsBadInput.html +119 -0
- data/doc/classes/OatsData.html +290 -0
- data/doc/classes/OatsError.html +117 -0
- data/doc/classes/OatsExit.html +117 -0
- data/doc/classes/OatsLock.html +254 -0
- data/doc/classes/OatsMain.html +182 -0
- data/doc/classes/OatsMysqlError.html +113 -0
- data/doc/classes/OatsMysqlMissingInput.html +113 -0
- data/doc/classes/OatsReportError.html +113 -0
- data/doc/classes/OatsSetupError.html +119 -0
- data/doc/classes/OatsTestError.html +119 -0
- data/doc/classes/OatsTestExit.html +119 -0
- data/doc/classes/OatsTestLocateError.html +120 -0
- data/doc/classes/OatsVerifyError.html +119 -0
- data/doc/classes/Ragent.html +397 -0
- data/doc/classes/Rclient.html +236 -0
- data/doc/classes/Report.html +368 -0
- data/doc/classes/Reports.html +244 -0
- data/doc/classes/RestApi.html +333 -0
- data/doc/classes/RhttpClient.html +236 -0
- data/doc/classes/Rimap.html +170 -0
- data/doc/classes/Rmysql.html +176 -0
- data/doc/classes/Roptions.html +131 -0
- data/doc/classes/Rselenium.html +233 -0
- data/doc/classes/Rssh.html +138 -0
- data/doc/classes/Runnable.html +174 -0
- data/doc/classes/SFTriggers.html +206 -0
- data/doc/classes/Selenium/Client/Driver.html +211 -0
- data/doc/classes/Selenium/Client.html +107 -0
- data/doc/classes/Selenium.html +107 -0
- data/doc/classes/SystemCapture.html +304 -0
- data/doc/classes/TestCase.html +418 -0
- data/doc/classes/TestData.html +235 -0
- data/doc/classes/TestList.html +264 -0
- data/doc/classes/Tools.html +244 -0
- data/doc/classes/Util.html +201 -0
- data/doc/classes/Variation.html +206 -0
- data/doc/fr_class_index.html +92 -0
- data/doc/fr_method_index.html +465 -0
- data/doc/index.html +23 -0
- data/doc/oats_httpd.conf +32 -0
- data/doc/oats_user.yml +25 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/deep_merge/.gitignore +2 -0
- data/lib/deep_merge/core.rb +195 -0
- data/lib/deep_merge/deep_merge.rb +1 -0
- data/lib/deep_merge/deep_merge_hash.rb +28 -0
- data/lib/deep_merge/rails_compat.rb +27 -0
- data/lib/oats/application_logs.rb +163 -0
- data/lib/oats/build_id.rb +58 -0
- data/lib/oats/commandline_options.rb +128 -0
- data/lib/oats/diff.rb +278 -0
- data/lib/oats/driver.rb +492 -0
- data/lib/oats/ide.rb +227 -0
- data/lib/oats/keywords.rb +67 -0
- data/lib/oats/log4r_init.rb +14 -0
- data/lib/oats/mysql.rb +97 -0
- data/lib/oats/oats.rb +637 -0
- data/lib/oats/oats_data.rb +400 -0
- data/lib/oats/oats_exceptions.rb +25 -0
- data/lib/oats/oats_lock.rb +261 -0
- data/lib/oats/oats_selenium_api.rb +639 -0
- data/lib/oats/oselenium.rb +189 -0
- data/lib/oats/ossh.rb +36 -0
- data/lib/oats/patches_for_eventmachine_12.10.rb +66 -0
- data/lib/oats/ragent.rb +321 -0
- data/lib/oats/rclient.rb +42 -0
- data/lib/oats/report.rb +207 -0
- data/lib/oats/roptions.rb +88 -0
- data/lib/oats/test_case.rb +510 -0
- data/lib/oats/test_data.rb +98 -0
- data/lib/oats/test_list.rb +141 -0
- data/lib/oats/unixdiff.rb +75 -0
- data/lib/oats/util.rb +125 -0
- data/lib/oats/version.rb +3 -0
- data/lib/oats.rb +36 -0
- data/nbproject/configs/agent.properties +0 -0
- data/nbproject/configs/gr.properties +0 -0
- data/nbproject/project.properties +10 -0
- data/nbproject/project.xml +17 -0
- data/oats.gemspec +42 -0
- data/oats_ini.yml +258 -0
- data/oats_tests/Gemfile +18 -0
- data/oats_tests/aut_ini.yml +30 -0
- data/oats_tests/bin/oats +8 -0
- data/oats_tests/environments/qa.yml +4 -0
- data/oats_tests/environments/qa_chrome.yml +4 -0
- data/oats_tests/examples/core/coreExamples.yml +8 -0
- data/oats_tests/examples/core/expectedException.rb +39 -0
- data/oats_tests/examples/core/ok_verify.rb +2 -0
- data/oats_tests/examples/core/ok_verify.rb_ok/out/myfile.txt +1 -0
- data/oats_tests/examples/core/ok_verify.rb_ok/out/myfile2.txt +1 -0
- data/oats_tests/examples/core/ok_verify.rb_ok/rats_test.log +2 -0
- data/oats_tests/examples/core/unexpectedException.rb +30 -0
- data/oats_tests/examples/examples.yml +13 -0
- data/oats_tests/examples/gui/guiExamples.yml +7 -0
- data/oats_tests/examples/gui/seleniumGoogle.rb +10 -0
- data/oats_tests/examples/gui/webdriverGoogle.rb +9 -0
- data/oats_tests/examples/keywords/SampleXlList-1.xls +0 -0
- data/oats_tests/examples/keywords/SampleXlList-2.xls +0 -0
- data/oats_tests/examples/keywords/SampleXlLists.xls +0 -0
- data/oats_tests/examples/keywords/keywordsDriver.rb +1 -0
- data/oats_tests/examples/keywords/keywordsExamples.yml +8 -0
- data/oats_tests/examples/keywords/keywordsTC1.yml +5 -0
- data/oats_tests/examples/keywords/keywordsTestlist.yml +16 -0
- data/oats_tests/examples/needsWork/addTestDynamically.rb +4 -0
- data/oats_tests/examples/needsWork/emailVerify.rb +34 -0
- data/oats_tests/examples/needsWork/testSql/rtest.sql +6 -0
- data/oats_tests/examples/needsWork/testSql/rtest.yml +11 -0
- data/oats_tests/examples/occTest/occTest.rb +13 -0
- data/oats_tests/examples/occTest/occTest_1.rb +1 -0
- data/oats_tests/examples/occTest/occTest_1_1.rb +1 -0
- data/oats_tests/examples/occTest/occTest_1_2.rb +1 -0
- data/oats_tests/examples/occTest/occTest_1_3.rb +1 -0
- data/oats_tests/examples/occTest/occTest_1_4.rb +1 -0
- data/oats_tests/examples/occTest/occTest_2.rb +1 -0
- data/oats_tests/examples/occTest/occTest_2_1.rb +1 -0
- data/oats_tests/examples/occTest/occTest_2_2.rb +1 -0
- data/oats_tests/examples/occTest/occTest_2_3.rb +1 -0
- data/oats_tests/examples/occTest/occTest_2_4.rb +1 -0
- data/oats_tests/examples/occTest/occTest_3.rb +1 -0
- data/oats_tests/examples/occTest/occTest_3_1.rb +1 -0
- data/oats_tests/examples/occTest/occTest_3_2.rb +1 -0
- data/oats_tests/examples/occTest/occTest_3_3.rb +1 -0
- data/oats_tests/examples/occTest/occTest_3_4.rb +1 -0
- data/oats_tests/examples/occTest/occTest_4.rb +1 -0
- data/oats_tests/examples/occTest/occTestlist.yml +9 -0
- data/oats_tests/examples/occTest/occTestlist_1.yml +9 -0
- data/oats_tests/examples/occTest/occTestlist_2.yml +9 -0
- data/oats_tests/examples/occTest/occTestlist_3.yml +9 -0
- data/oats_tests/examples/occTest/variation1.yml +4 -0
- data/oats_tests/examples/occTest/variation2.yml +4 -0
- data/oats_tests/examples/testFileLocationUnitTests/extn_driver.rb +4 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder/oats.yml +3 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder/t1.rb +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder1/t1.yml +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder1/t1_1.yml +3 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder2/oats.yml +3 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder2/t1.rb +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/folder2/t1.yml +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/no_yaml.rb +3 -0
- data/oats_tests/examples/testFileLocationUnitTests/post_yaml.rb +1 -0
- data/oats_tests/examples/testFileLocationUnitTests/t1.rb +4 -0
- data/oats_tests/examples/testFileLocationUnitTests/t1.yml +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/t1_1.yml +3 -0
- data/oats_tests/examples/testFileLocationUnitTests/testDir/oats.yml +3 -0
- data/oats_tests/examples/testFileLocationUnitTests/testDir/t1.rb +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/testDir/t1.yml +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/testDir2/t1.rb +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/testDir2/t1.yml +2 -0
- data/oats_tests/examples/testFileLocationUnitTests/unitTestList.yml +36 -0
- data/oats_tests/examples/testFileLocationUnitTests/yml_driver.rb +2 -0
- data/oats_tests/lib/business.rb +28 -0
- data/oats_tests/lib/sample_xl_lists.rb +37 -0
- data/test/common_test_unit_setup.rb +21 -0
- data/test/test_basic.rb +16 -0
- data/test/test_selenium.rb +16 -0
- data/test/test_xl_lists.rb +16 -0
- metadata +291 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
module Oats
|
|
2
|
+
|
|
3
|
+
# TestList has array of variations
|
|
4
|
+
class TestList
|
|
5
|
+
# Path of test relative to the dir_tests library
|
|
6
|
+
attr_reader :id
|
|
7
|
+
# Absolute path to the test.yml
|
|
8
|
+
attr_reader :path
|
|
9
|
+
# Array of Variation structures
|
|
10
|
+
attr_accessor :variations
|
|
11
|
+
# Parent variation, start and end times
|
|
12
|
+
attr_accessor :parent_variation, :start_time, :end_time, :pre_test, :post_test
|
|
13
|
+
@@current = nil
|
|
14
|
+
# Currently active test list
|
|
15
|
+
def TestList.current
|
|
16
|
+
@@current
|
|
17
|
+
end
|
|
18
|
+
def TestList.current=(list)
|
|
19
|
+
@@current = list
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def TestList.txt_tests(pth)
|
|
23
|
+
list = IO.readlines(pth)
|
|
24
|
+
list = list.collect{|x| f=x.chomp.sub(/#.*/,'').strip}
|
|
25
|
+
return list.delete_if { |x| x == '' }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def add_variation(var)
|
|
29
|
+
lv = self.variations.last
|
|
30
|
+
lv.end_time = Time.now.to_i if lv and ! lv.end_time
|
|
31
|
+
if variations.empty? or variations.last.name != 'default'
|
|
32
|
+
variations << Variation.new(var,self)
|
|
33
|
+
else
|
|
34
|
+
variations.last.name = var
|
|
35
|
+
variations.last.start_time = Time.now.to_i
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def testlist_hash
|
|
40
|
+
variation = nil
|
|
41
|
+
top_level_variations = self.variations[0]
|
|
42
|
+
unless top_level_variations.nil? or top_level_variations.tests.nil?
|
|
43
|
+
cur_test_list = top_level_variations.tests[0]
|
|
44
|
+
if cur_test_list
|
|
45
|
+
if cur_test_list.instance_of?(TestCase)
|
|
46
|
+
variation = top_level_variations
|
|
47
|
+
else
|
|
48
|
+
variation = cur_test_list.variations[0]
|
|
49
|
+
end
|
|
50
|
+
# Oats seems to set the end_time of variations incorrectly as equal to
|
|
51
|
+
# start time until very end. Compensate for it by borrowing the time from the TestList
|
|
52
|
+
variation.end_time = cur_test_list.end_time
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
return nil unless variation
|
|
56
|
+
return variation.variation_hash(pre_test, post_test)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def initialize(id, path)
|
|
60
|
+
@id = id
|
|
61
|
+
@path = path
|
|
62
|
+
@start_time = Time.now.to_i
|
|
63
|
+
@variations = []
|
|
64
|
+
add_variation('default')
|
|
65
|
+
$log.info "**** TEST LIST [#{@id}]" if id
|
|
66
|
+
# raise OatsError, "Encountered recursive inclusion of test lists: [#{tree_id}]"
|
|
67
|
+
if @@current # Make this list a child of current list
|
|
68
|
+
@parent_variation = @@current.variations.last
|
|
69
|
+
@parent_variation.tests << self
|
|
70
|
+
else # record the root
|
|
71
|
+
$oats_info['test_files'] = self
|
|
72
|
+
end
|
|
73
|
+
@@current = self # Repoint the current list
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# TestList has an array of these
|
|
78
|
+
class Variation
|
|
79
|
+
attr_reader :tests
|
|
80
|
+
attr_accessor :start_time, :env_name, :name, :list_name, :end_time, :total, :pass, :fail, :skip, :parent
|
|
81
|
+
def initialize(var,list)
|
|
82
|
+
@parent = list
|
|
83
|
+
@name = var
|
|
84
|
+
@tests = []
|
|
85
|
+
@start_time = Time.now.to_i
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def variation_hash(pre_test, post_test)
|
|
90
|
+
err_msg = nil
|
|
91
|
+
testlist = self
|
|
92
|
+
$log ||= Rails.logger
|
|
93
|
+
testlist.tests.each_with_index do |tst,idx|
|
|
94
|
+
unless tst.instance_of?(TestCase)
|
|
95
|
+
msg = "Expected a test case in #{testlist.list_name} but got:"
|
|
96
|
+
$log.error "#{msg} #{tst.inspect}"
|
|
97
|
+
msg = "... in job:"
|
|
98
|
+
$log.error "#{msg} #{self.inspect}"
|
|
99
|
+
msg = "Deleting the TestList #{tst.id}"
|
|
100
|
+
err_msg = "Deleted unexpected sub-TestList: #{tst.id}"
|
|
101
|
+
$log.error msg
|
|
102
|
+
testlist.tests.delete(tst)
|
|
103
|
+
next
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
testlist.parent = nil
|
|
107
|
+
|
|
108
|
+
thash = {
|
|
109
|
+
'fail' => testlist.fail,
|
|
110
|
+
'pass' => testlist.pass,
|
|
111
|
+
'skip' => testlist.skip,
|
|
112
|
+
'total' => testlist.total,
|
|
113
|
+
'start_time' => testlist.start_time,
|
|
114
|
+
'end_time' => testlist.end_time,
|
|
115
|
+
'tests' => []
|
|
116
|
+
}
|
|
117
|
+
if pre_test and ! pre_test.errors.empty?
|
|
118
|
+
thash['tests'].push(pre_test)
|
|
119
|
+
thash['fail'] = thash['fail'] ? (thash['fail'] +1) : 1
|
|
120
|
+
end
|
|
121
|
+
if post_test and ! post_test.errors.empty?
|
|
122
|
+
thash['tests'].push(post_test)
|
|
123
|
+
thash['fail'] = thash['fail'] ? (thash['fail'] +1) : 1
|
|
124
|
+
end
|
|
125
|
+
thash['results_error'] = err_msg if err_msg
|
|
126
|
+
testlist.tests.each do |t|
|
|
127
|
+
tc = { 'id' => t.id,
|
|
128
|
+
'status' => t.status,
|
|
129
|
+
'error_capture_file' => t.error_capture_file,
|
|
130
|
+
'result' => t.result,
|
|
131
|
+
'timed_out' => t.timed_out?,
|
|
132
|
+
'start_time' => t.start_time,
|
|
133
|
+
'end_time' => t.end_time }
|
|
134
|
+
tc['errors'] = t.errors if t.errors
|
|
135
|
+
thash['tests'].push tc
|
|
136
|
+
end
|
|
137
|
+
return thash
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
$:.push = File.dirname(__FILE__)
|
|
3
|
+
require 'diff'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def loadfile(filename)
|
|
7
|
+
lines = nil
|
|
8
|
+
File.open(filename, "r") { |f|
|
|
9
|
+
lines = f.readlines
|
|
10
|
+
}
|
|
11
|
+
return lines
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def diffrange(a, b)
|
|
15
|
+
if (a == b)
|
|
16
|
+
"#{a}"
|
|
17
|
+
else
|
|
18
|
+
"#{a},#{b}"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class Diff
|
|
23
|
+
def to_diff(io = $defout)
|
|
24
|
+
offset = 0
|
|
25
|
+
@diffs.each { |b|
|
|
26
|
+
first = b[0][1]
|
|
27
|
+
length = b.length
|
|
28
|
+
action = b[0][0]
|
|
29
|
+
addcount = 0
|
|
30
|
+
remcount = 0
|
|
31
|
+
b.each { |l|
|
|
32
|
+
if l[0] == "+"
|
|
33
|
+
addcount += 1
|
|
34
|
+
elsif l[0] == "-"
|
|
35
|
+
remcount += 1
|
|
36
|
+
end
|
|
37
|
+
}
|
|
38
|
+
if addcount == 0
|
|
39
|
+
puts "#{diffrange(first+1, first+remcount)}d#{first+offset}"
|
|
40
|
+
elsif remcount == 0
|
|
41
|
+
puts "#{first-offset}a#{diffrange(first+1, first+addcount)}"
|
|
42
|
+
else
|
|
43
|
+
puts "#{diffrange(first+1, first+remcount)}c#{diffrange(first+offset+1, first+offset+addcount)}"
|
|
44
|
+
end
|
|
45
|
+
lastdel = (b[0][0] == "-")
|
|
46
|
+
b.each { |l|
|
|
47
|
+
if l[0] == "-"
|
|
48
|
+
offset -= 1
|
|
49
|
+
print "< "
|
|
50
|
+
elsif l[0] == "+"
|
|
51
|
+
offset += 1
|
|
52
|
+
if lastdel
|
|
53
|
+
lastdel = false
|
|
54
|
+
puts "---"
|
|
55
|
+
end
|
|
56
|
+
print "> "
|
|
57
|
+
end
|
|
58
|
+
print l[2]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
if $0 == __FILE__
|
|
65
|
+
|
|
66
|
+
file1 = ARGV.shift
|
|
67
|
+
file2 = ARGV.shift
|
|
68
|
+
|
|
69
|
+
ary1 = loadfile file1
|
|
70
|
+
ary2 = loadfile file2
|
|
71
|
+
|
|
72
|
+
diff = Diff.new(ary1, ary2)
|
|
73
|
+
diff.to_diff
|
|
74
|
+
|
|
75
|
+
end
|
data/lib/oats/util.rb
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
autoload :Process, 'win32/process'
|
|
2
|
+
|
|
3
|
+
module Oats
|
|
4
|
+
module Util
|
|
5
|
+
|
|
6
|
+
# def Util.cygwin_fix_path(file,dir = nil)
|
|
7
|
+
# end
|
|
8
|
+
def Util.expand_path(file,dir = nil)
|
|
9
|
+
file = File.expand_path(file, dir)
|
|
10
|
+
file.sub!('/',':/') if file.sub!('/cygdrive/','')
|
|
11
|
+
file
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Returns a unique path in dir using basename of file_name.
|
|
15
|
+
# file_name:: Appends '_count' to the the basename if the file already exists.
|
|
16
|
+
# dir:: if not given, uses the dirname of file_name. If file_name does not
|
|
17
|
+
# have dirname, assumes dir = '.' If dir does not exist, it is created.
|
|
18
|
+
def Util.file_unique(file_name, dir = nil)
|
|
19
|
+
new_path, existing_path = Util.file_examine(file_name, dir)
|
|
20
|
+
return new_path
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Returns the file path for the existing file with the highest _count in dir
|
|
24
|
+
# dir:: if not given, uses the dirname of file_name. If file_name does not
|
|
25
|
+
# have dirname, assumes dir = '.' If dir does not exist, it is created.
|
|
26
|
+
def Util.file_latest(file_name, dir = nil)
|
|
27
|
+
new_path, existing_path = Util.file_examine(file_name, dir)
|
|
28
|
+
return existing_path
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Returns a unique path in dir using basename of file_name for a new file
|
|
32
|
+
# and also return the file path for the existing file with the highest _count
|
|
33
|
+
# in dir.
|
|
34
|
+
# file_name:: Appends '_count' to the the basename if the file already exists.
|
|
35
|
+
# dir:: if not given, uses the dirname of file_name. If file_name does not
|
|
36
|
+
# have dirname, assumes dir = '.' If dir does not exist, it is created.
|
|
37
|
+
def Util.file_examine(file_name, dir = nil)
|
|
38
|
+
fname = File.basename(file_name)
|
|
39
|
+
dir ||= File.dirname(file_name)
|
|
40
|
+
dir = '.' unless dir
|
|
41
|
+
existing_path = nil
|
|
42
|
+
path = File.join dir, fname
|
|
43
|
+
if File.directory?(dir)
|
|
44
|
+
(1..100).each do |cnt|
|
|
45
|
+
break unless File.exist?(path)
|
|
46
|
+
existing_path = path
|
|
47
|
+
extn = File.extname(path)
|
|
48
|
+
if extn
|
|
49
|
+
base = path.sub(/#{extn}\z/,'')
|
|
50
|
+
base.sub!(/(_\d*)?\z/,"_#{cnt}")
|
|
51
|
+
path = base + extn
|
|
52
|
+
else
|
|
53
|
+
path = File.join dir, file_name + "_#{cnt}"
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
else
|
|
57
|
+
FileUtils.mkdir_p(dir)
|
|
58
|
+
end
|
|
59
|
+
existing_path = Util.expand_path(existing_path) unless existing_path.nil?
|
|
60
|
+
return Util.expand_path(path), existing_path
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Kill process occupying a port
|
|
64
|
+
def Util.clear_port(port,log)
|
|
65
|
+
matching_busy_port_line = IO.popen('netstat -a -o').readlines.grep(Regexp.new(port.to_s)).first
|
|
66
|
+
return unless matching_busy_port_line and matching_busy_port_line =~ /LISTENING/
|
|
67
|
+
pid = matching_busy_port_line.chomp!.sub(/.*LISTENING *(\d+).*/,'\1')
|
|
68
|
+
log.warn "Likely busy port: [#{matching_busy_port_line}]"
|
|
69
|
+
# Cygwin specific code
|
|
70
|
+
# pid_line = IO.popen("pslist #{pid}").readlines.grep(Regexp.new('java.*'+pid.to_s)).first
|
|
71
|
+
# log.warn pid_line
|
|
72
|
+
# begin
|
|
73
|
+
log.warn "Will attempt to kill the PID #{pid}"
|
|
74
|
+
signal = 'KILL'
|
|
75
|
+
killed = Process.kill(signal,pid.to_i)
|
|
76
|
+
if killed.empty?
|
|
77
|
+
log.warn "Failed to kill the process"
|
|
78
|
+
return false
|
|
79
|
+
else
|
|
80
|
+
log.warn "Successfully killed the process."
|
|
81
|
+
return true
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Kill process using a handle
|
|
86
|
+
# Util.clear_handle('oats_in_progress.lock','java','ruby') willl kill
|
|
87
|
+
def Util.clear_handle(hstring,*proc_names)
|
|
88
|
+
pid = nil
|
|
89
|
+
proc_name = nil
|
|
90
|
+
handle_string = nil
|
|
91
|
+
line = nil
|
|
92
|
+
matches = IO.popen("handle #{hstring}").readlines
|
|
93
|
+
matches.each do |lvar|
|
|
94
|
+
line = lvar
|
|
95
|
+
line =~ /(.*) pid:(.*) .*: (.*)/
|
|
96
|
+
next unless $1
|
|
97
|
+
proc_name = $1.strip
|
|
98
|
+
pid = $2.strip
|
|
99
|
+
handle_string = $3.strip
|
|
100
|
+
if handle_string =~ /#{hstring}/
|
|
101
|
+
proc_names.each do |name|
|
|
102
|
+
break if proc_name =~ /#{name}/
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
return unless pid
|
|
107
|
+
puts "Likely locking process: [#{line}]"
|
|
108
|
+
# Cygwin specific code
|
|
109
|
+
# pid_line = IO.popen("pslist #{pid}").readlines.grep(Regexp.new('java.*'+pid.to_s)).first
|
|
110
|
+
# log.warn pid_line
|
|
111
|
+
# begin
|
|
112
|
+
puts "Will attempt to kill the PID #{pid}"
|
|
113
|
+
signal = 'KILL'
|
|
114
|
+
killed = Process.kill(signal,pid.to_i)
|
|
115
|
+
if killed.empty?
|
|
116
|
+
puts "Failed to kill the process"
|
|
117
|
+
return false
|
|
118
|
+
else
|
|
119
|
+
puts "Successfully killed the process."
|
|
120
|
+
return true
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
end
|
|
125
|
+
end
|
data/lib/oats/version.rb
ADDED
data/lib/oats.rb
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
|
|
2
|
+
defined? Jruby && JRuby.objectspace = true # avoid error http://rubyforge.org/pipermail/nokogiri-talk/2010-April/000355.html
|
|
3
|
+
|
|
4
|
+
$oats_execution = {} # Keeps variables that persists throughout a agents life, across testlists
|
|
5
|
+
# Need to be before reading classes to allow the loaded classes register themselves here
|
|
6
|
+
# In agent mode, this will contain 'options'.
|
|
7
|
+
# Classes of OATS can check existence of this to determine whether called by OATS or OCC
|
|
8
|
+
|
|
9
|
+
require 'pp'
|
|
10
|
+
require 'oats/commandline_options'
|
|
11
|
+
options = Oats::CommandlineOptions.options
|
|
12
|
+
$oats_execution['options'] = options
|
|
13
|
+
if options['execution:occ:agent_nickname'] || options['execution:occ:agent_port'] || options['_:command']
|
|
14
|
+
$oats_execution['agent'] = options # Existence of this from now on implies running in agent mode
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
ENV['OATS_HOME'] ||= File.expand_path( '..', File.dirname(__FILE__) )
|
|
18
|
+
ENV['OATS_TESTS'] ||= options['_:dir_tests'] || (ENV['OATS_HOME'] + '/oats_tests')
|
|
19
|
+
|
|
20
|
+
$:.unshift(ENV['OATS_TESTS'] + '/lib')
|
|
21
|
+
|
|
22
|
+
require 'oats/keywords'
|
|
23
|
+
|
|
24
|
+
# GEMS needed by OATS.
|
|
25
|
+
require 'rubygems'
|
|
26
|
+
require "bundler/setup"
|
|
27
|
+
#Bundler.require
|
|
28
|
+
#gem 'log4r'
|
|
29
|
+
#require 'deep_merge' # Need modified version of https://github.com/danielsdeleo/deep_merge for 1.9 compatibility
|
|
30
|
+
require 'log4r' # http://log4r.sourceforge.net/rdoc/index.html
|
|
31
|
+
|
|
32
|
+
require 'oats/driver'
|
|
33
|
+
require 'oats/oats_lock'
|
|
34
|
+
|
|
35
|
+
#ENV['OATS_HOME'] ||= Oats::Util.expand_path( '..', File.dirname(__FILE__) )
|
|
36
|
+
require 'oats/oats' # Interface methods to user methods implemented in other modules
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project xmlns="http://www.netbeans.org/ns/project/1">
|
|
3
|
+
<type>org.netbeans.modules.ruby.rubyproject</type>
|
|
4
|
+
<configuration>
|
|
5
|
+
<data xmlns="http://www.netbeans.org/ns/ruby-project/1">
|
|
6
|
+
<name>oats</name>
|
|
7
|
+
<source-roots>
|
|
8
|
+
<root id="src.bin.dir"/>
|
|
9
|
+
</source-roots>
|
|
10
|
+
<test-roots>
|
|
11
|
+
<root id="test.test.dir"/>
|
|
12
|
+
<root id="test.oats_tests.dir"/>
|
|
13
|
+
<root id="test.lib.dir"/>
|
|
14
|
+
</test-roots>
|
|
15
|
+
</data>
|
|
16
|
+
</configuration>
|
|
17
|
+
</project>
|
data/oats.gemspec
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require "oats/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = "oats"
|
|
7
|
+
s.version = Oats::VERSION
|
|
8
|
+
s.authors = ["Levent Atasoy"]
|
|
9
|
+
s.email = ["levent.atasoy@gmail.com"]
|
|
10
|
+
s.homepage = ""
|
|
11
|
+
s.summary = %q{A flexible automated system integration regression test framework.}
|
|
12
|
+
s.description = %q{A flexible automated system integration regression test framework.}
|
|
13
|
+
|
|
14
|
+
s.rubyforge_project = "oats"
|
|
15
|
+
|
|
16
|
+
s.files = `git ls-files`.split("\n")
|
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
18
|
+
# s.test_files = ["test/test_cgi_wrapper.rb" ]
|
|
19
|
+
s.executables = %w{oats}
|
|
20
|
+
s.require_paths = ["lib"]
|
|
21
|
+
|
|
22
|
+
# s.extra_rdoc_files = ["CHANGELOG", "COPYING", "lib/mongrel/camping.rb", "LICENSE", "README"]
|
|
23
|
+
# s.has_rdoc = true
|
|
24
|
+
# s.homepage = %q{http://mongrel.rubyforge.org}
|
|
25
|
+
# s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Mongrel", "--main", "README"
|
|
26
|
+
s.date = %q{2012-05-22}
|
|
27
|
+
s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
|
|
28
|
+
|
|
29
|
+
s.add_dependency 'log4r'
|
|
30
|
+
s.add_dependency 'net-http-persistent' unless RUBY_VERSION !~ /^1.9/ # Speed up 1.8 connections
|
|
31
|
+
|
|
32
|
+
if ENV['OS'] == 'Windows_NT' or ENV['OATS_AGENT'] # Triggers possible intent to use agent
|
|
33
|
+
s.add_dependency 'win32-process'
|
|
34
|
+
else
|
|
35
|
+
s.add_dependency 'json'
|
|
36
|
+
s.add_dependency 'em-http-request'
|
|
37
|
+
if ENV['OS'] == 'Linux' # Seems to be needed by Ubuntu
|
|
38
|
+
s.add_dependency 'execjs'
|
|
39
|
+
s.add_dependency 'therubyracer'
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|