blob: 3142fb5eeb9384ab26c8688425babb6dcf1ce84e [file] [log] [blame]
-- Copyright 2015 Mirantis, Inc.
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
EXPORT_ASSERT_TO_GLOBALS=true
require('luaunit')
package.path = package.path .. ";../heka/files/lua/common/?.lua;lua/mocks/?.lua"
local M = require('value_matching')
TestValueMatching = {}
function TestValueMatching:test_simple_matching()
local tests = {
{'/var/log', '/var/log'},
{'== /var/log', '/var/log'},
{'==/var/log', '/var/log'},
{'==/var/log ', '/var/log'},
{'==\t/var/log', '/var/log'},
{'=="/var/log"', '/var/log'},
{'== "/var/log"', '/var/log'},
{'== " /var/log"', ' /var/log'},
{'== "/var/log "', '/var/log '},
{'== " /var/log "', ' /var/log '},
{8, 8},
{8, '8'},
{"9", "9"},
{"==10", " 10"},
{"10", 10},
{"== 10", " 10"},
{"== 10.0", " 10.0"},
{"== -10.01", " -10.01"},
{"== 10 ", " 10 "},
{' <=11', '-11'},
{"!= -12", 42},
{"!= 12", 42},
{" > 13", 42},
{">= 13", 13},
{">= -13", 42},
{"< 14", -0},
{"<= 14 ", 0},
{"<= 14", "14"},
}
local r
for _, v in ipairs(tests) do
local exp, value = v[1], v[2]
local m = M.new(exp)
r = m:matches(value)
assertTrue(r)
end
end
function TestValueMatching:test_simple_not_matching()
local tests = {
{'/var/log', '/var/log/mysql'},
{'== "/var/log"' , '/var/log '},
{'"/var/log"', '/var/log '},
{'"/var/log "', '/var/log'},
{'nova-api', 'nova-compute'},
{'== /var/log', '/var/log/mysql'},
{'==/var/log', '/var/log/mysql'},
{'!=/var/log', '/var/log'},
{'!= /var/log', '/var/log'},
{'>10', '5'},
{'> 10', '5 '},
{' <11', '11'},
{' >=11', '-11'},
{' >=11 && <= 42', '-11'},
{' >=11 || == 42', '-11'},
}
for _, v in ipairs(tests) do
local exp, value = v[1], v[2]
local m = M.new(exp)
r = m:matches(value)
assertFalse(r)
end
end
function TestValueMatching:test_string_matching()
local tests = {
{'== "foo.bar"', "foo.bar", true},
{'== foo.bar', "foo.bar", true},
{'== foo.bar ', "foo.bar", true},
{'== foo || bar', "bar", true},
{'== foo || bar', "foo", true},
{'== foo || bar', "??", false},
{'!= foo || != bar', "42", true},
}
for _, v in ipairs(tests) do
local exp, value, expected = v[1], v[2], v[3]
local m = M.new(exp)
r = m:matches(value)
assertEquals(r, expected)
end
end
function TestValueMatching:test_invalid_expression()
local tests = {
'&& 1 && 1',
' && 1',
'|| == 1',
'&& != 12',
' ',
' ',
'\t',
'',
nil,
}
for _, exp in ipairs(tests) do
assertError(M.new, exp)
end
end
function TestValueMatching:test_range_matching()
local tests = {
{'>= 200 && < 300', 200, true},
{'>=200&&<300' , 200, true},
{' >=200&&<300' , 200, true},
{'>= 200 && < 300', 204, true},
{'>= 200 && < 300', 300, false},
{'>= 200 && < 300', 42, false},
{'>= 200 && < 300', 0, false},
}
for _, v in ipairs(tests) do
local exp, value, expected = v[1], v[2], v[3]
local m = M.new(exp)
r = m:matches(value)
assertEquals(r, expected)
end
end
function TestValueMatching:test_wrong_data()
local tests = {
{'>= 200 && < 300', "foo", false},
{'>= 200 && < 300', "" , false},
{'== 200' , "bar", false},
{'== foo' , "10" , false},
{'!= foo' , " 10", true},
}
for _, v in ipairs(tests) do
local exp, value, expected = v[1], v[2], v[3]
local m = M.new(exp)
r = m:matches(value)
assertEquals(r, expected)
end
end
function TestValueMatching:test_precedence()
local tests = {
{'>= 200 && < 300 || >500', "200", true},
{'>= 200 && < 300 || >500', "501", true},
{'>= 200 && < 300 || >=500', "500", true},
{'>400 || >= 200 && < 300', "500", true},
{'>=300 && <500 || >= 200 && < 300', "300", true},
{'>=300 && <500 || >= 200 && < 300', "500", false},
}
for _, v in ipairs(tests) do
local exp, value, expected = v[1], v[2], v[3]
local m = M.new(exp)
r = m:matches(value)
assertEquals(r, expected)
end
end
function TestValueMatching:test_pattern_matching()
local tests = {
{'=~ /var/lib/ceph/osd/ceph%-%d+', "/var/lib/ceph/osd/ceph-1", true},
{'=~ /var/lib/ceph/osd/ceph%-%d+', "/var/lib/ceph/osd/ceph-42", true},
{'=~ ^/var/lib/ceph/osd/ceph%-%d+$', "/var/lib/ceph/osd/ceph-42", true},
{'=~ "/var/lib/ceph/osd/ceph%-%d+"', "/var/lib/ceph/osd/ceph-42", true},
{'=~ "ceph%-%d+"', "/var/lib/ceph/osd/ceph-42", true},
{'=~ "/var/lib/ceph/osd/ceph%-%d+$"', "/var/lib/ceph/osd/ceph-42 ", false}, -- trailing space
{'=~ /var/lib/ceph/osd/ceph%-%d+', "/var/log", false},
{'=~ /var/lib/ceph/osd/ceph%-%d+ || foo', "/var/lib/ceph/osd/ceph-1", true},
{'=~ "foo||bar" || foo', "foo||bar", true},
{'=~ "foo||bar" || foo', "foo", true},
{'=~ "foo&&bar" || foo', "foo&&bar", true},
{'=~ "foo&&bar" || foo', "foo", true},
{'=~ bar && /var/lib/ceph/osd/ceph%-%d+', "/var/lib/ceph/osd/ceph-1", false},
{'=~ -', "-", true},
{'=~ %-', "-", true},
{'!~ /var/lib/ceph/osd/ceph', "/var/log", true},
{'!~ /var/lib/ceph/osd/ceph%-%d+', "/var/log", true},
{'!~ .+osd%-%d+', "/var/log", true},
{'!~ osd%-%d+', "/var/log", true},
--{'=~ [', "[", true},
}
for _, v in ipairs(tests) do
local exp, value, expected = v[1], v[2], v[3]
local m = M.new(exp)
r = m:matches(value)
assertEquals(r, expected)
end
end
function TestValueMatching:test_wrong_patterns_never_match()
-- These patterns raise errors like:
-- malformed pattern (missing ']')
local tests = {
{'=~ [', "[", false},
{'!~ [', "[", false},
}
for _, v in ipairs(tests) do
local exp, value, expected = v[1], v[2], v[3]
local m = M.new(exp)
r = m:matches(value)
assertEquals(r, expected)
end
end
lu = LuaUnit
lu:setVerbosity( 1 )
os.exit( lu:run() )