WasThreadStackProcessor 0.1.4 → 0.1.5
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/.document +5 -5
- data/Gemfile +26 -23
- data/Gemfile.lock +46 -52
- data/LICENSE.txt +20 -20
- data/README.rdoc +19 -19
- data/Rakefile +58 -58
- data/VERSION +1 -1
- data/WasThreadStackProcessor.gemspec +9 -9
- data/autotest/discover.rb +1 -1
- data/bin/WasThreadStackProcessor +23 -17
- data/lib/WasThreadStackProcessor.rb +32 -32
- data/lib/threadStack.rb +68 -68
- data/lib/threadStackCombinator.rb +10 -10
- data/lib/threadStackExtractor.rb +25 -25
- data/spec/WasThreadStackProcessor_spec.rb +41 -41
- data/spec/spec_helper.rb +12 -12
- data/spec/threadStackCombinator_spec.rb +53 -53
- data/spec/threadStackExtractor_spec.rb +63 -63
- data/spec/threadStack_spec.rb +72 -72
- metadata +103 -111
@@ -1,32 +1,32 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'threadStackCombinator'
|
4
|
-
require 'threadStackExtractor'
|
5
|
-
require 'threadStack'
|
6
|
-
|
7
|
-
require 'rubygems'
|
8
|
-
require 'hirb'
|
9
|
-
|
10
|
-
class WasThreadStackProcessor
|
11
|
-
|
12
|
-
attr_accessor :threadStackCombinator
|
13
|
-
|
14
|
-
def initialize(threadStackCombinator)
|
15
|
-
@threadStackCombinator = threadStackCombinator
|
16
|
-
end
|
17
|
-
|
18
|
-
def process(file)
|
19
|
-
threadStackExtractor = ThreadStackExtractor.new(file)
|
20
|
-
threadStacks = threadStackExtractor.getThreadStacks
|
21
|
-
|
22
|
-
threadStacks.each { |threadStack| @threadStackCombinator.combine(ThreadStack.new(threadStack))}
|
23
|
-
end
|
24
|
-
|
25
|
-
def children_sorted
|
26
|
-
threadStackCombinator.combinedThreadStacks.compact.sort { |a,b| b.count <=> a.count}
|
27
|
-
end
|
28
|
-
|
29
|
-
def text_count
|
30
|
-
""
|
31
|
-
end
|
32
|
-
end
|
1
|
+
|
2
|
+
|
3
|
+
require 'threadStackCombinator'
|
4
|
+
require 'threadStackExtractor'
|
5
|
+
require 'threadStack'
|
6
|
+
|
7
|
+
require 'rubygems'
|
8
|
+
require 'hirb'
|
9
|
+
|
10
|
+
class WasThreadStackProcessor
|
11
|
+
|
12
|
+
attr_accessor :threadStackCombinator
|
13
|
+
|
14
|
+
def initialize(threadStackCombinator)
|
15
|
+
@threadStackCombinator = threadStackCombinator
|
16
|
+
end
|
17
|
+
|
18
|
+
def process(file)
|
19
|
+
threadStackExtractor = ThreadStackExtractor.new(file)
|
20
|
+
threadStacks = threadStackExtractor.getThreadStacks
|
21
|
+
|
22
|
+
threadStacks.each { |threadStack| @threadStackCombinator.combine(ThreadStack.new(threadStack))}
|
23
|
+
end
|
24
|
+
|
25
|
+
def children_sorted
|
26
|
+
threadStackCombinator.combinedThreadStacks.compact.sort { |a,b| b.count <=> a.count}
|
27
|
+
end
|
28
|
+
|
29
|
+
def text_count
|
30
|
+
""
|
31
|
+
end
|
32
|
+
end
|
data/lib/threadStack.rb
CHANGED
@@ -1,68 +1,68 @@
|
|
1
|
-
class ThreadStack
|
2
|
-
|
3
|
-
class Call
|
4
|
-
attr_accessor :text
|
5
|
-
attr_accessor :count
|
6
|
-
attr_accessor :children
|
7
|
-
|
8
|
-
def initialize(text)
|
9
|
-
@text = text
|
10
|
-
@children = Array.new
|
11
|
-
@count = 1
|
12
|
-
end
|
13
|
-
|
14
|
-
def merge(call)
|
15
|
-
if call.nil?
|
16
|
-
false
|
17
|
-
elsif @text == call.text
|
18
|
-
@count += 1
|
19
|
-
@children.compact!
|
20
|
-
if @children.count{ |x| x.merge(call.children[0])} == 0
|
21
|
-
@children << call.children[0]
|
22
|
-
end
|
23
|
-
@children.compact!
|
24
|
-
true
|
25
|
-
else
|
26
|
-
false
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def text_count
|
31
|
-
"#{text} (#{count})"
|
32
|
-
end
|
33
|
-
|
34
|
-
def children_sorted
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
attr_reader :call
|
40
|
-
|
41
|
-
def initialize(stack)
|
42
|
-
previousCall = nil
|
43
|
-
stack.each { |text|
|
44
|
-
call = Call.new(text)
|
45
|
-
if not previousCall.nil?
|
46
|
-
call.children << previousCall
|
47
|
-
end
|
48
|
-
previousCall = call
|
49
|
-
}
|
50
|
-
@call = previousCall
|
51
|
-
end
|
52
|
-
|
53
|
-
def merge(threadStack)
|
54
|
-
@call.merge(threadStack.call)
|
55
|
-
end
|
56
|
-
|
57
|
-
def children_sorted
|
58
|
-
call.children_sorted
|
59
|
-
end
|
60
|
-
|
61
|
-
def count
|
62
|
-
call.count
|
63
|
-
end
|
64
|
-
|
65
|
-
def text_count
|
66
|
-
call.text_count
|
67
|
-
end
|
68
|
-
end
|
1
|
+
class ThreadStack
|
2
|
+
|
3
|
+
class Call
|
4
|
+
attr_accessor :text
|
5
|
+
attr_accessor :count
|
6
|
+
attr_accessor :children
|
7
|
+
|
8
|
+
def initialize(text)
|
9
|
+
@text = text
|
10
|
+
@children = Array.new
|
11
|
+
@count = 1
|
12
|
+
end
|
13
|
+
|
14
|
+
def merge(call)
|
15
|
+
if call.nil?
|
16
|
+
false
|
17
|
+
elsif @text == call.text
|
18
|
+
@count += 1
|
19
|
+
@children.compact!
|
20
|
+
if @children.count{ |x| x.merge(call.children[0])} == 0
|
21
|
+
@children << call.children[0]
|
22
|
+
end
|
23
|
+
@children.compact!
|
24
|
+
true
|
25
|
+
else
|
26
|
+
false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def text_count
|
31
|
+
"#{text} - (#{count})"
|
32
|
+
end
|
33
|
+
|
34
|
+
def children_sorted
|
35
|
+
children.compact.sort { |a,b| b.count <=> a.count}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
attr_reader :call
|
40
|
+
|
41
|
+
def initialize(stack)
|
42
|
+
previousCall = nil
|
43
|
+
stack.each { |text|
|
44
|
+
call = Call.new(text.chomp)
|
45
|
+
if not previousCall.nil?
|
46
|
+
call.children << previousCall
|
47
|
+
end
|
48
|
+
previousCall = call
|
49
|
+
}
|
50
|
+
@call = previousCall
|
51
|
+
end
|
52
|
+
|
53
|
+
def merge(threadStack)
|
54
|
+
@call.merge(threadStack.call)
|
55
|
+
end
|
56
|
+
|
57
|
+
def children_sorted
|
58
|
+
call.children_sorted
|
59
|
+
end
|
60
|
+
|
61
|
+
def count
|
62
|
+
call.count
|
63
|
+
end
|
64
|
+
|
65
|
+
def text_count
|
66
|
+
call.text_count
|
67
|
+
end
|
68
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
class ThreadStackCombinator
|
2
|
-
attr_accessor :combinedThreadStacks
|
3
|
-
|
4
|
-
def initialize
|
5
|
-
@combinedThreadStacks = Array.new
|
6
|
-
end
|
7
|
-
|
8
|
-
def combine(threadStack)
|
9
|
-
@combinedThreadStacks << threadStack unless @combinedThreadStacks.count { |combinedThreadStack| combinedThreadStack.merge(threadStack)} > 0
|
10
|
-
end
|
1
|
+
class ThreadStackCombinator
|
2
|
+
attr_accessor :combinedThreadStacks
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@combinedThreadStacks = Array.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def combine(threadStack)
|
9
|
+
@combinedThreadStacks << threadStack unless @combinedThreadStacks.count { |combinedThreadStack| combinedThreadStack.merge(threadStack)} > 0
|
10
|
+
end
|
11
11
|
end
|
data/lib/threadStackExtractor.rb
CHANGED
@@ -1,25 +1,25 @@
|
|
1
|
-
class ThreadStackExtractor
|
2
|
-
|
3
|
-
def initialize(file)
|
4
|
-
@file = file
|
5
|
-
end
|
6
|
-
|
7
|
-
def getThreadStacks
|
8
|
-
stacks = Array.new()
|
9
|
-
|
10
|
-
stack = Array.new()
|
11
|
-
while (line = @file.gets)
|
12
|
-
encoded = line.encode('UTF-8', 'UTF-8', { :invalid => :replace })
|
13
|
-
case encoded
|
14
|
-
when /^3XMTHREADINFO\s*(.*)/ then
|
15
|
-
stacks << stack unless stack.empty?
|
16
|
-
stack = Array.new()
|
17
|
-
when /^4XESTACKTRACE\s*(.*)/ then
|
18
|
-
stack << $1
|
19
|
-
end
|
20
|
-
end
|
21
|
-
stacks << stack unless stack.empty?
|
22
|
-
|
23
|
-
return stacks
|
24
|
-
end
|
25
|
-
end
|
1
|
+
class ThreadStackExtractor
|
2
|
+
|
3
|
+
def initialize(file)
|
4
|
+
@file = file
|
5
|
+
end
|
6
|
+
|
7
|
+
def getThreadStacks
|
8
|
+
stacks = Array.new()
|
9
|
+
|
10
|
+
stack = Array.new()
|
11
|
+
while (line = @file.gets)
|
12
|
+
encoded = line.encode('UTF-8', 'UTF-8', { :invalid => :replace })
|
13
|
+
case encoded
|
14
|
+
when /^3XMTHREADINFO\s*(.*)/ then
|
15
|
+
stacks << stack unless stack.empty?
|
16
|
+
stack = Array.new()
|
17
|
+
when /^4XESTACKTRACE\s*(.*)/ then
|
18
|
+
stack << $1
|
19
|
+
end
|
20
|
+
end
|
21
|
+
stacks << stack unless stack.empty?
|
22
|
+
|
23
|
+
return stacks
|
24
|
+
end
|
25
|
+
end
|
@@ -1,42 +1,42 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
require 'wasThreadStackProcessor'
|
3
|
-
require 'threadStackExtractor'
|
4
|
-
require 'threadStackCombinator'
|
5
|
-
|
6
|
-
describe WasThreadStackProcessor do
|
7
|
-
|
8
|
-
it "must extract the threads and combine it" do
|
9
|
-
file = double("File")
|
10
|
-
file.stub(:gets).and_return('3XMTHREADINFO "WebContainer : 425" (TID:0x000000000B48E100, sys_thread_t:0x000000000AA11040, state:R, native ID:0x000000000000146B) prio=5',
|
11
|
-
'4XESTACKTRACE at com/ibm/io/async/AsyncLibrary.aio_getioev3(Native Method)',
|
12
|
-
'4XESTACKTRACE at com/ibm/io/async/AsyncLibrary.getCompletionData3(AsyncLibrary.java:602(Compiled Code))',
|
13
|
-
'4XESTACKTRACE at com/ibm/io/async/ResultHandler.runEventProcessingLoop(ResultHandler.java:287(Compiled Code))',
|
14
|
-
'4XESTACKTRACE at com/ibm/io/async/ResultHandler$2.run(ResultHandler.java:881(Compiled Code))',
|
15
|
-
'4XESTACKTRACE at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1551(Compiled Code))',
|
16
|
-
'3XMTHREADINFO "NotificationServiceDispatcher : 143" (TID:0x00002AAAD843EF00, sys_thread_t:0x000000000AA1D1C0, state:CW, native ID:0x0000000000000F76) prio=5',
|
17
|
-
'4XESTACKTRACE at java/lang/Object.wait(Native Method)',
|
18
|
-
'4XESTACKTRACE at java/lang/Object.wait(Object.java:231(Compiled Code))',
|
19
|
-
'4XESTACKTRACE at com/ibm/ws/util/BoundedBuffer.waitGet_(BoundedBuffer.java:195(Compiled Code))',
|
20
|
-
'4XESTACKTRACE at com/ibm/ws/util/BoundedBuffer.take(BoundedBuffer.java:564(Compiled Code))',
|
21
|
-
'4XESTACKTRACE at com/ibm/ws/util/ThreadPool.getTask(ThreadPool.java:840(Compiled Code))',
|
22
|
-
'4XESTACKTRACE at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1558(Compiled Code))',
|
23
|
-
'3XMTHREADINFO "Java indexing" (TID:0x00002AAAE42C1800, sys_thread_t:0x00002AAAD89EF530, state:CW, native ID:0x0000000000000FA8) prio=4',
|
24
|
-
'4XESTACKTRACE at java/lang/Object.wait(Native Method)',
|
25
|
-
'4XESTACKTRACE at java/lang/Object.wait(Object.java:199(Compiled Code))',
|
26
|
-
'4XESTACKTRACE at org/eclipse/jdt/internal/core/search/processing/JobManager.run(JobManager.java:350)',
|
27
|
-
'4XESTACKTRACE at java/lang/Thread.run(Thread.java:811)',
|
28
|
-
'3XMTHREADINFO "Worker-1" (TID:0x000000000B2C1C00, sys_thread_t:0x00000000088A5208, state:CW, native ID:0x0000000000000FAB) prio=5',
|
29
|
-
'4XESTACKTRACE at java/lang/Object.wait(Native Method)',
|
30
|
-
'4XESTACKTRACE at java/lang/Object.wait(Object.java:231(Compiled Code))',
|
31
|
-
'4XESTACKTRACE at org/eclipse/core/internal/jobs/WorkerPool.sleep(WorkerPool.java:181(Compiled Code))',
|
32
|
-
'4XESTACKTRACE at org/eclipse/core/internal/jobs/WorkerPool.startJob(WorkerPool.java:218(Compiled Code))',
|
33
|
-
'4XESTACKTRACE at org/eclipse/core/internal/jobs/Worker.run(Worker.java:51)',
|
34
|
-
nil)
|
35
|
-
threadStackCombinator = double("ThreadStackCombinator")
|
36
|
-
threadStackCombinator.should_receive(:combine).exactly(4).times
|
37
|
-
|
38
|
-
wasThreadStackProcessor = WasThreadStackProcessor.new(threadStackCombinator)
|
39
|
-
|
40
|
-
wasThreadStackProcessor.process(file)
|
41
|
-
end
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'wasThreadStackProcessor'
|
3
|
+
require 'threadStackExtractor'
|
4
|
+
require 'threadStackCombinator'
|
5
|
+
|
6
|
+
describe WasThreadStackProcessor do
|
7
|
+
|
8
|
+
it "must extract the threads and combine it" do
|
9
|
+
file = double("File")
|
10
|
+
file.stub(:gets).and_return('3XMTHREADINFO "WebContainer : 425" (TID:0x000000000B48E100, sys_thread_t:0x000000000AA11040, state:R, native ID:0x000000000000146B) prio=5',
|
11
|
+
'4XESTACKTRACE at com/ibm/io/async/AsyncLibrary.aio_getioev3(Native Method)',
|
12
|
+
'4XESTACKTRACE at com/ibm/io/async/AsyncLibrary.getCompletionData3(AsyncLibrary.java:602(Compiled Code))',
|
13
|
+
'4XESTACKTRACE at com/ibm/io/async/ResultHandler.runEventProcessingLoop(ResultHandler.java:287(Compiled Code))',
|
14
|
+
'4XESTACKTRACE at com/ibm/io/async/ResultHandler$2.run(ResultHandler.java:881(Compiled Code))',
|
15
|
+
'4XESTACKTRACE at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1551(Compiled Code))',
|
16
|
+
'3XMTHREADINFO "NotificationServiceDispatcher : 143" (TID:0x00002AAAD843EF00, sys_thread_t:0x000000000AA1D1C0, state:CW, native ID:0x0000000000000F76) prio=5',
|
17
|
+
'4XESTACKTRACE at java/lang/Object.wait(Native Method)',
|
18
|
+
'4XESTACKTRACE at java/lang/Object.wait(Object.java:231(Compiled Code))',
|
19
|
+
'4XESTACKTRACE at com/ibm/ws/util/BoundedBuffer.waitGet_(BoundedBuffer.java:195(Compiled Code))',
|
20
|
+
'4XESTACKTRACE at com/ibm/ws/util/BoundedBuffer.take(BoundedBuffer.java:564(Compiled Code))',
|
21
|
+
'4XESTACKTRACE at com/ibm/ws/util/ThreadPool.getTask(ThreadPool.java:840(Compiled Code))',
|
22
|
+
'4XESTACKTRACE at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1558(Compiled Code))',
|
23
|
+
'3XMTHREADINFO "Java indexing" (TID:0x00002AAAE42C1800, sys_thread_t:0x00002AAAD89EF530, state:CW, native ID:0x0000000000000FA8) prio=4',
|
24
|
+
'4XESTACKTRACE at java/lang/Object.wait(Native Method)',
|
25
|
+
'4XESTACKTRACE at java/lang/Object.wait(Object.java:199(Compiled Code))',
|
26
|
+
'4XESTACKTRACE at org/eclipse/jdt/internal/core/search/processing/JobManager.run(JobManager.java:350)',
|
27
|
+
'4XESTACKTRACE at java/lang/Thread.run(Thread.java:811)',
|
28
|
+
'3XMTHREADINFO "Worker-1" (TID:0x000000000B2C1C00, sys_thread_t:0x00000000088A5208, state:CW, native ID:0x0000000000000FAB) prio=5',
|
29
|
+
'4XESTACKTRACE at java/lang/Object.wait(Native Method)',
|
30
|
+
'4XESTACKTRACE at java/lang/Object.wait(Object.java:231(Compiled Code))',
|
31
|
+
'4XESTACKTRACE at org/eclipse/core/internal/jobs/WorkerPool.sleep(WorkerPool.java:181(Compiled Code))',
|
32
|
+
'4XESTACKTRACE at org/eclipse/core/internal/jobs/WorkerPool.startJob(WorkerPool.java:218(Compiled Code))',
|
33
|
+
'4XESTACKTRACE at org/eclipse/core/internal/jobs/Worker.run(Worker.java:51)',
|
34
|
+
nil)
|
35
|
+
threadStackCombinator = double("ThreadStackCombinator")
|
36
|
+
threadStackCombinator.should_receive(:combine).exactly(4).times
|
37
|
+
|
38
|
+
wasThreadStackProcessor = WasThreadStackProcessor.new(threadStackCombinator)
|
39
|
+
|
40
|
+
wasThreadStackProcessor.process(file)
|
41
|
+
end
|
42
42
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
-
require 'rspec'
|
4
|
-
require 'wasThreadStackProcessor'
|
5
|
-
|
6
|
-
# Requires supporting files with custom matchers and macros, etc,
|
7
|
-
# in ./support/ and its subdirectories.
|
8
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
9
|
-
|
10
|
-
RSpec.configure do |config|
|
11
|
-
|
12
|
-
end
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
require 'rspec'
|
4
|
+
require 'wasThreadStackProcessor'
|
5
|
+
|
6
|
+
# Requires supporting files with custom matchers and macros, etc,
|
7
|
+
# in ./support/ and its subdirectories.
|
8
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
|
12
|
+
end
|
@@ -1,53 +1,53 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
-
require 'threadStackCombinator'
|
3
|
-
|
4
|
-
describe ThreadStackCombinator do
|
5
|
-
|
6
|
-
before(:each) do
|
7
|
-
@threadStackCombinator = ThreadStackCombinator.new
|
8
|
-
end
|
9
|
-
|
10
|
-
describe 'after creation' do
|
11
|
-
it 'must contain no CombinedThreadStack' do
|
12
|
-
@threadStackCombinator.combinedThreadStacks.size.should be 0
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe 'after combine' do
|
17
|
-
before(:each) do
|
18
|
-
@threadStack = ThreadStack.new(['at com/ibm/io/async/AsyncLibrary.aio_getioev3(Native Method)',
|
19
|
-
'at com/ibm/io/async/AsyncLibrary.getCompletionData3(AsyncLibrary.java:602(Compiled Code))',
|
20
|
-
'at com/ibm/io/async/ResultHandler.runEventProcessingLoop(ResultHandler.java:287(Compiled Code))',
|
21
|
-
'at com/ibm/io/async/ResultHandler$2.run(ResultHandler.java:881(Compiled Code))',
|
22
|
-
'at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1551(Compiled Code))'])
|
23
|
-
|
24
|
-
@threadStack2 = ThreadStack.new(['at java/lang/Object.wait(Native Method)',
|
25
|
-
'at com/ibm/io/async/ResultHandler$2.run(ResultHandler.java:881(Compiled Code))',
|
26
|
-
'at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1551(Compiled Code))'])
|
27
|
-
|
28
|
-
@threadStack3 = ThreadStack.new(['at java/lang/Object.wait(Native Method)',
|
29
|
-
'at com/ibm/io/async/ResultHandler$2.run(ResultHandler.java:881(Compiled Code))'])
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'one threadStack must contain one threadStack' do
|
33
|
-
@threadStackCombinator.combine(@threadStack)
|
34
|
-
|
35
|
-
@threadStackCombinator.combinedThreadStacks.size.should be 1
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'two threadStacks with common accesor must contain on threadStack' do
|
40
|
-
@threadStackCombinator.combine(@threadStack)
|
41
|
-
@threadStackCombinator.combine(@threadStack2)
|
42
|
-
|
43
|
-
@threadStackCombinator.combinedThreadStacks.size.should be 1
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'two threadStacks with no common accesor must contain on threadStack' do
|
47
|
-
@threadStackCombinator.combine(@threadStack)
|
48
|
-
@threadStackCombinator.combine(@threadStack3)
|
49
|
-
|
50
|
-
@threadStackCombinator.combinedThreadStacks.size.should be 2
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'threadStackCombinator'
|
3
|
+
|
4
|
+
describe ThreadStackCombinator do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
@threadStackCombinator = ThreadStackCombinator.new
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'after creation' do
|
11
|
+
it 'must contain no CombinedThreadStack' do
|
12
|
+
@threadStackCombinator.combinedThreadStacks.size.should be 0
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'after combine' do
|
17
|
+
before(:each) do
|
18
|
+
@threadStack = ThreadStack.new(['at com/ibm/io/async/AsyncLibrary.aio_getioev3(Native Method)',
|
19
|
+
'at com/ibm/io/async/AsyncLibrary.getCompletionData3(AsyncLibrary.java:602(Compiled Code))',
|
20
|
+
'at com/ibm/io/async/ResultHandler.runEventProcessingLoop(ResultHandler.java:287(Compiled Code))',
|
21
|
+
'at com/ibm/io/async/ResultHandler$2.run(ResultHandler.java:881(Compiled Code))',
|
22
|
+
'at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1551(Compiled Code))'])
|
23
|
+
|
24
|
+
@threadStack2 = ThreadStack.new(['at java/lang/Object.wait(Native Method)',
|
25
|
+
'at com/ibm/io/async/ResultHandler$2.run(ResultHandler.java:881(Compiled Code))',
|
26
|
+
'at com/ibm/ws/util/ThreadPool$Worker.run(ThreadPool.java:1551(Compiled Code))'])
|
27
|
+
|
28
|
+
@threadStack3 = ThreadStack.new(['at java/lang/Object.wait(Native Method)',
|
29
|
+
'at com/ibm/io/async/ResultHandler$2.run(ResultHandler.java:881(Compiled Code))'])
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'one threadStack must contain one threadStack' do
|
33
|
+
@threadStackCombinator.combine(@threadStack)
|
34
|
+
|
35
|
+
@threadStackCombinator.combinedThreadStacks.size.should be 1
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'two threadStacks with common accesor must contain on threadStack' do
|
40
|
+
@threadStackCombinator.combine(@threadStack)
|
41
|
+
@threadStackCombinator.combine(@threadStack2)
|
42
|
+
|
43
|
+
@threadStackCombinator.combinedThreadStacks.size.should be 1
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'two threadStacks with no common accesor must contain on threadStack' do
|
47
|
+
@threadStackCombinator.combine(@threadStack)
|
48
|
+
@threadStackCombinator.combine(@threadStack3)
|
49
|
+
|
50
|
+
@threadStackCombinator.combinedThreadStacks.size.should be 2
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|