sms-logparser 0.14.1 → 0.15.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 146a3d01abb1ef42fd0c65a5ab993616f9ea20bf
4
- data.tar.gz: b066180907bca69e2a76deed5aa500104d209a2d
3
+ metadata.gz: 7ad478bf9a5f80ba72ab9e0f48303ce03e850511
4
+ data.tar.gz: 95d931e94749fcdb7876a7ecece52e4ce225675e
5
5
  SHA512:
6
- metadata.gz: eaf673b707de500d4dc316b21cf2b045e8d2c784551b1236d80aca4a914b667a0a3b16bc7ed5647f9f605661fff5e2bb50615a1ad886638ac1be36d53f4ca219
7
- data.tar.gz: a82b49914a4357543c733f3b91089dd5b3923813bee3273bd223cab1072d2cd4bdbe46ea85102154b460b19dca7e30d151cc403e981a4db36c8ae3aff7e7eb20
6
+ metadata.gz: 19b52cef0cf0181912da7075cb91deb76f9f7a7bd2aeba49ce6409ed730ecc623a0c67927ab059a67bfb1ab31270201fa33c449c5b152470595ba8c1798404fe
7
+ data.tar.gz: 4cc3e8d1135625a43129d5f6f9a460b97e1fa20e7d55671b17017ebf70a9becc4e7b00b0908a3bc48de075895e8683e0483112eea4937784e533ae0bb1c9a6a4
data/lib/sms-logparser.rb CHANGED
@@ -9,4 +9,5 @@ require "sms-logparser/parser"
9
9
  require "sms-logparser/api"
10
10
  require "sms-logparser/loggster"
11
11
  require "sms-logparser/data_cache"
12
+ require "sms-logparser/log_message"
12
13
  require "sms-logparser/cli"
@@ -14,25 +14,22 @@ module SmsLogparser
14
14
  end
15
15
 
16
16
  def send(data)
17
- requests = build_urls(data)
18
- return requests if @options[:simulate]
19
-
20
- threads = requests.map do |request|
21
- Thread.new do
22
- begin
23
- response = @connection.post(request[:uri])
24
- request[:status] = response.status
25
- rescue => e
26
- raise RuntimeError, "Can't send request to #{request[:uri]}. #{e.message}", caller
27
- end
28
- unless @accepted_responses.include?(response.status)
29
- msg = "Received HTTP status #{response.status} from API. Only accepting #{@accepted_responses.join(', ')}."
30
- raise RuntimeError, msg, caller
31
- end
17
+ path = data_to_path(data)
18
+ begin
19
+ if @options[:simulate]
20
+ status = 200
21
+ else
22
+ response = @connection.post(path)
23
+ status = response.status
32
24
  end
25
+ rescue => e
26
+ raise RuntimeError, "Can't send request to #{path}. #{e.message}", caller
33
27
  end
34
- threads.each {|thread| thread.join }
35
- requests
28
+ unless @accepted_responses.include?(status)
29
+ msg = "Received HTTP status #{status} from API. Only accepting #{@accepted_responses.join(', ')}."
30
+ raise RuntimeError, msg, caller
31
+ end
32
+ return path, status
36
33
  end
37
34
 
38
35
  def send_sets(data_sets, concurrency=4)
@@ -42,30 +39,9 @@ module SmsLogparser
42
39
  threads = concurrency.times.map do
43
40
  Thread.new do
44
41
  while !queue.empty?
45
- begin
46
- data = queue.pop
47
- url = @base_path + [
48
- data[:customer_id],
49
- data[:author_id],
50
- data[:project_id],
51
- data[:type],
52
- data[:value]
53
- ].join('/')
54
- if @options[:simulate]
55
- status = 200
56
- else
57
- response = @connection.post(url)
58
- status = response.status
59
- end
60
- rescue => e
61
- raise RuntimeError, "Can't send request to #{url}. #{e.message}", caller
62
- end
63
- unless @accepted_responses.include?(status)
64
- msg = "Received HTTP status #{status} from API. Only accepting #{@accepted_responses.join(', ')}."
65
- raise RuntimeError, msg, caller
66
- end
42
+ path, status = send(queue.pop)
67
43
  semaphore.synchronize {
68
- yield url, status
44
+ yield path, status
69
45
  }
70
46
  end
71
47
  end
@@ -73,22 +49,14 @@ module SmsLogparser
73
49
  threads.each {|thread| thread.join }
74
50
  end
75
51
 
76
- def build_urls(data)
77
- requests = []
78
- path = @base_path + [data[:customer_id], data[:author_id], data[:project_id]].join('/')
79
- unless data[:file] =~ /.*\.m3u8$/
80
- requests << {
81
- url: @url,
82
- uri: [path, data[:traffic_type], data[:bytes]].join('/'),
83
- }
84
- end
85
- if data[:visitor_type]
86
- requests << {
87
- url: @url,
88
- uri: [path, data[:visitor_type], 1].join('/')
89
- }
90
- end
91
- requests
52
+ def data_to_path(data)
53
+ @base_path + [
54
+ data[:customer_id],
55
+ data[:author_id],
56
+ data[:project_id],
57
+ data[:type],
58
+ data[:value]
59
+ ].join('/')
92
60
  end
93
61
 
94
62
  private
@@ -69,13 +69,15 @@ module SmsLogparser
69
69
  logger.info { "Getting log messages from database..." }
70
70
  entries.each do |entry|
71
71
  parser.extract_data_from_msg(entry['Message']) do |data|
72
- if data
73
- if options[:accumulate]
74
- cache.add(data)
75
- logger.debug {"Cached data: #{data}"}
76
- else
77
- requests = api.send(data)
78
- verbose_parser_output(entry['ID'], data, requests)
72
+ if data.size > 0
73
+ data.each do |data_entry|
74
+ if options[:accumulate]
75
+ cache.add(data_entry)
76
+ logger.debug {"Cached data: #{data_entry}"}
77
+ else
78
+ url, status = api.send(data_entry)
79
+ verbose_parser_output(entry['ID'], data_entry, url, status)
80
+ end
79
81
  end
80
82
  state[:last_event_id] = entry['ID']
81
83
  state[:match_count] += 1
@@ -85,9 +87,9 @@ module SmsLogparser
85
87
  end
86
88
  if options[:accumulate]
87
89
  resp_stats = {}
88
- api.send_sets(cache.data_sets, options[:concurrency]) do |url, response|
89
- logger.debug { "POST #{url} (#{response})" }
90
- resp_stats[response] = resp_stats[response].to_i + 1
90
+ api.send_sets(cache.data_sets, options[:concurrency]) do |url, status|
91
+ logger.debug { "POST #{url} (#{status})" }
92
+ resp_stats[status] = resp_stats[status].to_i + 1
91
93
  end
92
94
  logger.info { "Usage commited: #{resp_stats.map {|k,v| "#{v} x status #{k}" }.join(" : ")}" }
93
95
  end
@@ -195,15 +197,11 @@ module SmsLogparser
195
197
  SmsLogparser::Loggster.instance.set_log_device options[:logfile]
196
198
  end
197
199
 
198
- def verbose_parser_output(entry_id, data, requests)
200
+ def verbose_parser_output(entry_id, data, url, status)
199
201
  logger.debug {
200
- "parsing data for #{entry_id} (#{data.map{|k,v| "#{k}=\"#{v || '-'}\""}.join(" ") || ''})"
202
+ "Parsing data for #{entry_id} (#{data.map{|k,v| "#{k}=\"#{v || '-'}\""}.join(" ") || ''})"
201
203
  }
202
- requests.each_with_index do |req, i|
203
- logger.debug {
204
- "URL #{i + 1} for entry #{entry_id} #{req[:url]}#{req[:uri]}"
205
- }
206
- end
204
+ logger.debug {"URL for entry #{entry_id}: #{url} (#{status})"}
207
205
  end
208
206
 
209
207
  def table_to_csv(table)
@@ -5,42 +5,25 @@ module SmsLogparser
5
5
 
6
6
  def initialize
7
7
  @cache = Hash.new
8
- @wanted_keys = [:customer_id, :author_id, :project_id]
9
8
  end
10
9
 
11
10
  def add(data)
12
- key = [data[:customer_id], data[:author_id], data[:project_id]].join('.')
13
- @cache[key] = initialize_value(data) unless @cache.has_key?(key)
14
- unless data[:file] =~ /.*\.m3u8$/
15
- @cache[key][data[:traffic_type]] = @cache[key][data[:traffic_type]].to_i + data[:bytes].to_i
16
- end
17
- if data[:visitor_type]
18
- @cache[key][data[:visitor_type]] = @cache[key][data[:visitor_type]].to_i + 1
19
- end
11
+ key = [data[:customer_id], data[:author_id], data[:project_id], data[:type]].join('.')
12
+ @cache[key] = @cache[key].to_i + data[:value].to_i
20
13
  @cache
21
14
  end
22
15
 
23
16
  def data_sets
24
- sets = []
25
- types = %w(TRAFFIC_PODCAST TRAFFIC_MOBILE TRAFFIC_WEBCAST VISITORS_PODCAST VISITORS_MOBILE VISITORS_WEBCAST)
26
- @cache.each do |key, values|
27
- types.each do |type|
28
- sets << {
29
- customer_id: values[:customer_id],
30
- author_id: values[:author_id],
31
- project_id: values[:project_id],
32
- type: type,
33
- value: values[type]
34
- } if values[type]
35
- end
17
+ @cache.map do |key, value|
18
+ key_components = key.split('.')
19
+ {
20
+ customer_id: key_components[0],
21
+ author_id: key_components[1],
22
+ project_id: key_components[2],
23
+ type: key_components[3],
24
+ value: value
25
+ }
36
26
  end
37
- sets
38
- end
39
-
40
- private
41
-
42
- def initialize_value(data)
43
- data.select { |key,_| @wanted_keys.include? key }
44
27
  end
45
28
 
46
29
  end # class
@@ -0,0 +1,67 @@
1
+ module SmsLogparser
2
+ class LogMessage
3
+ def initialize(message)
4
+ @message = message
5
+ end
6
+
7
+ def customer_id
8
+ match[1]
9
+ end
10
+
11
+ def author_id
12
+ match[2]
13
+ end
14
+
15
+ def project_id
16
+ match[3]
17
+ end
18
+
19
+ def status
20
+ match[5].to_i
21
+ end
22
+
23
+ def bytes
24
+ match[6].to_i
25
+ end
26
+
27
+ def file
28
+ match[4]
29
+ end
30
+
31
+ def file_extname
32
+ File.extname(file)
33
+ end
34
+
35
+ def user_agent
36
+ match[7]
37
+ end
38
+
39
+ def account_info
40
+ {
41
+ customer_id: customer_id,
42
+ author_id: author_id,
43
+ project_id: project_id
44
+ }
45
+ end
46
+
47
+ def transfer_info
48
+ {
49
+ status: status,
50
+ bytes: bytes,
51
+ file: file,
52
+ file_extname: file_extname,
53
+ user_agent: user_agent
54
+ }
55
+ end
56
+
57
+ def to_h
58
+ account_info.merge(transfer_info)
59
+ end
60
+
61
+ private
62
+
63
+ def match
64
+ @match ||= @message.match /\/content\/(\d+)\/(\d+)\/(\d+)\/(\w+\.\w+)\s.*\"\s(\d+)\s(\d+).+"(.*)"$/
65
+ end
66
+ end
67
+ end
@@ -1,29 +1,28 @@
1
1
  module SmsLogparser
2
2
  class Parser
3
3
 
4
- def initialize(options)
4
+ def initialize(options = {})
5
5
  @options = options
6
6
  @logger = SmsLogparser::Loggster.instance
7
7
  end
8
8
 
9
9
  def extract_data_from_msg(message)
10
- data = nil
10
+ data = []
11
11
  if Parser.match?(message)
12
12
  @logger.debug { "Parser MATCH: #{message}" }
13
- match = message.match /\/content\/(\d+)\/(\d+)\/(\d+)\/(\w+\.\w+)\s.*\"\s\d+\s(\d+).+"(.*)"$/
14
- if match
15
- traffic_type = Parser.get_traffic_type(match[6])
16
- visitor_type = Parser.get_visitor_type(traffic_type, match[4])
17
- data = {
18
- :customer_id => match[1],
19
- :author_id => match[2],
20
- :project_id => match[3],
21
- :file => match[4],
22
- :bytes => (match[5].to_f * traffic_correction_factor(traffic_type)).round(0),
23
- :user_agent => match[6],
24
- :traffic_type => traffic_type,
25
- :visitor_type => visitor_type
26
- }
13
+ log_message = LogMessage.new(message)
14
+ type = Parser.get_type(log_message.user_agent)
15
+ data << log_message.account_info.merge(
16
+ type: "TRAFFIC_#{type}",
17
+ value: (log_message.bytes * traffic_correction_factor(type)).round(0)
18
+ )
19
+ if log_message.status == 200 &&
20
+ (log_message.file_extname =~ /\.(mp3|mp4|flv|f4v)/ ||
21
+ log_message.file == 'index.m3u8')
22
+ data << log_message.account_info.merge(
23
+ type: "VISITORS_#{type}",
24
+ value: 1,
25
+ )
27
26
  end
28
27
  else
29
28
  @logger.debug { "Parser IGNORE: #{message}" }
@@ -32,52 +31,40 @@ module SmsLogparser
32
31
  yield data
33
32
  end
34
33
 
35
- def traffic_correction_factor(traffic_type)
36
- factor = case traffic_type
37
- when 'TRAFFIC_WEBCAST'
38
- @options[:webcast_traffic_correction] || 1.0
39
- when 'TRAFFIC_MOBILE'
40
- @options[:mobile_traffic_correction] || 1.0
41
- when 'TRAFFIC_PODCAST'
42
- @options[:podcast_traffic_correction] || 1.0
43
- else
44
- 1.0
45
- end
46
- factor.to_f
47
- end
48
-
49
34
  def self.match?(message)
50
35
  match = message.match(/\/content\/.+\/(\S+) .+ (200|206)/i)
51
- # ignore detect.mp4 and index.m3u8
36
+ # ignore detect.mp4
52
37
  if match
53
- return true unless match[1] =~ /detect.mp4|index.m3u8/i
38
+ return true unless match[1] =~ /detect.mp4/i
54
39
  end
55
40
  false
56
41
  end
57
42
 
58
43
  # see https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent
59
44
  # for mobile browser detection
60
- def self.get_traffic_type(user_agent)
45
+ def self.get_type(user_agent)
61
46
  case user_agent
62
47
  when /.*(iTunes).*/i
63
- 'TRAFFIC_PODCAST'
48
+ 'PODCAST'
64
49
  when /.*(Mobi|IEMobile|Mobile Safari|iPhone|iPod|iPad|Android|BlackBerry|Opera Mini).*/
65
- 'TRAFFIC_MOBILE'
50
+ 'MOBILE'
66
51
  else
67
- 'TRAFFIC_WEBCAST'
52
+ 'WEBCAST'
68
53
  end
69
54
  end
70
55
 
71
- def self.get_visitor_type(traffic_type, file)
72
- return 'VISITORS_MOBILE' if File.extname(file) == '.m3u8'
73
- case traffic_type
74
- when 'TRAFFIC_PODCAST'
75
- 'VISITORS_PODCAST'
76
- when 'TRAFFIC_MOBILE'
77
- File.extname(file) != '.ts' ? 'VISITORS_MOBILE' : nil
56
+ def traffic_correction_factor(traffic_type)
57
+ factor = case traffic_type
58
+ when 'WEBCAST'
59
+ @options[:webcast_traffic_correction] || 1.0
60
+ when 'MOBILE'
61
+ @options[:mobile_traffic_correction] || 1.0
62
+ when 'PODCAST'
63
+ @options[:podcast_traffic_correction] || 1.0
78
64
  else
79
- 'VISITORS_WEBCAST'
65
+ 1.0
80
66
  end
67
+ factor.to_f
81
68
  end
82
69
 
83
70
  end # class
@@ -1,3 +1,3 @@
1
1
  module SmsLogparser
2
- VERSION = "0.14.1"
2
+ VERSION = "0.15.0"
3
3
  end
data/spec/api_spec.rb CHANGED
@@ -9,52 +9,26 @@ describe SmsLogparser::Api do
9
9
  )
10
10
  end
11
11
 
12
- it "sends the correct information to the api" do
12
+ it "builds the correct path for TRAFFIC data" do
13
13
  data = {
14
- :customer_id => 1,
15
- :author_id => 2,
16
- :project_id => 3,
17
- :file => 'myfile.mp4',
18
- :bytes => 128,
19
- :user_agent => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko)",
20
- :traffic_type => 'TRAFFIC_WEBCAST',
21
- :visitor_type => 'VISITORS_WEBCAST'
14
+ customer_id: 1,
15
+ author_id: 2,
16
+ project_id: 3,
17
+ value: 128,
18
+ type: 'TRAFFIC_WEBCAST',
22
19
  }
23
- requests = @api.send(data)
24
- requests.size.must_equal 2
25
- requests[0][:uri].must_match /\/1\/2\/3\/TRAFFIC_WEBCAST\/128$/
26
- requests[1][:uri].must_match /\/1\/2\/3\/VISITORS_WEBCAST\/1$/
20
+ @api.data_to_path(data).must_match /\/1\/2\/3\/TRAFFIC_WEBCAST\/128$/
27
21
  end
28
22
 
29
- it "does not send traffic for m3u8 files" do
23
+ it "builds the correct path for VISITOR data" do
30
24
  data = {
31
- :customer_id => 100,
32
- :author_id => 200,
33
- :project_id => 300,
34
- :file => 'myfile.m3u8',
35
- :bytes => 512,
36
- :user_agent => 'Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0',
37
- :traffic_type => 'TRAFFIC_MOBILE',
38
- :visitor_type => 'VISITORS_MOBILE'
25
+ customer_id: 101,
26
+ author_id: 202,
27
+ project_id: 303,
28
+ type: 'TRAFFIC_MOBILE',
29
+ value: 48
39
30
  }
40
- requests = @api.send(data)
41
- requests.size.must_equal 1
42
- requests[0][:uri].must_match /\/100\/200\/300\/VISITORS_MOBILE\/1$/
43
- end
44
-
45
- it "does not send visitor info if no visitor_type" do
46
- data = {
47
- :customer_id => 101,
48
- :author_id => 202,
49
- :project_id => 303,
50
- :file => 'myfile.mp4',
51
- :bytes => 48,
52
- :user_agent => 'Mozilla/5.0 (Android; Mobile; rv:13.0) Gecko/13.0 Firefox/13.0',
53
- :traffic_type => 'TRAFFIC_MOBILE',
54
- }
55
- requests = @api.send(data)
56
- requests.size.must_equal 1
57
- requests[0][:uri].must_match /\/101\/202\/303\/TRAFFIC_MOBILE\/48$/
31
+ @api.data_to_path(data).must_match /\/101\/202\/303\/TRAFFIC_MOBILE\/48$/
58
32
  end
59
33
 
60
34
  end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe SmsLogparser::DataCache do
4
+
5
+ before do
6
+ @cache = SmsLogparser::DataCache.new
7
+ end
8
+
9
+ it "returns correct totals from cache" do
10
+ @cache.add(customer_id: 101, author_id: 202, project_id: 303, type: 'TRAFFIC_MOBILE', value: 10)
11
+ @cache.add(customer_id: 101, author_id: 202, project_id: 303, type: 'TRAFFIC_MOBILE', value: 400)
12
+ @cache.add(customer_id: 101, author_id: 202, project_id: 303, type: 'TRAFFIC_MOBILE', value: 1000)
13
+
14
+ @cache.add(customer_id: 101, author_id: 202, project_id: 303, type: 'TRAFFIC_WEBCAST', value: 1000)
15
+
16
+ 1000.times do
17
+ @cache.add(customer_id: 101, author_id: 300, project_id: 303, type: 'VISIT_WEBCAST', value: 1)
18
+ end
19
+
20
+ @cache.add(customer_id: 1, author_id: 10, project_id: 600, type: 'TRAFFIC_MOBILE', value: 500)
21
+
22
+ @cache.data_sets.must_include(customer_id: "101", author_id: "202", project_id: "303", type: "TRAFFIC_MOBILE", value: 1410)
23
+ @cache.data_sets.must_include(customer_id: "101", author_id: "202", project_id: "303", type: "TRAFFIC_WEBCAST", value: 1000)
24
+ @cache.data_sets.must_include(customer_id: "101", author_id: "300", project_id: "303", type: "VISIT_WEBCAST", value: 1000)
25
+ @cache.data_sets.must_include(customer_id: "1", author_id: "10", project_id: "600", type: "TRAFFIC_MOBILE", value: 500)
26
+ end
27
+
28
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe SmsLogparser::LogMessage do
4
+
5
+ it "can extract the correct values from messages" do
6
+ log_message = SmsLogparser::LogMessage.new('127.0.0.1 - - [13/Apr/2014:05:33:23 +0200] "GET /content/51/102/42481/simvid_1.mp4 HTTP/1.1" 206 7865189 "-" "iTunes/11.1.5 (Windows; Microsoft Windows 7 Home Premium Edition Service Pack 1 (Build 7601)) AppleWebKit/537.60.11"')
7
+ log_message.customer_id.must_equal '51'
8
+ log_message.author_id.must_equal '102'
9
+ log_message.project_id.must_equal '42481'
10
+ log_message.status.must_equal 206
11
+ log_message.bytes.must_equal 7865189
12
+ log_message.file.must_equal 'simvid_1.mp4'
13
+ log_message.file_extname.must_equal '.mp4'
14
+ log_message.user_agent.must_equal 'iTunes/11.1.5 (Windows; Microsoft Windows 7 Home Premium Edition Service Pack 1 (Build 7601)) AppleWebKit/537.60.11'
15
+ end
16
+
17
+ end
data/spec/parser_spec.rb CHANGED
@@ -34,12 +34,10 @@ describe SmsLogparser::Parser do
34
34
  end
35
35
  end
36
36
 
37
- %w(detect.mp4 index.m3u8).each do |file|
38
- it "does not match excluded files" do
39
- SmsLogparser::Parser.match?(
40
- "GET /content/2/719/54986/#{file} HTTP/1.1\" 200 128 "
41
- ).must_equal false
42
- end
37
+ it "does not match for 'detect.mp4' files" do
38
+ SmsLogparser::Parser.match?(
39
+ "GET /content/2/719/54986/detect.mp4 HTTP/1.1\" 200 128 "
40
+ ).must_equal false
43
41
  end
44
42
 
45
43
  [
@@ -51,7 +49,7 @@ describe SmsLogparser::Parser do
51
49
  "Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3"
52
50
  ].each do |mobile_agent|
53
51
  it "traffic type for mobile user agents is TRAFFIC_MOBILE (#{mobile_agent})" do
54
- SmsLogparser::Parser.get_traffic_type(mobile_agent).must_equal "TRAFFIC_MOBILE"
52
+ SmsLogparser::Parser.get_type(mobile_agent).must_equal "MOBILE"
55
53
  end
56
54
  end
57
55
 
@@ -59,32 +57,60 @@ describe SmsLogparser::Parser do
59
57
  '127.0.0.1 - - [13/Apr/2014:05:33:23 +0200] "GET /content/51/52/42481/simvid_1.mp4 HTTP/1.1" 206 7865189 "-" "iTunes/11.1.5 (Windows; Microsoft Windows 7 Home Premium Edition Service Pack 1 (Build 7601)) AppleWebKit/537.60.11"'
60
58
  ].each do |podcast_agent|
61
59
  it "traffic type for mobile user agents is TRAFFIC_PODCAST (#{podcast_agent})" do
62
- SmsLogparser::Parser.get_traffic_type(podcast_agent).must_equal "TRAFFIC_PODCAST"
60
+ SmsLogparser::Parser.get_type(podcast_agent).must_equal "PODCAST"
63
61
  end
64
62
  end
65
63
 
66
- it "should set visitor_type to VISITORS_MOBILE for index.m3u8 files" do
67
- SmsLogparser::Parser.get_visitor_type(
68
- "TRAFFIC_PODCAST", "index.m3u8"
69
- ).must_equal "VISITORS_MOBILE"
64
+ it "count index.m3u8 with status 200 and user agent iPhone as mobile visit" do
65
+ message = '- - [22/Apr/2014:17:44:17 +0200] "GET /content/51/52/42701/index.m3u8 HTTP/1.1" 200 319 "-" "AppleCoreMedia/1.0.0.11D167 (iPhone; U; CPU OS 7_1 like Mac OS X; de_de)"'
66
+ data = SmsLogparser::Parser.new.extract_data_from_msg(message)
67
+ data[1][:customer_id].must_equal "51"
68
+ data[1][:author_id].must_equal "52"
69
+ data[1][:project_id].must_equal "42701"
70
+ data[1][:type].must_equal 'VISITORS_MOBILE'
71
+ data[1][:value].must_equal 1
72
+ end
73
+
74
+ it "count *.flv with status 200 and user agent Android as mobile visit" do
75
+ message = ' - - [22/Apr/2014:17:44:27 +0200] "GET /content/51/52/42709/simvid_1_40.flv HTTP/1.1" 200 96259 "http://blick.simplex.tv/NubesPlayer/index.html?cID=51&aID=52&pID=42709&autostart=false&themeColor=d6081c&embed=1&configUrl=http://f.blick.ch/resources/61786/ver1-0/js/xtendxIframeStatsSmartphone.js?adtechID=3522740&language=de&quality=40&hideHD=true&progressiveDownload=true" "Mozilla/5.0 (Linux; Android 4.4.2; C6903 Build/14.3.A.0.757) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36"'
76
+ data = SmsLogparser::Parser.new.extract_data_from_msg(message)
77
+ data[1][:customer_id].must_equal "51"
78
+ data[1][:author_id].must_equal "52"
79
+ data[1][:project_id].must_equal "42709"
80
+ data[1][:type].must_equal 'VISITORS_MOBILE'
81
+ data[1][:value].must_equal 1
82
+ end
83
+
84
+ it "count *.mp4 with status 200 and user agent Android as mobile visit" do
85
+ message = '- - [22/Apr/2014:17:44:21 +0200] "GET /content/51/52/42701/simvid_1.mp4 HTTP/1.1" 200 2644715 "-" "Samsung GT-I9505 stagefright/1.2 (Linux;Android 4.4.2)"'
86
+ data = SmsLogparser::Parser.new.extract_data_from_msg(message)
87
+ data[1][:customer_id].must_equal "51"
88
+ data[1][:author_id].must_equal "52"
89
+ data[1][:project_id].must_equal "42701"
90
+ data[1][:type].must_equal 'VISITORS_MOBILE'
91
+ data[1][:value].must_equal 1
70
92
  end
71
93
 
72
- it "should NOT set visitor_type to VISITORS_MOBILE for TRAFFIC_MOBILE and .ts files" do
73
- SmsLogparser::Parser.get_visitor_type(
74
- "TRAFFIC_MOBILE", "file.ts"
75
- ).must_be_nil
94
+ it "count *.flv with status 200 and user agent Firefox on Windows as webcast visit" do
95
+ message = '- - [22/Apr/2014:18:00:50 +0200] "GET /content/51/52/42431/simvid_1_40.flv HTTP/1.1" 200 6742274 "http://blick.simplex.tv/NubesPlayer/player.swf" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"'
96
+ data = SmsLogparser::Parser.new.extract_data_from_msg(message)
97
+ data[1][:customer_id].must_equal "51"
98
+ data[1][:author_id].must_equal "52"
99
+ data[1][:project_id].must_equal "42431"
100
+ data[1][:type].must_equal 'VISITORS_WEBCAST'
101
+ data[1][:value].must_equal 1
76
102
  end
77
103
 
78
- it "should set visitor_type to VISITORS_MOBILE for TRAFFIC_MOBILE and file not .ts" do
79
- SmsLogparser::Parser.get_visitor_type(
80
- "TRAFFIC_MOBILE", "file.mp3"
81
- ).must_equal "VISITORS_MOBILE"
104
+ it "do not count *.css with status 200 as visit" do
105
+ message = '- - [22/Apr/2014:18:00:50 +0200] "GET /content/51/52/42431/application.css HTTP/1.1" 200 192 "http://blick.simplex.tv/NubesPlayer/player.swf" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"'
106
+ data = SmsLogparser::Parser.new.extract_data_from_msg(message)
107
+ data.size.must_equal 1
82
108
  end
83
109
 
84
- it "should set visitor_type to VISITORS_PODCAST for TRAFFIC_PODCAST" do
85
- SmsLogparser::Parser.get_visitor_type(
86
- "TRAFFIC_PODCAST", "file.mp4"
87
- ).must_equal "VISITORS_PODCAST"
110
+ it "do not count status 206 as visit" do
111
+ message = '- - [22/Apr/2014:18:00:50 +0200] "GET /content/51/52/42431/simvid_1_40.flv HTTP/1.1" 206 19289 "http://blick.simplex.tv/NubesPlayer/player.swf" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"'
112
+ data = SmsLogparser::Parser.new.extract_data_from_msg(message)
113
+ data.size.must_equal 1
88
114
  end
89
115
 
90
116
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sms-logparser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.1
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - niwo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-22 00:00:00.000000000 Z
11
+ date: 2014-04-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -127,6 +127,7 @@ files:
127
127
  - lib/sms-logparser/api.rb
128
128
  - lib/sms-logparser/cli.rb
129
129
  - lib/sms-logparser/data_cache.rb
130
+ - lib/sms-logparser/log_message.rb
130
131
  - lib/sms-logparser/loggster.rb
131
132
  - lib/sms-logparser/mysql.rb
132
133
  - lib/sms-logparser/parser.rb
@@ -134,6 +135,8 @@ files:
134
135
  - sms-logparser.gemspec
135
136
  - spec/api_spec.rb
136
137
  - spec/cli_spec.rb
138
+ - spec/data_cache_spec.rb
139
+ - spec/log_message_spec.rb
137
140
  - spec/parser_spec.rb
138
141
  - spec/spec_helper.rb
139
142
  - spec/syslog_events.sql
@@ -164,6 +167,8 @@ summary: sms-logparser - Logparser for Simplex Media Server (SMS)
164
167
  test_files:
165
168
  - spec/api_spec.rb
166
169
  - spec/cli_spec.rb
170
+ - spec/data_cache_spec.rb
171
+ - spec/log_message_spec.rb
167
172
  - spec/parser_spec.rb
168
173
  - spec/spec_helper.rb
169
174
  - spec/syslog_events.sql