package.path = package.path .. ";../?.lua;../?/?.lua;../share/?.lua;../share/?/?.lua"
local helpers = require('helpers')
local lfs = require('lfs')
local recovery = {}
function recovery.version()
return "0.0.0"
end
function recovery.branch()
return "test"
end
function recovery.revision()
return "BABEF00D"
end
local sys = {}
local bootctrl = {}
local gui = {}
sys.boot_reason_codes = {
update = 0xF001,
recovery = 0xF002,
factory = 0xF003,
pgm_keys = 0xF004,
usb_mc_mode = 0xF005,
backup = 0xF006,
restore = 0xF007,
os = 0xF008,
unknown = 0xF009
}
bootctrl.slot = {
a = 0,
b = 1
}
function bootctrl.mark_as_active(slot)
end
function bootctrl.mark_as_bootable(slot)
end
function bootctrl.mark_as_unbootable(slot)
end
function bootctrl.mark_as_successful()
end
function bootctrl.get_current_slot()
return bootctrl.slot.b
end
function bootctrl.get_next_active()
end
function sys.sleep(time)
end
function sys.set_os_boot_status()
end
function gui.clear()
end
function gui.display_raw_img(width, height, data)
end
-- Overwrite lfs.chdir method as we do not want to change working directory during running tests on the host
lfs.chdir = function(dir)
end
sys.user = stub()
sys.source_slot = stub()
sys.target_slot = stub()
sys.boot_reason = stub()
sys.boot_reason_str = stub()
sys.set_boot_reason = stub()
sys.flash_bootloader = stub()
sys.repartition_fs = stub()
sys.free_space = stub()
recovery.sys = sys
recovery.gui = gui
recovery.bootctrl = bootctrl
package.preload["recovery"] = function()
return recovery
end
-- Used to recreate the original package.path during switching between products
local ppack = package.path
describe("Factory/backup/restore scripts", function()
package.path = ppack .. ";../products/PurePhone/?.lua"
recovery.sys.source_slot.returns("device/system")
recovery.sys.target_slot.returns("device/target")
recovery.sys.user.returns("device/user")
local function invoke_entry()
require('entry')
end
-- Force reload of the 'entry' module after execution of each unit test case
after_each(function()
package.loaded['entry'] = false
end)
it("invoke factory reset script", function()
recovery.sys.free_space.returns(1024 * 1024 * 1024)
recovery.sys.boot_reason.returns(recovery.sys.boot_reason_codes.factory)
recovery.sys.boot_reason_str.returns("factory")
assert.has_no.error(invoke_entry)
end)
it("invoke backup script", function()
recovery.sys.free_space.returns(1024 * 1024 * 1024)
recovery.sys.boot_reason.returns(recovery.sys.boot_reason_codes.backup)
recovery.sys.boot_reason_str.returns("backup")
assert.has_no.error(invoke_entry)
end)
it("invoke backup script, no free space", function()
recovery.sys.free_space.returns(10)
recovery.sys.boot_reason.returns(recovery.sys.boot_reason_codes.backup)
recovery.sys.boot_reason_str.returns("backup")
assert.has_no.error(invoke_entry)
end)
it("invoke restore script", function()
recovery.sys.free_space.returns(1024 * 1024 * 1024)
recovery.sys.boot_reason.returns(recovery.sys.boot_reason_codes.restore)
recovery.sys.boot_reason_str.returns("restore")
assert.has_no.error(invoke_entry)
end)
end)
local function remove_test_package(path)
if helpers.exists(path) then
helpers.rmdir(path)
end
end
local function extract_test_package(path, where)
os.execute(string.format("tar xf %s -C %s", path, where))
end
describe("Restore script", function()
recovery.sys.free_space.returns(1024 * 1024 * 1024)
recovery.sys.boot_reason.returns(recovery.sys.boot_reason_codes.restore)
recovery.sys.boot_reason_str.returns("restore")
recovery.sys.source_slot.returns("restore/system")
recovery.sys.target_slot.returns("restore/target")
recovery.sys.user.returns("restore/user")
package.loaded['paths'] = false
package.loaded['restore'] = false
it("the same set of databases", function()
-- Prepare test directory and its data
remove_test_package("restore/system")
remove_test_package("restore/user")
extract_test_package("restore/restore1.tar", "restore")
assert.has_no.error(require('restore').execute)
end)
it("legacy backup", function()
-- Prepare test directory and its data
remove_test_package("restore/system")
remove_test_package("restore/user")
extract_test_package("restore/restore2.tar", "restore")
assert.has_no.error(require('restore').execute)
end)
it("not enough disk space", function()
recovery.sys.free_space.returns(10)
-- Prepare test directory and its data
remove_test_package("restore/system")
remove_test_package("restore/user")
extract_test_package("restore/restore1.tar", "restore")
assert.has.error(require('restore').execute)
end)
end)
describe("Update script", function()
recovery.sys.boot_reason.returns(recovery.sys.boot_reason_codes.update)
recovery.sys.boot_reason_str.returns("update")
recovery.sys.source_slot.returns("update/system")
recovery.sys.target_slot.returns("update/target")
recovery.sys.user.returns("update/user")
package.loaded['paths'] = false
package.loaded['update'] = false
-- Prepare test directory and its data
remove_test_package("update/system")
remove_test_package("update/target")
remove_test_package("update/user/temp/update")
extract_test_package("update/system.tar", "update")
extract_test_package("update/target.tar", "update")
extract_test_package("update/update.tar", "update/user/temp")
it("invoke update script", function()
local update = require('update')
assert.has_no.error(update.execute)
end)
end)
describe("Update script UDM - PurePhone", function()
package.path = ppack .. ";../products/PurePhone/?.lua"
recovery.sys.boot_reason.returns(recovery.sys.boot_reason_codes.update)
recovery.sys.boot_reason_str.returns("update")
recovery.sys.source_slot.returns("update_udm/system")
recovery.sys.target_slot.returns("update_udm/target")
recovery.sys.user.returns("update_udm/user")
package.loaded['paths'] = false
package.loaded['update_udm'] = false
package.loaded['update_product'] = false
-- Prepare test directory and its data
remove_test_package("update_udm/system")
remove_test_package("update_udm/target")
remove_test_package("update_udm/user")
remove_test_package("update_udm/user/temp/update")
extract_test_package("update_udm/system.tar", "update_udm")
extract_test_package("update_udm/target.tar", "update_udm")
extract_test_package("update_udm/user.tar", "update_udm")
helpers.mkdirp("update_udm/user/temp")
extract_test_package("update_udm/update.tar", "update_udm/user/temp")
it("invoke update UDM script", function()
local update = require('update_udm')
assert.has_no.error(update.execute)
end)
end)
describe("Update script UDM - BellHybrid", function()
package.path = ppack .. ";../products/BellHybrid/?.lua"
recovery.sys.boot_reason.returns(recovery.sys.boot_reason_codes.update)
recovery.sys.boot_reason_str.returns("update")
recovery.sys.source_slot.returns("update_udm/system")
recovery.sys.target_slot.returns("update_udm/target")
recovery.sys.user.returns("update_udm/user")
package.loaded['paths'] = false
package.loaded['update_udm'] = false
package.loaded['update_product'] = false
-- Prepare test directory and its data
remove_test_package("update_udm/system")
remove_test_package("update_udm/target")
remove_test_package("update_udm/user")
remove_test_package("update_udm/user/temp/update")
extract_test_package("update_udm/system.tar", "update_udm")
extract_test_package("update_udm/target.tar", "update_udm")
extract_test_package("update_udm/user.tar", "update_udm")
helpers.mkdirp("update_udm/user/temp")
extract_test_package("update_udm/update.tar", "update_udm/user/temp")
it("invoke update UDM script", function()
local update = require('update_udm')
assert.has_no.error(update.execute)
end)
end)