rackamole 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY CHANGED
@@ -33,4 +33,8 @@
33
33
  * Added options for excluding certain mole information for being logged see mole_excludes option.
34
34
  * Eliminated unwise defaults. From now, the option :app_name must be specified when initializing.
35
35
  The option :db_name must also be present if the mongo store is used.
36
- Keep in mind for rackamole to work with wackamole your db name must follow: mole_{app_name}_{environment}_mdb.
36
+ Keep in mind for rackamole to work with wackamole your db name must follow: mole_{app_name}_{environment}_mdb.
37
+
38
+ 0.2.7
39
+ * Bug fixes and cleanup
40
+ * Added user_agent parsing. now extracting os/platform/version as well as browser type and version.
@@ -280,13 +280,16 @@ module Rack
280
280
  # Optional elements...
281
281
  mole?( :software , info, env['SERVER_SOFTWARE'] )
282
282
  mole?( :ip , info, ip )
283
- mole?( :browser , info, id_browser( user_agent ) )
284
283
  mole?( :url , info, request.url )
285
284
  mole?( :path , info, request.path )
286
285
  mole?( :status , info, status )
287
286
  mole?( :headers , info, headers )
288
287
  mole?( :body , info, response.body ) if response
289
288
 
289
+ # Gather up browser and client machine info
290
+ agent_info = Rackamole::Utils::AgentDetect.parse( user_agent )
291
+ %w(browser machine).each { |type| mole?(type.to_sym, info, agent_info[type.to_sym] ) }
292
+
290
293
  # Dump request params
291
294
  unless request.params.empty?
292
295
  info[:params] = filter_params( request.params, options[:param_excludes] || [] )
@@ -324,19 +327,7 @@ module Rack
324
327
  end
325
328
  results
326
329
  end
327
-
328
- # Attempts to detect browser type from agent info.
329
- # BOZO !! Probably more efficient way to do this...
330
- def browser_types() @browsers ||= [ 'Firefox', 'Safari', 'MSIE 8.0', 'MSIE 7.0', 'MSIE 6.0', 'Opera', 'Chrome' ] end
331
-
332
- def id_browser( user_agent )
333
- return "N/A" if !user_agent or user_agent.empty?
334
- browser_types.each do |b|
335
- return b if user_agent.match( /.*?#{b.gsub(/\./,'\.')}.*?/ )
336
- end
337
- "N/A"
338
- end
339
-
330
+
340
331
  # Trim stack trace
341
332
  def trim_stack( boom )
342
333
  boom.backtrace[0...4]
@@ -197,7 +197,8 @@ module Rackamole
197
197
  :time_id => :tid,
198
198
  :user_id => :uid,
199
199
  :user_name => :una,
200
- :browser => :bro,
200
+ :browser => :bro,
201
+ :machine => :mac,
201
202
  :host => :hos,
202
203
  :software => :sof,
203
204
  :request_time => :rti,
@@ -0,0 +1,73 @@
1
+ # This agent business is a cluster fuck. Won't even pretend detection will
2
+ # be accurate. But at least an honest try...
3
+ # BOZO !! Need to handle iphone, android, etc...
4
+ module Rackamole::Utils
5
+ class AgentDetect
6
+
7
+ # browsers...
8
+ def self.browsers() %w[Opera Firefox Chrome Safari MSIE]; end
9
+
10
+ # Parses user agent to extract browser and machine info
11
+ def self.parse( agent )
12
+ browsers.each do |browser|
13
+ return extract( agent, browser ) if check?( agent, browser )
14
+ end
15
+ defaults
16
+ end
17
+
18
+ # =========================================================================
19
+ private
20
+
21
+ # Check for known browsers
22
+ def self.check?( agent, browser )
23
+ agent.match( /#{browser}/ )
24
+ end
25
+
26
+ # Pre populate info hash
27
+ def self.defaults
28
+ info = { :browser => {}, :machine => {} }
29
+ %w[name version].each { |t| info[:browser][t.to_sym] = "N/A" }
30
+ %w[platform os version local].each { |t| info[:machine][t.to_sym] = "N/A" }
31
+ info
32
+ end
33
+
34
+ # Extract machine and browser info
35
+ def self.extract( agent, browser )
36
+ @info = defaults
37
+ begin
38
+ extract_browser( agent, browser )
39
+ extract_platform( agent )
40
+ rescue => boom
41
+ $stderr.puts "Unable to parse user agent `#{agent}"
42
+ $stderr.puts boom
43
+ boom.backtrace.each { |l| $stderr.puts l }
44
+ end
45
+ @info
46
+ end
47
+
48
+ # Extract browser and version
49
+ def self.extract_browser( agent, browser )
50
+ @info[:browser][:name] = browser
51
+ match = agent.match( /#{browser}[\/|\s]([\d|\.?]+)/ )
52
+ @info[:browser][:version] = match[1] if match and match[1]
53
+ end
54
+
55
+ # Extracts machine info
56
+ def self.extract_platform( agent )
57
+ match = agent.match( /\((.*)\)/ )
58
+ return unless match and match[1]
59
+
60
+ machine_info = match[1]
61
+ tokens = machine_info.split( ";" )
62
+ unless tokens.empty?
63
+ platform = tokens[0].strip
64
+ @info[:machine][:platform] = platform
65
+ index = 1
66
+ index += 1 if tokens[1].match( /[MSIE|U]/ )
67
+ os = tokens[index].match( /(.+)\s([\w\d|\.]+)/ )
68
+ @info[:machine][:os] = os[1].strip
69
+ @info[:machine][:version] = os[2].strip
70
+ end
71
+ end
72
+ end
73
+ end
data/lib/rackamole.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Rackamole
2
2
 
3
3
  # :stopdoc:
4
- VERSION = '0.2.6'
4
+ VERSION = '0.2.7'
5
5
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
6
6
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
7
7
  # :startdoc:
@@ -4,7 +4,8 @@ Type : 2
4
4
  App_name : "Test app"
5
5
  Environment : :test
6
6
  Ip : "1.1.1.1"
7
- Browser : "Ibrowse"
7
+ Browser : {"name"=>"Ibrowse", "version"=>"1.X"}
8
+ Machine : {"platform"=>"Blee", "os"=>"Windoze", "version"=>"10.0"}
8
9
  User_id : 100
9
10
  User_name : "Fernand"
10
11
  Request_time : 1.0
@@ -4,7 +4,8 @@ Type : 0
4
4
  App_name : "Test app"
5
5
  Environment : :test
6
6
  Ip : "1.1.1.1"
7
- Browser : "Ibrowse"
7
+ Browser : {"name"=>"Ibrowse", "version"=>"1.X"}
8
+ Machine : {"platform"=>"Blee", "os"=>"Windoze", "version"=>"10.0"}
8
9
  User_id : 100
9
10
  User_name : "Fernand"
10
11
  Request_time : 1.0
@@ -4,7 +4,8 @@ Type : 1
4
4
  App_name : "Test app"
5
5
  Environment : :test
6
6
  Ip : "1.1.1.1"
7
- Browser : "Ibrowse"
7
+ Browser : {"name"=>"Ibrowse", "version"=>"1.X"}
8
+ Machine : {"platform"=>"Blee", "os"=>"Windoze", "version"=>"10.0"}
8
9
  User_id : 100
9
10
  User_name : "Fernand"
10
11
  Request_time : 1.0
@@ -10,7 +10,7 @@ describe Rack::Mole do
10
10
  @test_env = {
11
11
  'rack.session' => { :user_id => 100, :username => "fernand" },
12
12
  'HTTP_X_FORWARDED_FOR' => '1.1.1.1',
13
- 'HTTP_USER_AGENT' => "Firefox"
13
+ 'HTTP_USER_AGENT' => "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.12) Gecko/20080326 CentOS/1.5.0.12-14.el5.centos Firefox/1.5.0.12"
14
14
  }
15
15
  @opts = {
16
16
  :app_name => "Test App",
@@ -184,11 +184,12 @@ describe Rack::Mole do
184
184
  @test_store.mole_result[:session].should_not be_nil
185
185
  @test_store.mole_result[:session].keys.should have(2).items
186
186
  @test_store.mole_result[:status].should == 200
187
+ @test_store.mole_result[:machine].should_not be_nil
187
188
 
188
189
  # Excluded
189
190
  @test_store.mole_result[:headers].should be_nil
190
191
  @test_store.mole_result[:body].should be_nil
191
- @test_store.mole_result[:browser].should be_nil
192
+ @test_store.mole_result[:browser].should be_nil
192
193
  @test_store.mole_result[:ip].should be_nil
193
194
  @test_store.mole_result[:url].should be_nil
194
195
  end
@@ -202,23 +203,27 @@ describe Rack::Mole do
202
203
 
203
204
  it "should set the mole meta correctly" do
204
205
  get "/fred/blee", nil, @test_env
205
-
206
- @test_store.mole_result[:app_name].should == "Test App"
207
- @test_store.mole_result[:environment].should == :test
208
- @test_store.mole_result[:user_id].should be_nil
209
- @test_store.mole_result[:user_name].should == 'fernand'
210
- @test_store.mole_result[:ip].should == '1.1.1.1'
211
- @test_store.mole_result[:browser].should == 'Firefox'
212
- @test_store.mole_result[:method].should == 'GET'
213
- @test_store.mole_result[:url].should == 'http://example.org/fred/blee'
214
- @test_store.mole_result[:path].should == '/fred/blee'
215
- @test_store.mole_result[:type].should == Rackamole.feature
216
- @test_store.mole_result[:params].should be_nil
217
- @test_store.mole_result[:session].should_not be_nil
218
- @test_store.mole_result[:session].keys.should have(2).items
219
- @test_store.mole_result[:status].should == 200
220
- @test_store.mole_result[:headers].should == { "Content-Type" => "text/plain" }
221
- @test_store.mole_result[:body].should be_nil
206
+
207
+ @test_store.mole_result[:app_name].should == "Test App"
208
+ @test_store.mole_result[:environment].should == :test
209
+ @test_store.mole_result[:user_id].should be_nil
210
+ @test_store.mole_result[:user_name].should == 'fernand'
211
+ @test_store.mole_result[:ip].should == '1.1.1.1'
212
+ @test_store.mole_result[:browser][:name].should == "Firefox"
213
+ @test_store.mole_result[:browser][:version].should == '1.5.0.12'
214
+ @test_store.mole_result[:machine][:platform].should == 'X11'
215
+ @test_store.mole_result[:machine][:os].should == 'Linux'
216
+ @test_store.mole_result[:machine][:version].should == 'i686'
217
+ @test_store.mole_result[:method].should == 'GET'
218
+ @test_store.mole_result[:url].should == 'http://example.org/fred/blee'
219
+ @test_store.mole_result[:path].should == '/fred/blee'
220
+ @test_store.mole_result[:type].should == Rackamole.feature
221
+ @test_store.mole_result[:params].should be_nil
222
+ @test_store.mole_result[:session].should_not be_nil
223
+ @test_store.mole_result[:session].keys.should have(2).items
224
+ @test_store.mole_result[:status].should == 200
225
+ @test_store.mole_result[:headers].should == { "Content-Type" => "text/plain" }
226
+ @test_store.mole_result[:body].should be_nil
222
227
  end
223
228
 
224
229
  it "mole an exception correctly" do
@@ -227,12 +232,12 @@ describe Rack::Mole do
227
232
  rescue => boom
228
233
  @test_env['mole.exception'] = boom
229
234
  get "/crap/out", nil, @test_env
230
- @test_store.mole_result[:type].should == Rackamole.fault
231
- @test_store.mole_result[:stack].should have(4).items
232
- @test_store.mole_result[:fault].should == 'Oh snap!'
235
+ @test_store.mole_result[:type].should == Rackamole.fault
236
+ @test_store.mole_result[:stack].should have(4).items
237
+ @test_store.mole_result[:fault].should == 'Oh snap!'
233
238
  last_request.env['mole.stash'].should_not be_nil
234
- fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:226" )
235
- fault.should_not be_nil
239
+ fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:231" )
240
+ fault.should_not be_nil
236
241
  fault.count.should == 1
237
242
  end
238
243
  end
@@ -390,20 +395,35 @@ describe Rack::Mole do
390
395
  end
391
396
 
392
397
  # ---------------------------------------------------------------------------
393
- describe '#id_browser' do
394
- before :all do
395
- @rack = Rack::Mole.new( nil, :app_name => "test app" )
396
- end
397
-
398
- it "should detect a browser type correctly" do
399
- browser = @rack.send( :id_browser, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; InfoPath.2; MS-RTC LM 8; SPC 3.1 P1 Ta)")
400
- browser.should == 'MSIE 7.0'
401
- end
402
-
403
- it "should return unknow if can't detect it" do
404
- @rack.send( :id_browser, 'IBrowse' ).should == 'N/A'
405
- end
406
- end
398
+ # describe '#id_browser' do
399
+ # before :all do
400
+ # @rack = Rack::Mole.new( nil, :app_name => "test app" )
401
+ # end
402
+ #
403
+ # it "should detect a browser type correctly" do
404
+ # agents =
405
+ # [
406
+ # "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0_1 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko)"
407
+ # "Opera/9.61 (Windows NT 5.1; U; ru) Presto/2.1.1"
408
+ # "Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)",
409
+ # "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; (R1 1.5); .NET CLR 1.1.4322)",
410
+ # "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.49 Safari/532.5",
411
+ # "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-us) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9",
412
+ # "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; InfoPath.2; MS-RTC LM 8; SPC 3.1 P1 Ta)",
413
+ # "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7"
414
+ # ]
415
+ # # results = ["Chrome - 4.0.249.49", "Safari - 531.9", "MSIE 7.0", "Firefox - 3.5.7"]
416
+ # # results = ["Chrome", "Safari", "MSIE 7.0", "Firefox"]
417
+ # agents.each do |agent|
418
+ # browser = @rack.send( :id_browser, agent )
419
+ # browser.should == results.shift
420
+ # end
421
+ # end
422
+ #
423
+ # it "should return unknow if can't detect it" do
424
+ # @rack.send( :id_browser, 'IBrowse' ).should == 'N/A'
425
+ # end
426
+ # end
407
427
 
408
428
  # ---------------------------------------------------------------------------
409
429
  describe 'YAML load' do
@@ -9,26 +9,32 @@ describe Rackamole::Store::Log do
9
9
  @store = Rackamole::Store::Log.new( @test_file )
10
10
 
11
11
  @args = OrderedHash.new
12
- @args[:type] = Rackamole.feature
13
- @args[:app_name] = "Test app"
14
- @args[:environment] = :test
15
- @args[:ip] = "1.1.1.1"
16
- @args[:browser] = "Ibrowse"
17
- @args[:user_id] = 100
18
- @args[:user_name] = "Fernand"
19
- @args[:request_time] = 1.0
20
- @args[:url] = "http://test_me/"
21
- @args[:path] = "/fred"
22
- @args[:method] = 'GET'
23
- @args[:params] = { :blee => "duh".to_json }
24
- @args[:session] = { :fred => 10.to_json }
12
+ @args[:type] = Rackamole.feature
13
+ @args[:app_name] = "Test app"
14
+ @args[:environment] = :test
15
+ @args[:ip] = "1.1.1.1"
16
+ @args[:browser] = OrderedHash.new
17
+ @args[:browser][:name] = "Ibrowse"
18
+ @args[:browser][:version] = "1.X"
19
+ @args[:machine] = OrderedHash.new
20
+ @args[:machine][:platform] = "Blee"
21
+ @args[:machine][:os] = "Windoze"
22
+ @args[:machine][:version] = "10.0"
23
+ @args[:user_id] = 100
24
+ @args[:user_name] = "Fernand"
25
+ @args[:request_time] = 1.0
26
+ @args[:url] = "http://test_me/"
27
+ @args[:path] = "/fred"
28
+ @args[:method] = 'GET'
29
+ @args[:params] = { :blee => "duh".to_json }
30
+ @args[:session] = { :fred => 10.to_json }
25
31
  end
26
32
 
27
33
  it "should mole a feature correctly" do
28
34
  @store.mole( @args )
29
- results = File.read( @test_file ).gsub( /.* Mole \:\s/, '' )
30
- expected = File.read( File.join( File.dirname(__FILE__), %w[.. .. expected_results mole_feature.log] ) )
31
- expected.should == results
35
+ results = File.read( @test_file ).gsub( /.* Mole \:\s/, '' )
36
+ expected = File.read( File.join( File.dirname(__FILE__), %w[.. .. expected_results mole_feature.log] ) )
37
+ expected.should == results
32
38
  end
33
39
 
34
40
  it "should mole an exception correctly" do
@@ -23,7 +23,13 @@ describe Rackamole::Store::MongoDb do
23
23
  @args[:environment] = :test
24
24
  @args[:perf_issue] = false
25
25
  @args[:ip] = "1.1.1.1"
26
- @args[:browser] = "Ibrowse"
26
+ @args[:browser] = OrderedHash.new
27
+ @args[:browser][:name] = "Ibrowse"
28
+ @args[:browser][:version] = "1.X"
29
+ @args[:machine] = OrderedHash.new
30
+ @args[:machine][:platform] = "Blee"
31
+ @args[:machine][:os] = "Windoze"
32
+ @args[:machine][:version] = "10.0"
27
33
  @args[:user_id] = 100
28
34
  @args[:user_name] = "Fernand"
29
35
  @args[:request_time] = 1.0
@@ -52,7 +58,11 @@ describe Rackamole::Store::MongoDb do
52
58
  log['fid'].should_not be_nil
53
59
  log['par'].should == { 'blee' => 'duh'.to_json }
54
60
  log['ip'].should == '1.1.1.1'
55
- log['bro'].should == 'Ibrowse'
61
+ log['bro']['name'].should == "Ibrowse"
62
+ log['bro']['version'].should == "1.X"
63
+ log['mac']['platform'].should == "Blee"
64
+ log['mac']['os'].should == "Windoze"
65
+ log['mac']['version'].should == "10.0"
56
66
  log['url'].should == 'http://test_me/'
57
67
  log['met'].should == 'GET'
58
68
  log['ses'].should == { 'fred' => '10' }
@@ -0,0 +1,105 @@
1
+ require File.join(File.dirname(__FILE__), %w[.. .. spec_helper] )
2
+
3
+ describe Rackamole::Utils::AgentDetect do
4
+
5
+ describe "os" do
6
+ it "should detect the os and version correctly" do
7
+ agents = [
8
+ "Opera/8.65 (X11; Linux i686; U; ru)",
9
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) Opera 8.65 [en]",
10
+ "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/1.5.0.12 (.NET CLR 3.5.30729)",
11
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.6) Gecko/2009011912 Firefox/1.5.0.12 Ubiquity/0.1.5",
12
+ "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.0.12) Gecko/20080326 CentOS/1.5.0.12-14.el5.centos Firefox/1.5.0.12",
13
+ "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.24 Safari/532.0",
14
+ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.24 Safari/532.0",
15
+ "Mozilla/5.0 (iPod; U; CPU like Mac OS X; fr) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A102 Safari/522.12",
16
+ "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/522.12",
17
+ "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)",
18
+ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; CPT-IE401SP1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)",
19
+ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 1.1.4322; InfoPath.2)",
20
+ "Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)"
21
+ ]
22
+ expectations = [
23
+ {
24
+ :browser => { :name => "Opera", :version => "8.65" },
25
+ :machine => { :platform => "X11", :os => "Linux", :version => "i686", :local => "N/A" }
26
+ },
27
+ {
28
+ :browser => { :name => "Opera", :version => "8.65" },
29
+ :machine => { :platform => "compatible", :os => "Windows NT", :version => "5.1", :local => "N/A" }
30
+ },
31
+ {
32
+ :browser => { :name => "Firefox", :version => "1.5.0.12" },
33
+ :machine => { :platform => "Windows", :os => "Windows NT", :version => "6.0", :local => "en-US" }
34
+ },
35
+ {
36
+ :browser => { :name => "Firefox", :version => "1.5.0.12" },
37
+ :machine => { :platform => "Macintosh", :os => "Intel Mac OS X", :version => "10.5", :local => "en-US" }
38
+ },
39
+ {
40
+ :browser => { :name => "Firefox", :version => "1.5.0.12" },
41
+ :machine => { :platform => "X11", :os => "Linux", :version => "i686", :local => "en-US" }
42
+ },
43
+ {
44
+ :browser => { :name => "Chrome", :version => "3.0.195.24" },
45
+ :machine => { :platform => "Windows", :os => "Windows NT", :version => "5.1", :local => "en-US" }
46
+ },
47
+ {
48
+ :browser => { :name => "Chrome", :version => "3.0.195.24" },
49
+ :machine => { :platform => "Macintosh", :os => "Intel Mac OS X", :version => "10_5_6", :local => "en-US" }
50
+ },
51
+ {
52
+ :browser => { :name => "Safari", :version => "522.12" },
53
+ :machine => { :platform => "iPod", :os => "CPU like Mac OS", :version => "X", :local => "fr" }
54
+ },
55
+ {
56
+ :browser => { :name => "Safari", :version => "522.12" },
57
+ :machine => { :platform => "iPhone", :os => "CPU like Mac OS", :version => "X", :local => "en" }
58
+ },
59
+ {
60
+ :browser => { :name => "MSIE", :version => "8.0" },
61
+ :machine => { :platform => "compatible", :os => "Windows NT", :version => "5.1", :local => "N/A" }
62
+ },
63
+ {
64
+ :browser => { :name => "MSIE", :version => "7.0" },
65
+ :machine => { :platform => "compatible", :os => "Windows NT", :version => "5.1", :local => "N/A" }
66
+ },
67
+ {
68
+ :browser => { :name => "MSIE", :version => "6.0" },
69
+ :machine => { :platform => "compatible", :os => "Windows NT", :version => "5.1", :local => "N/A" }
70
+ },
71
+ {
72
+ :browser => { :name => "MSIE", :version => "5.00" },
73
+ :machine => { :platform => "compatible", :os => "Windows", :version => "98", :local => "N/A" }
74
+ }
75
+ ]
76
+ count = 0
77
+ agents.each do |agent|
78
+ info = Rackamole::Utils::AgentDetect.parse( agent )
79
+ expected = expectations[count]
80
+ info.should_not be_nil
81
+ %w(name version).each { |t| info[:browser][t.to_sym].should == expected[:browser][t.to_sym] }
82
+ %w(platform os version).each { |t| info[:machine][t.to_sym].should == expected[:machine][t.to_sym] }
83
+ count += 1
84
+ end
85
+ end
86
+ end
87
+
88
+ describe "failure" do
89
+ it "should not crap out if the user agent is not parsable" do
90
+ info = Rackamole::Utils::AgentDetect.parse( "Firefox" )
91
+ %w(browser machine).each { |k| info[k.to_sym].each_pair { |i,v| v.should == (i == :name ? "Firefox" : "N/A") } }
92
+ end
93
+
94
+ it "should produce an empty info object if nothing can be detected" do
95
+ agents = [
96
+ "Oper/8.65 (X11 Linux i686 U ru)",
97
+ ]
98
+ agents.each do |agent|
99
+ info = Rackamole::Utils::AgentDetect.parse( agent )
100
+ info.should_not be_nil
101
+ %w(browser machine).each { |k| info[k.to_sym].each_pair { |i,v| v.should == "N/A" } }
102
+ end
103
+ end
104
+ end
105
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rackamole
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fernand Galiana
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-21 00:00:00 -07:00
12
+ date: 2010-01-28 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -130,6 +130,7 @@ files:
130
130
  - lib/rackamole/store.rb
131
131
  - lib/rackamole/store/log.rb
132
132
  - lib/rackamole/store/mongo_db.rb
133
+ - lib/rackamole/utils/agent_detect.rb
133
134
  - spec/expected_results/mole_exception.log
134
135
  - spec/expected_results/mole_feature.log
135
136
  - spec/expected_results/mole_perf.log
@@ -143,6 +144,7 @@ files:
143
144
  - spec/rackamole/stash/perf_spec.rb
144
145
  - spec/rackamole/store/log_spec.rb
145
146
  - spec/rackamole/store/mongo_db_spec.rb
147
+ - spec/rackamole/utils/agent_detect_spec.rb
146
148
  - spec/rackamole_spec.rb
147
149
  - spec/spec_helper.rb
148
150
  - spec/test_configs/flawed_config.yml