librenms/tests/ConfigTest.php
Tony Murray fff66d3c00
Feature: Generic discovery and poller tests (#7873)
* Processor Tests!

* Capture data from live devices easily.

* fix up some stuff, remove powerconnect things as they seem to be just broken.

* formatting, fix missing assignment
add netonix processor data

* fix multi-line, always add sysDescr and sysObjectID
ios cpm test file

* revert composer change and fix whitespace issues

* add help text

* missed help text

* tighter debug output

* handle empty strings properly and mibs with numbers

* use keys for sorting as intended

* fix type with empty data

* oops :)

* whitespace fix

* try installing fping

* Fix TestCase collision + cleanup

* mark TestCase as abstract
don't run two instances of snmpsim

* better database dumps, improved capture

* style fixes

* fix quotes add a few more tables

* add --prefer-new, properly merge data

* Support separate discovery and poller data. But don't waste space if they aren't needed.

* refactor to use class
collects all code in one place for reusability

* reorganize

* Print out when not saving.

* Support for running multiple (or all) modules at once.

* tidy

* Change unit test to a generic name and test all modules we have data for.

* Add documentation and a few more tidies

* whitespace fixes

* Fix tests, add a couple more modules, more docs

* More docs updates

* Fix scrutinizer issues

* add bgp-peers
2017-12-20 08:36:49 -06:00

186 lines
6.8 KiB
PHP

<?php
/**
* ConfigTest.php
*
* Tests for LibreNMS\Config
*
* 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 program 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 <http://www.gnu.org/licenses/>.
*
* @package LibreNMS
* @link http://librenms.org
* @copyright 2017 Tony Murray
* @author Tony Murray <murraytony@gmail.com>
*/
namespace LibreNMS\Tests;
use LibreNMS\Config;
class ConfigTest extends TestCase
{
public function testGetBasic()
{
$dir = realpath(__DIR__ . '/..');
$this->assertEquals($dir, Config::get('install_dir'));
}
public function testSetBasic()
{
global $config;
Config::set('basics', 'first');
$this->assertEquals('first', $config['basics']);
}
public function testGet()
{
global $config;
$config['one']['two']['three'] = 'easy';
$this->assertEquals('easy', Config::get('one.two.three'));
}
public function testGetDeviceSetting()
{
global $config;
$device = array('set' => true, 'null' => null);
$config['null'] = 'notnull!';
$config['noprefix'] = true;
$config['prefix']['global'] = true;
$this->assertNull(Config::getDeviceSetting($device, 'unset'), 'Non-existing settings should return null');
$this->assertTrue(Config::getDeviceSetting($device, 'set'), 'Could not get setting from device array');
$this->assertTrue(Config::getDeviceSetting($device, 'noprefix'), 'Failed to get setting from global config');
$this->assertEquals(
'notnull!',
Config::getDeviceSetting($device, 'null'),
'Null variables should defer to the global setting'
);
$this->assertTrue(
Config::getDeviceSetting($device, 'global', 'prefix'),
'Failed to get setting from global config with a prefix'
);
$this->assertEquals(
'default',
Config::getDeviceSetting($device, 'something', 'else', 'default'),
'Failed to return the default argument'
);
}
public function testGetOsSetting()
{
global $config;
$config['os']['nullos']['fancy'] = true;
$config['fallback'] = true;
$this->assertNull(Config::getOsSetting(null, 'unset'), '$os is null, should return null');
$this->assertNull(Config::getOsSetting('nullos', 'unset'), 'Non-existing settings should return null');
$this->assertFalse(Config::getOsSetting('nullos', 'unset', false), 'Non-existing settings should return $default');
$this->assertTrue(Config::getOsSetting('nullos', 'fancy'), 'Failed to get setting');
$this->assertTrue(Config::getOsSetting('nullos', 'fallback'), 'Failed to fallback to global setting');
}
public function testGetCombined()
{
global $config;
$config['num'] = array('one', 'two');
$config['os']['nullos']['num'] = array('two', 'three');
$config['assoc'] = array('a' => 'same', 'b' => 'same');
$config['os']['nullos']['assoc'] = array('b' => 'different', 'c' => 'still same');
$config['os']['nullos']['osset'] = true;
$config['gset'] = true;
$this->assertTrue(Config::getCombined('nullos', 'non-existent', true), 'Did not return default value on non-existent key');
$this->assertTrue(Config::getCombined('nullos', 'osset', false), 'Did not return OS value when global value is not set');
$this->assertTrue(Config::getCombined('nullos', 'gset', false), 'Did not return global value when OS value is not set');
$combined = Config::getCombined('nullos', 'num');
sort($combined);
$this->assertEquals(array('one', 'three', 'two'), $combined);
$this->assertSame(array('a' => 'same', 'b' => 'different', 'c' => 'still same'), Config::getCombined('nullos', 'assoc'));
}
public function testSet()
{
global $config;
Config::set('you.and.me', "I'll be there");
$this->assertEquals("I'll be there", $config['you']['and']['me']);
}
public function testSetPersist()
{
if (getenv('DBTEST')) {
dbConnect();
dbBeginTransaction();
} else {
$this->markTestSkipped('Database tests not enabled. Set DBTEST=1 to enable.');
}
$key = 'testing.persist';
dbDelete('config', '`config_name`=?', array($key)); // FIXME dbInsert breaks transactions
$this->assertNull(dbFetchCell('SELECT `config_value` FROM `config` WHERE `config_name`=?', array($key)), "$key should not be set, clean database");
Config::set($key, 'one', true);
$this->assertEquals('one', dbFetchCell('SELECT `config_value` FROM `config` WHERE `config_name`=?', array($key)));
Config::set($key, 'two', true);
$this->assertEquals('two', dbFetchCell('SELECT `config_value` FROM `config` WHERE `config_name`=?', array($key)));
if (getenv('DBTEST')) {
dbRollbackTransaction();
}
}
public function testHas()
{
Config::set('long.key.setting', 'no one cares');
Config::set('null', null);
$this->assertFalse(Config::has('null'), 'Keys set to null do not count as existing');
$this->assertTrue(Config::has('long'), 'Top level key should exist');
$this->assertTrue(Config::has('long.key.setting'), 'Exact exists on value');
$this->assertFalse(Config::has('long.key.setting.nothing'), 'Non-existent child setting');
$this->assertFalse(Config::has('off.the.wall'), 'Non-existent key');
$this->assertFalse(Config::has('off.the'), 'Config:has() should not modify the config');
}
public function testGetNonExistent()
{
$this->assertNull(Config::get('There.is.no.way.this.is.a.key'));
$this->assertFalse(Config::has('There.is.no')); // should not add kes when getting
}
public function testGetNonExistentNested()
{
$this->assertNull(Config::get('cheese.and.bologna'));
}
public function testGetSubtree()
{
Config::set('words.top', 'August');
Config::set('words.mid', 'And Everything');
Config::set('words.bot', 'After');
$expected = array(
'top' => 'August',
'mid' => 'And Everything',
'bot' => 'After'
);
$this->assertEquals($expected, Config::get('words'));
}
}