blob: 6fe40cd5f03ead26185cfbec5239a105e9ab9706 [file] [log] [blame]
/**
*
* Copyright (c) 2020 Silicon Labs
*
* 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.
*
*
* @jest-environment node
*/
const axios = require('axios')
const dbApi = require('../src-electron/db/db-api')
const queryPackage = require('../src-electron/db/query-package')
const dbEnum = require('../src-shared/db-enum')
const env = require('../src-electron/util/env')
const zclLoader = require('../src-electron/zcl/zcl-loader')
const httpServer = require('../src-electron/server/http-server')
const generationEngine = require('../src-electron/generator/generation-engine')
const testUtil = require('./test-util')
const testQuery = require('./test-query')
const util = require('../src-electron/util/util')
let db
const { port, baseUrl } = testUtil.testServer(__filename)
let uuid = util.createUuid()
let templatePkgId = null
beforeAll(async () => {
env.setDevelopmentEnv()
let file = env.sqliteTestFile('generation')
db = await dbApi.initDatabaseAndLoadSchema(
file,
env.schemaFile(),
env.zapVersion()
)
}, testUtil.timeout.medium())
afterAll(async () => {
await httpServer.shutdownHttpServer()
await dbApi.closeDatabase(db)
}, testUtil.timeout.medium())
describe('Content indexer', () => {
test(
'Test content indexer - simple',
async () => {
let preview = await generationEngine.contentIndexer('Short example')
expect(preview['1']).toBe('Short example\n')
},
testUtil.timeout.short()
)
test(
'Test content indexer - line by line',
async () => {
let preview = await generationEngine.contentIndexer(
'Short example\nwith three\nlines of text',
1
)
expect(preview['1']).toBe('Short example\n')
expect(preview['2']).toBe('with three\n')
expect(preview['3']).toBe('lines of text\n')
},
testUtil.timeout.short()
)
test(
'Test content indexer - blocks',
async () => {
let content = ''
let i = 0
for (i = 0; i < 1000; i++) {
content = content.concat(`line ${i}\n`)
}
let preview = await generationEngine.contentIndexer(content, 50)
expect(preview['1'].startsWith('line 0')).toBeTruthy()
expect(preview['2'].startsWith('line 50')).toBeTruthy()
expect(preview['3'].startsWith('line 100')).toBeTruthy()
expect(preview['20'].startsWith('line 950')).toBeTruthy()
},
testUtil.timeout.short()
)
})
describe('Session specific tests', () => {
test(
'make sure there is no session at the beginning',
async () => {
let cnt = await testQuery.selectCountFrom(db, 'SESSION')
expect(cnt).toBe(0)
},
testUtil.timeout.short()
)
test(
'Now actually load the static data.',
() => zclLoader.loadZcl(db, env.builtinSilabsZclMetafile()),
testUtil.timeout.medium()
)
test(
'And load the templates.',
async () => {
let context = await generationEngine.loadTemplates(
db,
testUtil.testTemplate.zigbee
)
let packageId = context.packageId
templatePkgId = packageId
expect(packageId).not.toBe(null)
expect(db).not.toBe(null)
// Test for cluster package extensions
let extensions = await queryPackage.selectPackageExtension(
db,
packageId,
dbEnum.packageExtensionEntity.cluster
)
expect(extensions.length).toBe(2)
expect(extensions[0].entity).toBe(dbEnum.packageExtensionEntity.cluster)
expect(extensions[0].property).toBe('testClusterExtension')
expect(extensions[0].type).toBe('text')
expect(extensions[0].configurability).toBe('hidden')
expect(extensions[0].label).toBe('Test cluster extension')
expect(extensions[0].globalDefault).toBe(null)
expect(extensions[0].defaults.length).toBe(3)
expect(extensions[1].label).toBe(
'Test cluster extension with external defaults values'
)
expect(extensions[1].globalDefault).toBe(null)
expect(extensions[1].defaults.length).toBe(2)
expect(extensions[1].defaults[0].value).toBe(
'Extension value loaded via external default JSON file.'
)
// Test for command package extensions
extensions = await queryPackage.selectPackageExtension(
db,
packageId,
dbEnum.packageExtensionEntity.command
)
expect(extensions.length).toBe(2)
let tcIndex = 1
let icIndex = 0
expect(extensions[tcIndex].entity).toBe(
dbEnum.packageExtensionEntity.command
)
expect(extensions[tcIndex].property).toBe('testCommandExtension')
expect(extensions[tcIndex].type).toBe('boolean')
expect(extensions[tcIndex].configurability).toBe('hidden')
expect(extensions[tcIndex].label).toBe('Test command extension')
expect(extensions[tcIndex].globalDefault).toBe('0')
expect(extensions[tcIndex].defaults.length).toBe(1)
// Test for attribute package extensions
extensions = await queryPackage.selectPackageExtension(
db,
packageId,
dbEnum.packageExtensionEntity.attribute
)
expect(extensions.length).toBe(2)
expect(extensions[0].entity).toBe(dbEnum.packageExtensionEntity.attribute)
expect(extensions[0].property).toBe('testAttributeExtension1')
expect(extensions[1].property).toBe('testAttributeExtension2')
expect(extensions[0].type).toBe('integer')
expect(extensions[0].configurability).toBe('hidden')
expect(extensions[0].label).toBe('Test attribute extension 1')
expect(extensions[1].label).toBe('Test attribute extension 2')
expect(extensions[0].globalDefault).toBe('0')
expect(extensions[1].globalDefault).toBe('1')
expect(extensions[0].defaults.length).toBe(2)
expect(extensions[1].defaults.length).toBe(1)
expect(extensions[0].defaults[0].value).toBe('42')
expect(extensions[0].defaults[0].parentCode).toBe(0)
expect(extensions[0].defaults[0].entityCode).toBe(0)
expect(extensions[0].defaults[1].entityCode).toBe(1)
// Test for attribute type package extensions
extensions = await queryPackage.selectPackageExtension(
db,
packageId,
dbEnum.packageExtensionEntity.attributeType
)
expect(extensions.length).toBe(1)
// Test for command package extensions
extensions = await queryPackage.selectPackageExtensionByPropertyAndEntity(
db,
packageId,
'implementedCommands',
dbEnum.packageExtensionEntity.command
)
expect(extensions.type).toBe('boolean')
expect(extensions.globalDefault).toBe('0')
expect(extensions.defaults.length).toBe(5)
},
testUtil.timeout.medium()
)
test(
'http server initialization',
async () => {
await httpServer.initHttpServer(db, port)
await testQuery.createSession(
db,
'USER',
uuid,
env.builtinSilabsZclMetafile(),
env.builtinTemplateMetafile()
)
},
testUtil.timeout.medium()
)
let templateCount = 0
test(
'test retrieval of all preview template files',
async () => {
let response = await axios.get(
`${baseUrl}/preview/?sessionId=${uuid}&templatePackageId=${templatePkgId}`
)
templateCount = response.data['length']
for (let i = 0; i < response.data['length']; i++) {
expect(response.data[i]['version']).toBeDefined()
}
},
testUtil.timeout.short()
)
test(
'test that zcl extension is loaded and exists',
async () => {
let response = await axios.get(
`${baseUrl}/zclExtension/cluster/testClusterExtension1?sessionId=${uuid}`
)
expect(response.data.entity).toBe('cluster')
expect(response.data.property).toBe('testClusterExtension1')
expect(response.data.label).toBe(
'Test cluster extension with external defaults values'
)
expect(response.data.defaults[0].entityCode).toBe('0x0003')
expect(response.data.defaults[0].value).toBe(
'Extension value loaded via external default JSON file.'
)
expect(response.data.defaults[1].entityCode).toBe(
'clusterCode mixed with strings'
)
},
testUtil.timeout.medium()
)
test(
'Load a second set of templates.',
() => generationEngine.loadTemplates(db, testUtil.testTemplate.matter),
testUtil.timeout.medium()
)
// Make sure all templates are loaded
test(
'Make sure second set of templates are loaded.',
async () => {
let pkgs = await queryPackage.getPackagesByType(
db,
dbEnum.packageType.genSingleTemplate
)
expect(templateCount).toBeLessThan(pkgs.length)
},
testUtil.timeout.medium()
)
test(
'test retrieval of all preview template files make sure they are session aware',
async () => {
let response = await axios.get(`${baseUrl}/preview/?sessionId=${uuid}`)
expect(templateCount).toEqual(response.data['length'])
},
testUtil.timeout.short()
)
test(
'test that there is generation data in the simple-test.out preview file. Index 1',
async () => {
let response = await axios.get(
`${baseUrl}/preview/simple-test.out/1?sessionId=${uuid}`
)
expect(response.data['result']).toMatch('Test template file.')
},
testUtil.timeout.short()
)
test(
'No generation test, incorrect file name',
async () => {
let response = await axios.get(
`${baseUrl}/preview/no-file?sessionId=${uuid}`
)
expect(response.data['result']).toBeUndefined()
},
testUtil.timeout.short()
)
test(
'No generation test, incorrect file name and incorrect index',
async () => {
let response = await axios.get(
`${baseUrl}/preview/no-file/1?sessionId=${uuid}`
)
expect(response.data['result']).toBeUndefined()
},
testUtil.timeout.short()
)
})