newrelic_rpm 3.14.0.305 → 3.14.1.311

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +55 -3
  3. data/lib/new_relic/agent/agent.rb +1 -0
  4. data/lib/new_relic/agent/configuration/default_source.rb +25 -2
  5. data/lib/new_relic/agent/error_collector.rb +2 -1
  6. data/lib/new_relic/agent/error_event_aggregator.rb +10 -7
  7. data/lib/new_relic/agent/hostname.rb +1 -1
  8. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +82 -4
  9. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +5 -4
  10. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +24 -4
  11. data/lib/new_relic/agent/instrumentation/rack.rb +80 -29
  12. data/lib/new_relic/agent/pipe_service.rb +4 -0
  13. data/lib/new_relic/agent/transaction.rb +5 -0
  14. data/lib/new_relic/version.rb +1 -1
  15. data/test/multiverse/suites/agent_only/agent_attributes_test.rb +15 -0
  16. data/test/multiverse/suites/agent_only/error_events_test.rb +15 -1
  17. data/test/multiverse/suites/delayed_job/Envfile +10 -0
  18. data/test/multiverse/suites/delayed_job/before_suite.rb +10 -0
  19. data/test/multiverse/suites/delayed_job/delayed_job_instrumentation_test.rb +106 -0
  20. data/test/multiverse/suites/mongo/mongo2_instrumentation_test.rb +45 -0
  21. data/test/multiverse/suites/rack/Envfile +10 -0
  22. data/test/multiverse/suites/rack/before_suite.rb +12 -0
  23. data/test/multiverse/suites/rack/http_response_code_test.rb +2 -2
  24. data/test/multiverse/suites/rack/puma_rack_builder_test.rb +81 -0
  25. data/test/multiverse/suites/rack/rack_auto_instrumentation_test.rb +12 -3
  26. data/test/multiverse/suites/rack/rack_cascade_test.rb +31 -31
  27. data/test/multiverse/suites/rack/rack_env_mutation_test.rb +2 -2
  28. data/test/multiverse/suites/rack/rack_unsupported_version_test.rb +1 -1
  29. data/test/multiverse/suites/rack/response_content_type_test.rb +2 -2
  30. data/test/multiverse/suites/rack/url_map_test.rb +45 -11
  31. data/test/new_relic/agent/agent/connect_test.rb +1 -1
  32. data/test/new_relic/agent/agent_logger_test.rb +2 -0
  33. data/test/new_relic/agent/agent_test.rb +1 -0
  34. data/test/new_relic/agent/audit_logger_test.rb +4 -0
  35. data/test/new_relic/agent/error_collector_test.rb +34 -10
  36. data/test/new_relic/agent/error_event_aggregator_test.rb +12 -1
  37. data/test/new_relic/agent/hostname_test.rb +5 -0
  38. data/test/new_relic/agent/instrumentation/delayed_job_instrumentation_test.rb +23 -0
  39. data/test/new_relic/agent/pipe_service_test.rb +7 -0
  40. data/test/new_relic/marshalling_test_cases.rb +42 -0
  41. metadata +6 -2
@@ -2,44 +2,44 @@
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
4
 
5
+ if NewRelic::Agent::Instrumentation::RackHelpers.rack_version_supported?
6
+
5
7
  require File.join(File.dirname(__FILE__), 'example_app')
6
8
  require 'new_relic/rack/browser_monitoring'
7
9
  require 'new_relic/rack/agent_hooks'
8
10
  require 'new_relic/rack/error_collector'
9
11
 
10
- if NewRelic::Agent::Instrumentation::RackHelpers.rack_version_supported?
11
-
12
- class RackCascadeTest < Minitest::Test
13
- include MultiverseHelpers
14
-
15
- setup_and_teardown_agent(
16
- :beacon => 'beacon',
17
- :browser_key => 'browserKey',
18
- :js_agent_loader => 'loader',
19
- :application_id => '5',
20
- :'rum.enabled' => true,
21
- :license_key => 'a' * 40
22
- )
23
-
24
- include Rack::Test::Methods
25
-
26
- def app
27
- Rack::Builder.app do
28
- use NewRelic::Rack::AgentHooks
29
- use NewRelic::Rack::BrowserMonitoring
30
- use ResponseCodeMiddleware
31
- run Rack::Cascade.new([FirstCascadeExampleApp.new, SecondCascadeExampleApp.new])
32
- end
12
+ class RackCascadeTest < Minitest::Test
13
+ include MultiverseHelpers
14
+
15
+ setup_and_teardown_agent(
16
+ :beacon => 'beacon',
17
+ :browser_key => 'browserKey',
18
+ :js_agent_loader => 'loader',
19
+ :application_id => '5',
20
+ :'rum.enabled' => true,
21
+ :license_key => 'a' * 40
22
+ )
23
+
24
+ include Rack::Test::Methods
25
+
26
+ def app
27
+ Rack::Builder.app do
28
+ use NewRelic::Rack::AgentHooks
29
+ use NewRelic::Rack::BrowserMonitoring
30
+ use ResponseCodeMiddleware
31
+ run Rack::Cascade.new([FirstCascadeExampleApp.new, SecondCascadeExampleApp.new])
33
32
  end
33
+ end
34
34
 
35
- def test_insert_js_does_not_fire_for_rack_cascade_404_responses
36
- rsp = get '/', { 'body' => '<html><head></head><body></body></html>', 'override-response-code' => 404 }
37
- refute(rsp.body.include?('script'), "\nExpected\n---\n#{rsp.body}\n---\nnot to include 'script'.")
38
- end
35
+ def test_insert_js_does_not_fire_for_rack_cascade_404_responses
36
+ rsp = get '/', { 'body' => '<html><head></head><body></body></html>', 'override-response-code' => 404 }
37
+ refute(rsp.body.include?('script'), "\nExpected\n---\n#{rsp.body}\n---\nnot to include 'script'.")
38
+ end
39
39
 
40
- def test_rack_cascade_transactions_are_named_for_the_last_app
41
- rsp = get '/cascade'
42
- assert_metrics_recorded('Controller/SecondCascadeExampleApp/call')
43
- end
40
+ def test_rack_cascade_transactions_are_named_for_the_last_app
41
+ rsp = get '/cascade'
42
+ assert_metrics_recorded('Controller/SecondCascadeExampleApp/call')
44
43
  end
45
44
  end
45
+ end
@@ -2,12 +2,12 @@
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
4
 
5
+ if NewRelic::Agent::Instrumentation::RackHelpers.rack_version_supported?
6
+
5
7
  require 'new_relic/rack/browser_monitoring'
6
8
  require 'new_relic/rack/agent_hooks'
7
9
  require 'new_relic/rack/error_collector'
8
10
 
9
- if NewRelic::Agent::Instrumentation::RackHelpers.rack_version_supported?
10
-
11
11
  class RackEnvMutationTest < Minitest::Test
12
12
  attr_accessor :inner_app
13
13
 
@@ -2,7 +2,7 @@
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
4
 
5
- if !NewRelic::Agent::Instrumentation::RackHelpers.rack_version_supported?
5
+ if !NewRelic::Agent::Instrumentation::RackHelpers.rack_version_supported? && defined? ::Rack
6
6
 
7
7
  class RackUnsupportedVersionTest < Minitest::Test
8
8
  include MultiverseHelpers
@@ -2,13 +2,13 @@
2
2
  # This file is distributed under New Relic's license terms.
3
3
  # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
4
 
5
+ if NewRelic::Agent::Instrumentation::RackHelpers.rack_version_supported?
6
+
5
7
  require File.join(File.dirname(__FILE__), 'example_app')
6
8
  require 'new_relic/rack/browser_monitoring'
7
9
  require 'new_relic/rack/agent_hooks'
8
10
  require 'new_relic/rack/error_collector'
9
11
 
10
- if NewRelic::Agent::Instrumentation::RackHelpers.rack_version_supported?
11
-
12
12
  class HttpResponseContentTypeTest < Minitest::Test
13
13
  include MultiverseHelpers
14
14
 
@@ -6,14 +6,14 @@
6
6
  # properly. Tests against the builder interface more commonly used (i.e. map)
7
7
  # can be found elsewhere in this suite.
8
8
 
9
- if NewRelic::Agent::Instrumentation::RackHelpers.rack_version_supported?
9
+ if NewRelic::Agent::Instrumentation::RackHelpers.version_supported?
10
10
 
11
11
  class UrlMapTest < Minitest::Test
12
12
  include MultiverseHelpers
13
13
 
14
- setup_and_teardown_agent
15
-
16
- include Rack::Test::Methods
14
+ def teardown
15
+ NewRelic::Agent.drop_buffered_data
16
+ end
17
17
 
18
18
  class SimpleMiddleware
19
19
  def initialize(app)
@@ -38,6 +38,10 @@ class UrlMapTest < Minitest::Test
38
38
  class PrefixAppTwo < ExampleApp; end
39
39
 
40
40
  def app
41
+ defined?(Puma) ? puma_rack_app : rack_app
42
+ end
43
+
44
+ def rack_app
41
45
  Rack::Builder.app do
42
46
  use MiddlewareOne
43
47
  use MiddlewareTwo
@@ -48,7 +52,18 @@ class UrlMapTest < Minitest::Test
48
52
  end
49
53
  end
50
54
 
51
- if Rack::VERSION[1] >= 4
55
+ def puma_rack_app
56
+ Puma::Rack::Builder.app do
57
+ use MiddlewareOne
58
+ use MiddlewareTwo
59
+
60
+ run Puma::Rack::URLMap.new(
61
+ '/prefix1' => PrefixAppOne.new,
62
+ '/prefix2' => PrefixAppTwo.new)
63
+ end
64
+ end
65
+
66
+ if defined?(Rack) && Rack::VERSION[1] >= 4
52
67
  def test_metrics_for_default_prefix
53
68
  get '/'
54
69
 
@@ -61,12 +76,12 @@ class UrlMapTest < Minitest::Test
61
76
  'Apdex/Rack/UrlMapTest::ExampleApp/call',
62
77
  'Middleware/Rack/UrlMapTest::MiddlewareOne/call',
63
78
  'Middleware/Rack/UrlMapTest::MiddlewareTwo/call',
64
- 'Nested/Controller/Rack/Rack::URLMap/call',
79
+ nested_controller_metric,
65
80
  'Nested/Controller/Rack/UrlMapTest::ExampleApp/call',
66
81
  ['Middleware/Rack/UrlMapTest::MiddlewareOne/call', 'Controller/Rack/UrlMapTest::ExampleApp/call'],
67
82
  ['Middleware/Rack/UrlMapTest::MiddlewareTwo/call', 'Controller/Rack/UrlMapTest::ExampleApp/call'],
68
83
  ['Nested/Controller/Rack/UrlMapTest::ExampleApp/call', 'Controller/Rack/UrlMapTest::ExampleApp/call'],
69
- ['Nested/Controller/Rack/Rack::URLMap/call', 'Controller/Rack/UrlMapTest::ExampleApp/call']
84
+ [nested_controller_metric, 'Controller/Rack/UrlMapTest::ExampleApp/call']
70
85
  ])
71
86
  end
72
87
  end
@@ -83,11 +98,11 @@ class UrlMapTest < Minitest::Test
83
98
  'Apdex/Rack/UrlMapTest::PrefixAppOne/call',
84
99
  'Middleware/Rack/UrlMapTest::MiddlewareOne/call',
85
100
  'Middleware/Rack/UrlMapTest::MiddlewareTwo/call',
86
- 'Nested/Controller/Rack/Rack::URLMap/call',
101
+ nested_controller_metric,
87
102
  'Nested/Controller/Rack/UrlMapTest::PrefixAppOne/call',
88
103
  ['Middleware/Rack/UrlMapTest::MiddlewareOne/call', 'Controller/Rack/UrlMapTest::PrefixAppOne/call'],
89
104
  ['Middleware/Rack/UrlMapTest::MiddlewareTwo/call', 'Controller/Rack/UrlMapTest::PrefixAppOne/call'],
90
- ['Nested/Controller/Rack/Rack::URLMap/call', 'Controller/Rack/UrlMapTest::PrefixAppOne/call'],
105
+ [nested_controller_metric, 'Controller/Rack/UrlMapTest::PrefixAppOne/call'],
91
106
  ['Nested/Controller/Rack/UrlMapTest::PrefixAppOne/call', 'Controller/Rack/UrlMapTest::PrefixAppOne/call']
92
107
  ])
93
108
  end
@@ -104,14 +119,33 @@ class UrlMapTest < Minitest::Test
104
119
  'Apdex/Rack/UrlMapTest::PrefixAppTwo/call',
105
120
  'Middleware/Rack/UrlMapTest::MiddlewareOne/call',
106
121
  'Middleware/Rack/UrlMapTest::MiddlewareTwo/call',
107
- 'Nested/Controller/Rack/Rack::URLMap/call',
122
+ nested_controller_metric,
108
123
  'Nested/Controller/Rack/UrlMapTest::PrefixAppTwo/call',
109
124
  ['Middleware/Rack/UrlMapTest::MiddlewareOne/call', 'Controller/Rack/UrlMapTest::PrefixAppTwo/call'],
110
125
  ['Middleware/Rack/UrlMapTest::MiddlewareTwo/call', 'Controller/Rack/UrlMapTest::PrefixAppTwo/call'],
111
- ['Nested/Controller/Rack/Rack::URLMap/call', 'Controller/Rack/UrlMapTest::PrefixAppTwo/call'],
126
+ [nested_controller_metric, 'Controller/Rack/UrlMapTest::PrefixAppTwo/call'],
112
127
  ['Nested/Controller/Rack/UrlMapTest::PrefixAppTwo/call', 'Controller/Rack/UrlMapTest::PrefixAppTwo/call']
113
128
  ])
114
129
  end
130
+
131
+ def nested_controller_metric
132
+ url_map_class = defined?(Puma) ? Puma::Rack::URLMap : Rack::URLMap
133
+ "Nested/Controller/Rack/#{url_map_class}/call"
134
+ end
135
+
136
+ # We're not using Rack::Test so that we can test against an enviroment
137
+ # that requires puma only. Since we're only using the `get` method this is
138
+ # easy enough replicate. If this becomes a problem in the future perhaps we
139
+ # revisit how we verify that
140
+ def get path
141
+ env = {
142
+ "REQUEST_METHOD"=>"GET",
143
+ "PATH_INFO"=>path,
144
+ "SCRIPT_NAME"=>""
145
+ }
146
+
147
+ app.call env
148
+ end
115
149
  end
116
150
 
117
151
  end
@@ -112,7 +112,7 @@ class NewRelic::Agent::Agent::ConnectTest < Minitest::Test
112
112
  @local_host = "lo-calhost"
113
113
  @environment_report = {}
114
114
 
115
- keys = %w(pid host app_name language agent_version environment settings).map(&:to_sym)
115
+ keys = %w(pid host display_host app_name language agent_version environment settings).map(&:to_sym)
116
116
 
117
117
  settings = connect_settings
118
118
  keys.each do |k|
@@ -33,6 +33,7 @@ class AgentLoggerTest < Minitest::Test
33
33
 
34
34
  def teardown
35
35
  NewRelic::Agent.config.reset_to_defaults
36
+ NewRelic::Agent::Hostname.instance_variable_set(:@hostname, nil)
36
37
  end
37
38
 
38
39
 
@@ -305,6 +306,7 @@ class AgentLoggerTest < Minitest::Test
305
306
  end
306
307
 
307
308
  def test_should_cache_hostname
309
+ NewRelic::Agent::Hostname.instance_variable_set(:@hostname, nil)
308
310
  Socket.expects(:gethostname).once.returns('cachey-mccaherson')
309
311
  logger = create_basic_logger
310
312
  logger.warn("one")
@@ -382,6 +382,7 @@ module NewRelic
382
382
  expected = [
383
383
  :pid,
384
384
  :host,
385
+ :display_host,
385
386
  :app_name,
386
387
  :language,
387
388
  :labels,
@@ -23,6 +23,7 @@ class AuditLoggerTest < Minitest::Test
23
23
 
24
24
  def teardown
25
25
  NewRelic::Agent.config.reset_to_defaults
26
+ NewRelic::Agent::Hostname.instance_variable_set(:@hostname, nil)
26
27
  end
27
28
 
28
29
  def setup_fake_logger
@@ -64,6 +65,7 @@ class AuditLoggerTest < Minitest::Test
64
65
  end
65
66
 
66
67
  def test_log_formatter
68
+ NewRelic::Agent::Hostname.instance_variable_set(:@hostname, nil)
67
69
  Socket.stubs(:gethostname).returns('dummyhost')
68
70
  formatter = NewRelic::Agent::AuditLogger.new.create_log_formatter
69
71
  time = '2012-01-01 00:00:00'
@@ -75,6 +77,7 @@ class AuditLoggerTest < Minitest::Test
75
77
 
76
78
  def test_log_formatter_to_stdout
77
79
  with_config(:'audit_log.path' => "STDOUT") do
80
+ NewRelic::Agent::Hostname.instance_variable_set(:@hostname, nil)
78
81
  Socket.stubs(:gethostname).returns('dummyhost')
79
82
  formatter = NewRelic::Agent::AuditLogger.new.create_log_formatter
80
83
  time = '2012-01-01 00:00:00'
@@ -154,6 +157,7 @@ class AuditLoggerTest < Minitest::Test
154
157
  end
155
158
 
156
159
  def test_should_cache_hostname
160
+ NewRelic::Agent::Hostname.instance_variable_set(:@hostname, nil)
157
161
  Socket.expects(:gethostname).once.returns('cachey-mccaherson')
158
162
  setup_fake_logger
159
163
  3.times do
@@ -32,8 +32,20 @@ class NewRelic::Agent::ErrorCollectorTest < Minitest::Test
32
32
 
33
33
  def test_empty
34
34
  @error_collector.notice_error(nil, :metric=> 'path')
35
- errors = harvest_error_traces
36
- assert_equal 0, errors.length
35
+ traces = harvest_error_traces
36
+ events = harvest_error_events
37
+
38
+ assert_equal 0, traces.length
39
+ assert_equal 0, events.length
40
+ end
41
+
42
+ def test_records_error_outside_of_transaction
43
+ @error_collector.notice_error StandardError.new
44
+ traces = harvest_error_traces
45
+ events = harvest_error_events
46
+
47
+ assert_equal 1, traces.length
48
+ assert_equal 1, events.length
37
49
  end
38
50
 
39
51
  def test_drops_deprecated_options
@@ -52,9 +64,11 @@ class NewRelic::Agent::ErrorCollectorTest < Minitest::Test
52
64
 
53
65
  @error_collector.notice_error(IOError.new("message"), :metric => 'path')
54
66
 
55
- errors = harvest_error_traces
67
+ traces = harvest_error_traces
68
+ events = harvest_error_events
56
69
 
57
- assert_equal 0, errors.length
70
+ assert_equal 0, traces.length
71
+ assert_equal 0, events.length
58
72
  end
59
73
 
60
74
  def test_exclude_later_config_changes
@@ -63,9 +77,11 @@ class NewRelic::Agent::ErrorCollectorTest < Minitest::Test
63
77
  NewRelic::Agent.config.add_config_for_testing(:'error_collector.ignore_errors' => "IOError")
64
78
  @error_collector.notice_error(IOError.new("message"))
65
79
 
66
- errors = harvest_error_traces
80
+ traces = harvest_error_traces
81
+ events = harvest_error_events
67
82
 
68
- assert_equal 1, errors.length
83
+ assert_equal 1, traces.length
84
+ assert_equal 1, events.length
69
85
  end
70
86
 
71
87
  def test_exclude_block
@@ -74,9 +90,11 @@ class NewRelic::Agent::ErrorCollectorTest < Minitest::Test
74
90
  @error_collector.notice_error(IOError.new("message"), :metric => 'path')
75
91
  @error_collector.notice_error(StandardError.new("message"), :metric => 'path')
76
92
 
77
- errors = harvest_error_traces
93
+ traces = harvest_error_traces
94
+ events = harvest_error_events
78
95
 
79
- assert_equal 1, errors.length
96
+ assert_equal 1, traces.length
97
+ assert_equal 1, events.length
80
98
  end
81
99
 
82
100
  def test_failure_in_exclude_block
@@ -86,9 +104,11 @@ class NewRelic::Agent::ErrorCollectorTest < Minitest::Test
86
104
 
87
105
  @error_collector.notice_error(StandardError.new("message"))
88
106
 
89
- errors = harvest_error_traces
107
+ traces = harvest_error_traces
108
+ events = harvest_error_events
90
109
 
91
- assert_equal 1, errors.length
110
+ assert_equal 1, traces.length
111
+ assert_equal 1, events.length
92
112
  end
93
113
 
94
114
  def test_failure_block_assigned_with_different_instance
@@ -372,4 +392,8 @@ class NewRelic::Agent::ErrorCollectorTest < Minitest::Test
372
392
  def harvest_error_traces
373
393
  @error_collector.error_trace_aggregator.harvest!
374
394
  end
395
+
396
+ def harvest_error_events
397
+ @error_collector.error_event_aggregator.harvest![1]
398
+ end
375
399
  end
@@ -33,13 +33,24 @@ module NewRelic
33
33
 
34
34
  include NewRelic::DataContainerTests
35
35
 
36
+ def test_generates_event_without_payload
37
+ error_event_aggregator.append_event create_noticed_error, nil
38
+
39
+ intrinsics, *_ = last_error_event
40
+
41
+ assert_equal "TransactionError", intrinsics[:type]
42
+ assert_in_delta Time.now.to_f, intrinsics[:timestamp], 0.001
43
+ assert_equal "RuntimeError", intrinsics[:'error.class']
44
+ assert_equal "Big Controller!", intrinsics[:'error.message']
45
+ end
46
+
36
47
  def test_generates_event_from_error
37
48
  generate_error
38
49
 
39
50
  intrinsics, *_ = last_error_event
40
51
 
41
52
  assert_equal "TransactionError", intrinsics[:type]
42
- assert_equal Time.now.to_f, intrinsics[:timestamp]
53
+ assert_in_delta Time.now.to_f, intrinsics[:timestamp], 0.001
43
54
  assert_equal "RuntimeError", intrinsics[:'error.class']
44
55
  assert_equal "Big Controller!", intrinsics[:'error.message']
45
56
  assert_equal "Controller/blogs/index", intrinsics[:transactionName]
@@ -9,9 +9,14 @@ module NewRelic
9
9
  module Agent
10
10
  class HostnameTest < Minitest::Test
11
11
  def setup
12
+ NewRelic::Agent::Hostname.instance_variable_set(:@hostname, nil)
12
13
  Socket.stubs(:gethostname).returns('Rivendell')
13
14
  end
14
15
 
16
+ def teardown
17
+ NewRelic::Agent::Hostname.instance_variable_set(:@hostname, nil)
18
+ end
19
+
15
20
  def test_get_returns_socket_hostname
16
21
  assert_equal 'Rivendell', NewRelic::Agent::Hostname.get
17
22
  end
@@ -0,0 +1,23 @@
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/delayed_job_instrumentation'
7
+
8
+ module NewRelic::Agent::Instrumentation
9
+ class DelayedJobInstrumentationTest < Minitest::Test
10
+
11
+ class DummyPayload
12
+ include NewRelic::Agent::Instrumentation::DelayedJob::Naming
13
+ attr_accessor :object
14
+ end
15
+
16
+ def test_legacy_performable_method
17
+ payload_string = DummyPayload.new.tap { |dp| dp.object = 'LOAD;Foo' }
18
+ payload_fixnum = DummyPayload.new.tap { |dp| dp.object = 123 }
19
+ assert DummyPayload.new.send(:legacy_performable_method?, payload_string)
20
+ refute DummyPayload.new.send(:legacy_performable_method?, payload_fixnum)
21
+ end
22
+ end
23
+ end