newrelic_rpm 3.13.0.299 → 3.13.1.300
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -0
- data/CHANGELOG +36 -1
- data/lib/new_relic/agent/agent.rb +0 -1
- data/lib/new_relic/agent/database.rb +1 -1
- data/lib/new_relic/agent/datastores/mongo.rb +8 -7
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +49 -0
- data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +2 -2
- data/lib/new_relic/agent/error_collector.rb +12 -51
- data/lib/new_relic/agent/error_trace_aggregator.rb +89 -0
- data/lib/new_relic/agent/instrumentation/active_record.rb +1 -1
- data/lib/new_relic/agent/instrumentation/active_record_4.rb +1 -1
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +26 -1
- data/lib/new_relic/agent/instrumentation/mongo.rb +16 -1
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +74 -0
- data/lib/new_relic/agent/supported_versions.rb +15 -1
- data/lib/new_relic/agent/system_info.rb +5 -0
- data/lib/new_relic/recipes/capistrano3.rb +1 -1
- data/lib/new_relic/recipes/capistrano_legacy.rb +1 -1
- data/lib/new_relic/version.rb +1 -1
- data/newrelic_rpm.gemspec +1 -1
- data/test/environments/lib/environments/runner.rb +1 -0
- data/test/fixtures/cross_agent_tests/proc_cpuinfo/README.md +4 -0
- data/test/fixtures/cross_agent_tests/proc_cpuinfo/malformed_file.txt +3 -0
- data/test/multiverse/lib/multiverse/suite.rb +4 -4
- data/test/multiverse/suites/active_record/active_record_test.rb +67 -26
- data/test/multiverse/suites/agent_only/start_up_test.rb +17 -3
- data/test/multiverse/suites/config_file_loading/Envfile +1 -1
- data/test/multiverse/suites/mongo/Envfile +3 -1
- data/test/multiverse/suites/mongo/mongo2_instrumentation_test.rb +344 -0
- data/test/multiverse/suites/mongo/mongo_connection_test.rb +2 -1
- data/test/multiverse/suites/mongo/mongo_instrumentation_test.rb +2 -1
- data/test/multiverse/suites/mongo/mongo_unsupported_version_test.rb +1 -1
- data/test/multiverse/suites/rails/rails3_app/app_rails3_plus.rb +7 -0
- data/test/multiverse/suites/sidekiq/Envfile +1 -1
- data/test/new_relic/agent/agent/start_test.rb +0 -5
- data/test/new_relic/agent/database_test.rb +8 -1
- data/test/new_relic/agent/datastores/mongo/event_formatter_test.rb +154 -0
- data/test/new_relic/agent/error_collector_test.rb +0 -13
- data/test/new_relic/agent/error_trace_aggregator_test.rb +30 -0
- data/test/new_relic/agent/instrumentation/mongodb_command_subscriber_test.rb +72 -0
- data/test/new_relic/agent/stats_engine/metric_stats_test.rb +24 -22
- data/test/new_relic/agent/system_info_test.rb +9 -1
- data/test/new_relic/rack/error_collector_test.rb +1 -2
- metadata +10 -2
@@ -7,7 +7,8 @@ require 'newrelic_rpm'
|
|
7
7
|
require 'new_relic/agent/datastores/mongo'
|
8
8
|
require 'securerandom'
|
9
9
|
|
10
|
-
if NewRelic::Agent::Datastores::Mongo.is_supported_version?
|
10
|
+
if NewRelic::Agent::Datastores::Mongo.is_supported_version? &&
|
11
|
+
!NewRelic::Agent::Datastores::Mongo.is_monitoring_enabled?
|
11
12
|
require File.join(File.dirname(__FILE__), '..', '..', '..', 'helpers', 'mongo_metric_builder')
|
12
13
|
require File.join(File.dirname(__FILE__), 'helpers', 'mongo_server')
|
13
14
|
require File.join(File.dirname(__FILE__), 'helpers', 'mongo_replica_set')
|
@@ -7,7 +7,8 @@ require 'newrelic_rpm'
|
|
7
7
|
require 'new_relic/agent/datastores/mongo'
|
8
8
|
require 'securerandom'
|
9
9
|
|
10
|
-
if NewRelic::Agent::Datastores::Mongo.is_supported_version?
|
10
|
+
if NewRelic::Agent::Datastores::Mongo.is_supported_version? &&
|
11
|
+
!NewRelic::Agent::Datastores::Mongo.is_monitoring_enabled?
|
11
12
|
require File.join(File.dirname(__FILE__), '..', '..', '..', 'helpers', 'mongo_metric_builder')
|
12
13
|
require File.join(File.dirname(__FILE__), 'helpers', 'mongo_server')
|
13
14
|
require File.join(File.dirname(__FILE__), 'helpers', 'mongo_replica_set')
|
@@ -47,6 +47,13 @@ if !defined?(MyApp)
|
|
47
47
|
end
|
48
48
|
|
49
49
|
if defined?(Sinatra)
|
50
|
+
module Sinatra
|
51
|
+
class Application < Base
|
52
|
+
# Override to not accidentally start the app in at_exit handler
|
53
|
+
set :run, Proc.new { false }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
50
57
|
class SinatraTestApp < Sinatra::Base
|
51
58
|
get '/' do
|
52
59
|
raise "Intentional error" if params["raise"]
|
@@ -89,7 +89,6 @@ class NewRelic::Agent::Agent::StartTest < Minitest::Test
|
|
89
89
|
private :at_exit
|
90
90
|
|
91
91
|
def test_install_exit_handler_positive
|
92
|
-
NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(false)
|
93
92
|
NewRelic::LanguageSupport.expects(:using_engine?).with('jruby').returns(false)
|
94
93
|
self.expects(:sinatra_classic_app?).returns(false)
|
95
94
|
# we are overriding at_exit above, to immediately return, so we can
|
@@ -110,15 +109,11 @@ class NewRelic::Agent::Agent::StartTest < Minitest::Test
|
|
110
109
|
|
111
110
|
def test_install_exit_handler_weird_ruby
|
112
111
|
with_config(:send_data_one_exit => true) do
|
113
|
-
NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(false)
|
114
112
|
NewRelic::LanguageSupport.expects(:using_engine?).with('jruby').returns(false)
|
115
113
|
self.expects(:sinatra_classic_app?).returns(true)
|
116
114
|
install_exit_handler
|
117
|
-
NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(false)
|
118
115
|
NewRelic::LanguageSupport.expects(:using_engine?).with('jruby').returns(true)
|
119
116
|
install_exit_handler
|
120
|
-
NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(true)
|
121
|
-
install_exit_handler
|
122
117
|
end
|
123
118
|
end
|
124
119
|
|
@@ -370,7 +370,7 @@ class NewRelic::Agent::DatabaseTest < Minitest::Test
|
|
370
370
|
assert_equal('a' * (NewRelic::Agent::Database::MAX_QUERY_LENGTH - 3) + '...', truncated_query)
|
371
371
|
end
|
372
372
|
|
373
|
-
INVALID_UTF8_STRING = (''.respond_to?(:force_encoding) ? "\x80".force_encoding('UTF-8') : "\x80")
|
373
|
+
INVALID_UTF8_STRING = (''.respond_to?(:force_encoding) ? "select \x80".force_encoding('UTF-8') : "select \x80")
|
374
374
|
|
375
375
|
def test_capture_query_mis_encoded
|
376
376
|
query = INVALID_UTF8_STRING
|
@@ -382,6 +382,13 @@ class NewRelic::Agent::DatabaseTest < Minitest::Test
|
|
382
382
|
assert_equal(expected_query, captured)
|
383
383
|
end
|
384
384
|
|
385
|
+
def test_parse_operation_from_query_mis_encoded
|
386
|
+
query = INVALID_UTF8_STRING
|
387
|
+
expected = "select"
|
388
|
+
parsed = NewRelic::Agent::Database.parse_operation_from_query(query)
|
389
|
+
assert_equal(expected, parsed)
|
390
|
+
end
|
391
|
+
|
385
392
|
sql_parsing_tests = load_cross_agent_test('sql_parsing')
|
386
393
|
sql_parsing_tests.each_with_index do |test_case, i|
|
387
394
|
define_method("test_sql_parsing_#{i}") do
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
|
4
|
+
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','..','test_helper'))
|
6
|
+
require 'new_relic/agent/datastores/mongo/event_formatter'
|
7
|
+
|
8
|
+
module NewRelic
|
9
|
+
module Agent
|
10
|
+
module Datastores
|
11
|
+
module Mongo
|
12
|
+
class EventFormatterTest < Minitest::Test
|
13
|
+
|
14
|
+
DATABASE = 'multiverse'.freeze
|
15
|
+
|
16
|
+
FIND_COMMAND = {
|
17
|
+
"find" => "tribbles",
|
18
|
+
"filter" => { "_id" => { "$gt" => 1 }, "name" => "joe" },
|
19
|
+
"sort" => { "_id" => 1 },
|
20
|
+
"limit" => 2,
|
21
|
+
"skip" => 2,
|
22
|
+
"comment" => "test",
|
23
|
+
"hint" => { "_id" => 1 },
|
24
|
+
"max" => { "_id" => 6 },
|
25
|
+
"maxScan" => 5000,
|
26
|
+
"maxTimeMS" => 6000,
|
27
|
+
"min" => { "_id" => 0 },
|
28
|
+
"readPreference" => { "mode" => "secondaryPreferred" },
|
29
|
+
"returnKey" => false,
|
30
|
+
"showRecordId" => false,
|
31
|
+
"snapshot" => false
|
32
|
+
}.freeze
|
33
|
+
|
34
|
+
INSERT_COMMAND = {
|
35
|
+
"insert" => "tribbles",
|
36
|
+
"ordered" => true,
|
37
|
+
"documents" => [{ :name => "test" }]
|
38
|
+
}.freeze
|
39
|
+
|
40
|
+
UPDATE_COMMAND = {
|
41
|
+
"update" => "tribbles",
|
42
|
+
"ordered" => true,
|
43
|
+
"updates" => [
|
44
|
+
{
|
45
|
+
:q => { :_id => { "$gt" => 1 }},
|
46
|
+
:u => { "$inc" => { :x => 1 }},
|
47
|
+
:multi => false,
|
48
|
+
:upsert => false
|
49
|
+
}
|
50
|
+
]
|
51
|
+
}.freeze
|
52
|
+
|
53
|
+
DELETE_COMMAND = {
|
54
|
+
"delete" => "tribbles",
|
55
|
+
"ordered" => true,
|
56
|
+
"deletes" => [{ :q => { :_id => { "$gt" => 1 }}, :limit => 1 }]
|
57
|
+
}.freeze
|
58
|
+
|
59
|
+
if RUBY_VERSION > "1.9.3"
|
60
|
+
|
61
|
+
def test_doesnt_modify_incoming_statement
|
62
|
+
formatted = EventFormatter.format('find', DATABASE, FIND_COMMAND)
|
63
|
+
refute_same FIND_COMMAND, formatted
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_can_disable_statement_capturing_queries
|
67
|
+
with_config(:'mongo.capture_queries' => false) do
|
68
|
+
formatted = EventFormatter.format('find', DATABASE, FIND_COMMAND)
|
69
|
+
assert_nil formatted
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_event_formatter_obfuscates_by_default
|
74
|
+
expected = {
|
75
|
+
:operation => :find,
|
76
|
+
:database => DATABASE,
|
77
|
+
:collection => "tribbles",
|
78
|
+
"find" => "tribbles",
|
79
|
+
"filter" => { "_id" => { "$gt" => "?" }, "name" => "?" },
|
80
|
+
"sort" => { "_id" => 1 },
|
81
|
+
"limit" => 2,
|
82
|
+
"skip" => 2,
|
83
|
+
"comment" => "test",
|
84
|
+
"hint" => { "_id" => 1 },
|
85
|
+
"max" => { "_id" => 6 },
|
86
|
+
"maxScan" => 5000,
|
87
|
+
"maxTimeMS" => 6000,
|
88
|
+
"min" => { "_id" => 0 },
|
89
|
+
"readPreference" => { "mode" => "secondaryPreferred" },
|
90
|
+
"returnKey" => false,
|
91
|
+
"showRecordId" => false,
|
92
|
+
"snapshot" => false
|
93
|
+
}
|
94
|
+
|
95
|
+
formatted = EventFormatter.format(:find, DATABASE, FIND_COMMAND)
|
96
|
+
assert_equal expected, formatted
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_event_formatter_raw_selectors
|
100
|
+
with_config(:'mongo.obfuscate_queries' => false) do
|
101
|
+
formatted = EventFormatter.format(:find, DATABASE, FIND_COMMAND)
|
102
|
+
expected = FIND_COMMAND.merge(
|
103
|
+
:operation => :find,
|
104
|
+
:database => DATABASE,
|
105
|
+
:collection => 'tribbles'
|
106
|
+
)
|
107
|
+
assert_equal expected, formatted
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_event_formatter_blacklists_inserts
|
112
|
+
expected = {
|
113
|
+
:operation => :insert,
|
114
|
+
:database => DATABASE,
|
115
|
+
:collection => "tribbles",
|
116
|
+
"insert" => "tribbles",
|
117
|
+
"ordered" => true
|
118
|
+
}
|
119
|
+
|
120
|
+
formatted = EventFormatter.format(:insert, DATABASE, INSERT_COMMAND)
|
121
|
+
assert_equal expected, formatted
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_event_formatter_blacklists_updates
|
125
|
+
expected = {
|
126
|
+
:operation => :update,
|
127
|
+
:database => DATABASE,
|
128
|
+
:collection => "tribbles",
|
129
|
+
"update" => "tribbles",
|
130
|
+
"ordered" => true
|
131
|
+
}
|
132
|
+
|
133
|
+
formatted = EventFormatter.format(:update, DATABASE, UPDATE_COMMAND)
|
134
|
+
assert_equal expected, formatted
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_event_formatter_blacklists_deletes
|
138
|
+
expected = {
|
139
|
+
:operation => :delete,
|
140
|
+
:database => DATABASE,
|
141
|
+
:collection => "tribbles",
|
142
|
+
"delete" => "tribbles",
|
143
|
+
"ordered" => true
|
144
|
+
}
|
145
|
+
|
146
|
+
formatted = EventFormatter.format(:delete, DATABASE, DELETE_COMMAND)
|
147
|
+
assert_equal expected, formatted
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
@@ -471,19 +471,6 @@ class NewRelic::Agent::ErrorCollectorTest < Minitest::Test
|
|
471
471
|
assert_equal('STACK STACK STACK', @error_collector.extract_stack_trace(exception))
|
472
472
|
end
|
473
473
|
|
474
|
-
def test_over_queue_limit_negative
|
475
|
-
refute @error_collector.over_queue_limit?(nil)
|
476
|
-
end
|
477
|
-
|
478
|
-
def test_over_queue_limit_positive
|
479
|
-
expects_logging(:warn, includes('The error reporting queue has reached 20'))
|
480
|
-
21.times do
|
481
|
-
@error_collector.notice_error("", {})
|
482
|
-
end
|
483
|
-
|
484
|
-
assert @error_collector.over_queue_limit?('hooray')
|
485
|
-
end
|
486
|
-
|
487
474
|
def test_skip_notice_error_is_true_if_the_error_collector_is_disabled
|
488
475
|
error = StandardError.new
|
489
476
|
with_config(:'error_collector.enabled' => false) do
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
|
4
|
+
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
|
6
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'..','data_container_tests'))
|
7
|
+
|
8
|
+
module NewRelic
|
9
|
+
module Agent
|
10
|
+
class ErrorTraceAggregatorTest < Minitest::Test
|
11
|
+
def setup
|
12
|
+
@aggregator = ErrorTraceAggregator.new(20)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_over_queue_limit_negative
|
16
|
+
refute @aggregator.over_queue_limit?(nil)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_over_queue_limit_positive
|
20
|
+
expects_logging(:warn, includes('The error reporting queue has reached 20'))
|
21
|
+
21.times do
|
22
|
+
error = stub(:message => "", :is_internal => false)
|
23
|
+
@aggregator.add_to_error_queue(error)
|
24
|
+
end
|
25
|
+
|
26
|
+
assert @aggregator.over_queue_limit?('hooray')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
|
4
|
+
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','test_helper'))
|
6
|
+
require 'new_relic/agent/instrumentation/mongodb_command_subscriber'
|
7
|
+
|
8
|
+
class NewRelic::Agent::Instrumentation::MongodbCommandSubscriberTest < Minitest::Test
|
9
|
+
|
10
|
+
if RUBY_VERSION > "1.9.3"
|
11
|
+
def setup
|
12
|
+
@started_event = mock('started event')
|
13
|
+
@started_event.stubs(:operation_id).returns(1)
|
14
|
+
@started_event.stubs(:command_name).returns('find')
|
15
|
+
@started_event.stubs(:database_name).returns('mongodb-test')
|
16
|
+
@started_event.stubs(:command).returns({ 'find' => 'users', 'filter' => { 'name' => 'test' }})
|
17
|
+
|
18
|
+
@succeeded_event = mock('succeeded event')
|
19
|
+
@succeeded_event.stubs(:operation_id).returns(1)
|
20
|
+
@succeeded_event.stubs(:duration).returns(2)
|
21
|
+
|
22
|
+
@subscriber = NewRelic::Agent::Instrumentation::MongodbCommandSubscriber.new
|
23
|
+
|
24
|
+
@stats_engine = NewRelic::Agent.instance.stats_engine
|
25
|
+
@stats_engine.clear_stats
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_records_metrics_for_simple_find
|
29
|
+
simulate_query
|
30
|
+
|
31
|
+
metric_name = 'Datastore/statement/MongoDB/users/find'
|
32
|
+
assert_metrics_recorded(
|
33
|
+
metric_name => { :call_count => 1, :total_call_time => 2.0 }
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_records_scoped_metrics
|
38
|
+
in_transaction('test_txn') { simulate_query }
|
39
|
+
|
40
|
+
metric_name = 'Datastore/statement/MongoDB/users/find'
|
41
|
+
assert_metrics_recorded(
|
42
|
+
[ metric_name, 'test_txn' ] => { :call_count => 1, :total_call_time => 2 }
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_records_nothing_if_tracing_disabled
|
47
|
+
NewRelic::Agent.disable_all_tracing { simulate_query }
|
48
|
+
metric_name = 'Datastore/statement/MongoDB/users/find'
|
49
|
+
assert_metrics_not_recorded([ metric_name ])
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_records_rollup_metrics
|
53
|
+
in_web_transaction { simulate_query }
|
54
|
+
|
55
|
+
assert_metrics_recorded(
|
56
|
+
'Datastore/operation/MongoDB/find' => { :call_count => 1, :total_call_time => 2 },
|
57
|
+
'Datastore/allWeb' => { :call_count => 1, :total_call_time => 2 },
|
58
|
+
'Datastore/all' => { :call_count => 1, :total_call_time => 2 }
|
59
|
+
)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_should_not_raise_due_to_an_exception_during_instrumentation_callback
|
63
|
+
@subscriber.stubs(:metrics).raises(StandardError)
|
64
|
+
simulate_query
|
65
|
+
end
|
66
|
+
|
67
|
+
def simulate_query
|
68
|
+
@subscriber.started(@started_event)
|
69
|
+
@subscriber.succeeded(@succeeded_event)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -161,32 +161,34 @@ class NewRelic::Agent::MetricStatsTest < Minitest::Test
|
|
161
161
|
])
|
162
162
|
end
|
163
163
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
164
|
+
unless NewRelic::LanguageSupport.rubinius? # Routine segfaults with rbx, see RUBY-1507
|
165
|
+
def test_record_scoped_and_unscoped_metrics_is_thread_safe
|
166
|
+
threads = []
|
167
|
+
nthreads = 25
|
168
|
+
iterations = 100
|
169
|
+
|
170
|
+
nthreads.times do |tid|
|
171
|
+
threads << Thread.new do
|
172
|
+
iterations.times do
|
173
|
+
in_transaction('txn') do
|
174
|
+
@engine.tl_record_scoped_and_unscoped_metrics('m1', ['m3'], 1)
|
175
|
+
@engine.tl_record_scoped_and_unscoped_metrics('m2', ['m4'], 1)
|
176
|
+
end
|
175
177
|
end
|
176
178
|
end
|
177
179
|
end
|
180
|
+
threads.each { |t| t.join }
|
181
|
+
|
182
|
+
expected = { :call_count => nthreads * iterations }
|
183
|
+
assert_metrics_recorded(
|
184
|
+
'm1' => expected,
|
185
|
+
'm2' => expected,
|
186
|
+
['m1', 'txn'] => expected,
|
187
|
+
['m2', 'txn'] => expected,
|
188
|
+
'm3' => expected,
|
189
|
+
'm4' => expected
|
190
|
+
)
|
178
191
|
end
|
179
|
-
threads.each { |t| t.join }
|
180
|
-
|
181
|
-
expected = { :call_count => nthreads * iterations }
|
182
|
-
assert_metrics_recorded(
|
183
|
-
'm1' => expected,
|
184
|
-
'm2' => expected,
|
185
|
-
['m1', 'txn'] => expected,
|
186
|
-
['m2', 'txn'] => expected,
|
187
|
-
'm3' => expected,
|
188
|
-
'm4' => expected
|
189
|
-
)
|
190
192
|
end
|
191
193
|
|
192
194
|
def test_record_scoped_and_unscoped_metrics_records_unscoped_if_not_in_txn
|
@@ -31,8 +31,16 @@ class NewRelic::Agent::SystemInfoTest < Minitest::Test
|
|
31
31
|
assert_equal(num_physical_cores , info[:num_physical_cores ])
|
32
32
|
assert_equal(num_logical_processors, info[:num_logical_processors])
|
33
33
|
end
|
34
|
+
elsif File.basename(file) =~ /malformed/
|
35
|
+
define_method("test_#{File.basename(file)}") do
|
36
|
+
cpuinfo = File.read(file)
|
37
|
+
info = @sysinfo.parse_cpuinfo(cpuinfo)
|
38
|
+
assert_equal(nil, info[:num_physical_package])
|
39
|
+
assert_equal(nil, info[:num_physical_cores])
|
40
|
+
assert_equal(nil, info[:num_logical_processors])
|
41
|
+
end
|
34
42
|
else
|
35
|
-
fail "Bad filename:
|
43
|
+
fail "Bad filename: #{file}"
|
36
44
|
end
|
37
45
|
end
|
38
46
|
|