diff --git a/ngcp/cp.lua b/ngcp/cp.lua index 013f537..df04c9a 100644 --- a/ngcp/cp.lua +++ b/ngcp/cp.lua @@ -47,18 +47,18 @@ NGCPContractPrefs_MT.__tostring = function () return setmetatable( t, NGCPContractPrefs_MT ) end - function NGCPContractPrefs:caller_load(contract) + function NGCPContractPrefs:caller_load(contract, ip) if not contract then return {} end - return NGCPContractPrefs._load(self,"caller",contract) + return NGCPContractPrefs._load(self, "caller", contract, ip) end - function NGCPContractPrefs:callee_load(contract) + function NGCPContractPrefs:callee_load(contract, ip) if not contract then return {} end - return NGCPContractPrefs._load(self,"callee",contract) + return NGCPContractPrefs._load(self, "callee", contract, ip) end function NGCPContractPrefs:_defaults(_) @@ -73,9 +73,44 @@ NGCPContractPrefs_MT.__tostring = function () return keys, defaults end - function NGCPContractPrefs:_load(level, contract) + function NGCPContractPrefs:_get_location_id(contract, ip) + if not ip then + return nil; + end + + local con = self.config:getDBConnection() + local query = string.format("SELECT location_id FROM provisioning.voip_contract_locations cl JOIN provisioning.voip_contract_location_blocks cb ON cb.location_id = cl.id WHERE cl.contract_id = %s AND _ipv4_net_from <= UNHEX(HEX(INET_ATON('%s'))) AND _ipv4_net_to >= UNHEX(HEX(INET_ATON('%s'))) LIMIT 1", contract, ip, ip) + if string.find(ip, ':') ~= nil then + query = string.format("SELECT location_id FROM provisioning.voip_contract_locations cl JOIN provisioning.voip_contract_location_blocks cb ON cb.location_id = cl.id WHERE cl.contract_id = %s AND _ipv6_net_from <= UNHEX(HEX(INET_ATON('%s'))) AND _ipv6_net_to >= UNHEX(HEX(INET_ATON('%s'))) LIMIT 1", contract, ip, ip) + end + + local cur,err = con:execute(query) + + if err then + return nil + end + + local row = cur:fetch({}, "a") + + cur:close() + + if row then + return row.location_id + end + + return nil; + end + + function NGCPContractPrefs:_load(level, contract, ip) local con = self.config:getDBConnection() - local query = "SELECT * FROM " .. self.db_table .. " WHERE uuid ='" .. contract .."'" + local location_id = nil + local query = string.format("SELECT * FROM %s WHERE uuid ='%s' AND location_id IS NULL", self.db_table, contract) + if ip then + location_id = self:_get_location_id(contract, ip) + if location_id then + query = string.format("SELECT * FROM %s WHERE uuid ='%s' AND location_id = %d", self.db_table, contract, location_id) + end + end local cur = con:execute(query) local defaults local keys @@ -102,6 +137,8 @@ NGCPContractPrefs_MT.__tostring = function () xavp(k, v) end + xavp("location_id", location_id) + return keys end diff --git a/ngcp/ngcp.lua b/ngcp/ngcp.lua index 57b0909..2b1d5ef 100644 --- a/ngcp/ngcp.lua +++ b/ngcp/ngcp.lua @@ -64,15 +64,15 @@ end return t end - function NGCP:caller_contract_load(contract) - local keys = self.prefs.contract:caller_load(contract) + function NGCP:caller_contract_load(contract, ip) + local keys = self.prefs.contract:caller_load(contract, ip) self.prefs.real:caller_contract_load(keys) return keys end - function NGCP:callee_contract_load(contract) - local keys = self.prefs.contract:callee_load(contract) + function NGCP:callee_contract_load(contract, ip) + local keys = self.prefs.contract:callee_load(contract, ip) self.prefs.real:callee_contract_load(keys) return keys diff --git a/tests/ngcp.lua b/tests/ngcp.lua index a3e3b92..c87083a 100644 --- a/tests/ngcp.lua +++ b/tests/ngcp.lua @@ -571,7 +571,7 @@ TestNGCP = {} --class end function TestNGCP:test_clean_caller_groups() - local groups = {"peer", "usr", "dom", "real", "prof"} + local groups = {"peer", "usr", "dom", "real", "prof", "contract"} for _,v in pairs(groups) do local xavp = self.ngcp.prefs[v]:xavp("caller") @@ -586,7 +586,7 @@ TestNGCP = {} --class function TestNGCP:test_clean_callee_groups() - local groups = {"peer", "usr", "dom", "real", "prof"} + local groups = {"peer", "usr", "dom", "real", "prof", "contract"} for _,v in pairs(groups) do local xavp = self.ngcp.prefs[v]:xavp("callee") diff --git a/tests/ngcp_cp.lua b/tests/ngcp_cp.lua index 3b71e0f..0813ea7 100644 --- a/tests/ngcp_cp.lua +++ b/tests/ngcp_cp.lua @@ -1,5 +1,5 @@ -- --- Copyright 2013 SipWise Team +-- Copyright 2013-2016 SipWise Team -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by @@ -18,8 +18,183 @@ -- Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". -- require('luaunit') -local NGCPContractPrefs = require 'ngcp.cp' +local lemock = require('lemock') +local CPFetch = require 'tests_v.cp_vars' + +local srMock = require 'mocks.sr' +sr = srMock:new() + +local mc,env,con +local cp_vars = CPFetch:new() +package.loaded.luasql = nil +package.preload['luasql.mysql'] = function () + local luasql = {} + luasql.mysql = function () + return env + end +end +local NGCPConfig = require 'ngcp.config' +local NGCPContractPrefs = require 'ngcp.cp' -- luacheck: ignore TestNGCPContractPrefs TestNGCPContractPrefs = {} --class --- class TestNGCP + + function TestNGCPContractPrefs:setUp() + mc = lemock.controller() + env = mc:mock() + con = mc:mock() + self.cur = mc:mock() + + package.loaded.luasql = nil + package.preload['luasql.mysql'] = function () + local luasql = {} + luasql.mysql = function () + return env + end + end + + self.config = NGCPConfig:new() + self.config.env = env + self.config.getDBConnection = function () + return con + end + + self.d = NGCPContractPrefs:new(self.config) + cp_vars:reset() + end + + function TestNGCPContractPrefs:tearDown() + sr.pv.unset("$xavp(caller_dom_prefs)") + sr.pv.unset("$xavp(callee_dom_prefs)") + sr.pv.unset("$xavp(caller_contract_prefs)") + sr.pv.unset("$xavp(callee_contract_prefs)") + sr.pv.unset("$xavp(caller_prof_prefs)") + sr.pv.unset("$xavp(callee_prof_prefs)") + sr.pv.unset("$xavp(caller_prof_prefs)") + sr.pv.unset("$xavp(callee_prof_prefs)") + sr.pv.unset("$xavp(caller_usr_prefs)") + sr.pv.unset("$xavp(callee_usr_prefs)") + sr.pv.unset("$xavp(caller_real_prefs)") + sr.pv.unset("$xavp(callee_real_prefs)") + sr.log("info", "---TestNGCPContractPrefs::cleaned---") + end + + function TestNGCPContractPrefs:test_init() + --print("TestNGCPContractPrefs:test_init") + assertEquals(self.d.db_table, "contract_preferences") + end + + function TestNGCPContractPrefs:test_caller_load_empty() + assertTrue(self.d.config) + assertEquals(self.d:caller_load(), {}) + end + + function TestNGCPContractPrefs:test_callee_load_empty() + assertTrue(self.d.config) + assertEquals(self.d:callee_load(), {}) + end + + function TestNGCPContractPrefs:test_caller_load() + assertTrue(self.d.config) + con:execute("SELECT * FROM contract_preferences WHERE uuid ='1' AND location_id IS NULL") ;mc :returns(self.cur) + self.cur:fetch(mc.ANYARGS) ;mc :returns(cp_vars:val("cp_1")) + self.cur:fetch(mc.ANYARGS) ;mc :returns(nil) + self.cur:close() + + mc:replay() + local keys = self.d:caller_load("1") + mc:verify() + + assertItemsEquals(keys, {"sst_enable"}) + assertEquals(sr.pv.get("$xavp(caller_contract_prefs=>sst_enable)"),"no") + assertNil(sr.pv.get("$xavp(callee_contract_prefs=>location_id)")) + end + + function TestNGCPContractPrefs:test_callee_load() + assertTrue(self.d.config) + con:execute("SELECT location_id FROM provisioning.voip_contract_locations cl JOIN provisioning.voip_contract_location_blocks cb ON cb.location_id = cl.id WHERE cl.contract_id = 2 AND _ipv4_net_from <= UNHEX(HEX(INET_ATON('172.16.15.1'))) AND _ipv4_net_to >= UNHEX(HEX(INET_ATON('172.16.15.1'))) LIMIT 1") ;mc :returns(self.cur) + self.cur:fetch(mc.ANYARGS) ;mc :returns({location_id = 1 }) + self.cur:close() + con:execute("SELECT * FROM contract_preferences WHERE uuid ='2' AND location_id = 1") ;mc :returns(self.cur) + self.cur:fetch(mc.ANYARGS) ;mc :returns(cp_vars:val("cp_2")) + self.cur:fetch(mc.ANYARGS) ;mc :returns(nil) + self.cur:close() + + mc:replay() + local keys = self.d:callee_load("2", '172.16.15.1') + mc:verify() + + assertItemsEquals(keys, {"sst_enable"}) + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>sst_enable)"),"yes") + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>location_id)"),1) + end + + function TestNGCPContractPrefs:test_clean() + local xavp = NGCPContractPrefs:xavp('callee') + xavp("testid",1) + xavp("foo","foo") + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>testid)"),1) + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>foo)"),"foo") + assertEquals(sr.pv.get("$xavp(caller_contract_prefs=>dummy)"),"caller") + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>dummy)"),"callee") + self.d:clean() + assertEquals(sr.pv.get("$xavp(caller_contract_prefs=>dummy)"),"caller") + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>dummy)"),"callee") + assertFalse(sr.pv.get("$xavp(prof)")) + end + + function TestNGCPContractPrefs:test_callee_clean() + local callee_xavp = NGCPContractPrefs:xavp('callee') + callee_xavp("testid",1) + callee_xavp("foo","foo") + local caller_xavp = NGCPContractPrefs:xavp('caller') + caller_xavp("other",1) + caller_xavp("otherfoo","foo") + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>testid)"),1) + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>foo)"),"foo") + assertEquals(sr.pv.get("$xavp(caller_contract_prefs=>dummy)"),"caller") + assertEquals(sr.pv.get("$xavp(caller_contract_prefs=>other)"),1) + assertEquals(sr.pv.get("$xavp(caller_contract_prefs=>otherfoo)"),"foo") + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>dummy)"),"callee") + self.d:clean('callee') + assertEquals(sr.pv.get("$xavp(caller_contract_prefs=>dummy)"),'caller') + assertFalse(sr.pv.get("$xavp(callee_contract_prefs=>testid)")) + assertFalse(sr.pv.get("$xavp(callee_contract_prefs=>foo)")) + assertEquals(sr.pv.get("$xavp(caller_contract_prefs=>other)"),1) + assertEquals(sr.pv.get("$xavp(caller_contract_prefs=>otherfoo)"),"foo") + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>dummy)"),"callee") + end + + function TestNGCPContractPrefs:test_caller_clean() + local callee_xavp = NGCPContractPrefs:xavp('callee') + callee_xavp("testid",1) + callee_xavp("foo","foo") + local caller_xavp = NGCPContractPrefs:xavp('caller') + caller_xavp("other",1) + caller_xavp("otherfoo","foo") + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>testid)"),1) + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>foo)"),"foo") + assertEquals(sr.pv.get("$xavp(caller_contract_prefs=>dummy)"),"caller") + assertEquals(sr.pv.get("$xavp(caller_contract_prefs=>other)"),1) + assertEquals(sr.pv.get("$xavp(caller_contract_prefs=>otherfoo)"),"foo") + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>dummy)"),"callee") + self.d:clean('caller') + assertEquals(sr.pv.get("$xavp(caller_contract_prefs=>dummy)"),"caller") + assertFalse(sr.pv.get("$xavp(caller_contract_prefs=>other)")) + assertFalse(sr.pv.get("$xavp(caller_contract_prefs=>otherfoo)")) + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>testid)"),1) + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>foo)"),"foo") + assertEquals(sr.pv.get("$xavp(callee_contract_prefs=>dummy)"),"callee") + end + + function TestNGCPContractPrefs:test_tostring() + local callee_xavp = NGCPContractPrefs:xavp('callee') + callee_xavp("testid",1) + callee_xavp("foo","foo") + local caller_xavp = NGCPContractPrefs:xavp('caller') + caller_xavp("other",1) + caller_xavp("otherfoo","foo") + assertEquals(tostring(self.d), 'caller_contract_prefs:{other={1},otherfoo={"foo"},dummy={"caller"}}\ncallee_contract_prefs:{dummy={"callee"},testid={1},foo={"foo"}}\n') + end +-- class TestNGCPContractPrefs +--EOF diff --git a/tests_v/cp_vars.lua b/tests_v/cp_vars.lua new file mode 100644 index 0000000..030d505 --- /dev/null +++ b/tests_v/cp_vars.lua @@ -0,0 +1,67 @@ +-- +-- Copyright 2013-2016 SipWise Team +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This package is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- . +-- On Debian systems, the complete text of the GNU General +-- Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". +-- +local cp_vars = { + cp_1 = { + { + id = 1, + uuid = "1", + location_id = nil, + username = "0", + domain = nil, + attribute = "sst_enable", + type = 0, + value = "no", + last_modified = "0000-00-00 00:00:00" + } + }, + cp_2 = { + { + id = 8, + uuid = "2", + location_id = 1, + username = "0", + domain = nil, + attribute = "sst_enable", + type = 0, + value = "yes", + last_modified = "0000-00-00 00:00:00" + } + } +} + +local CPFetch = { + __class__ = 'CPFetch', + _i = 1 +} + function CPFetch.new() + local t = {} + return setmetatable(t, { __index = CPFetch }) + end + + function CPFetch:val(uuid) + self._i = self._i + 1 + return cp_vars[uuid][self._i-1] + end + + function CPFetch:reset() + self._i = 1 + end + +return CPFetch