require_once dirname(__FILE__).'/../include/CIntegrationTest.php';
class testDiscoveryRules extends CIntegrationTest {
const DRULE_NAME = 'Test discovery rule';
const DRULE_NAME_ERR = 'Test discovery rule with error';
const DISCOVERY_ACTION_NAME = 'Test discovery action';
const DISCOVERY_ACTION_NAME_ERR = 'Test discovery action with error';
const PROXY_NAME = 'Test proxy';
const MAX_ATTEMPTS_DISCOVERY = 60;
const SNMPAGENT_VALID_OID = 'iso.3.6.1.2.1.1.1.0';
const SNMPAGENT_INVALID_OID = 'invalid.OID';
const SNMPAGENT_EXPECTED_INVALID_OID_ERR_MSG = "'SNMPv2c agent' checks failed: " .
'"snmp_parse_oid(): cannot parse OID "' .
self::SNMPAGENT_INVALID_OID . '": Generic error (Sub-id not found: (top) -> invalid)"';
const SNMPSIM_HOST_IP = '127.0.10.3';
const SNMPSIM_HOST_PORT = '1024';
const SNMPSIM_DRULE_IP_RANGE = '127.0.10.3';
const SNMPSIM_VALID_OID = 'iso.3.6.1.2.1.1.1.0';
const SNMPSIM_DRULE_CONTEXT_NAME = 'host/test/test';
const SNMPSIM_USERNAME = 'zabbix';
const SNMPSIM_DRULE_SECURITY_LEVEL = ITEM_SNMPV3_SECURITYLEVEL_AUTHPRIV;
const SNMPSIM_AUTH_PROTOCOL = 'MD5';
const SNMPSIM_DRULE_AUTH_PROTOCOL = ITEM_SNMPV3_AUTHPROTOCOL_MD5;
const SNMPSIM_AUTH_KEY = 'zabbixAuth';
const SNMPSIM_PRIV_PROTOCOL = 'DES';
const SNMPSIM_DRULE_PRIVACY_PROTOCOL = ITEM_SNMPV3_PRIVPROTOCOL_DES;
const SNMPSIM_PRIV_KEY = 'zabbixPriv';
const SNMPSIM_PROCESS_USER = 'nobody';
const SNMPSIM_PROCESS_GROUP = 'nogroup';
const SNMPSIM_DATA_DIR_REL_PATH = 'data/snmpsim';
private static $discoveryActionId;
private static $discoveredHostId;
private static $drules = array();
private static $discoveryActions = array();
private static $proxies = array();
private static function snmpsimStart(): void {
$datadir = realpath(dirname(__FILE__)) . '/' . self::SNMPSIM_DATA_DIR_REL_PATH;
$cmd .= ' --v3-user=' . self::SNMPSIM_USERNAME;
$cmd .= ' --v3-auth-key=' . self::SNMPSIM_AUTH_KEY;
$cmd .= ' --v3-priv-key=' . self::SNMPSIM_PRIV_KEY;
$cmd .= ' --v3-auth-proto=' . self::SNMPSIM_AUTH_PROTOCOL;
$cmd .= ' --v3-priv-proto=' . self::SNMPSIM_PRIV_PROTOCOL;
$cmd .= ' --process-user=' . self::SNMPSIM_PROCESS_USER;
$cmd .= ' --process-group=' . self::SNMPSIM_PROCESS_GROUP;
$cmd .= ' --agent-udpv4-endpoint=' . self::SNMPSIM_DRULE_IP_RANGE . ':' . self::SNMPSIM_HOST_PORT;
$cmd .= ' --data-dir=' . $datadir;
$cmd .= ' > /dev/null 2>&1 &';
private static function snmpsimStop(): void {
shell_exec('pkill snmpsimd > /dev/null 2>&1 &');
private function waitForDiscoveryWithTags($expectedTags, $notExpectedTags = []): string {
for ($i = 0; $i < self::MAX_ATTEMPTS_DISCOVERY; $i++) {
$response = $this->call('host.get', [