public function test_validate_record() { echo "\n"; // Missing content and too long name $data = array("name" => "example.toolongtldtoolongtldtoolongtldtoolongtldtoolongtldtoolongtld1", "type" => "A", "content" => ""); $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(2, $validator->getErrors()); // Missing content only $data['name'] = "example.longtld"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); // Missing type $data['name'] = "example.com"; $data['type'] = ""; $data['content'] = "127.0.0.2"; $validator = new RecordValidator($data); // Invalid type $data['type'] = "ZZZZ"; $data['content'] = "127.0.0.2"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); // Record content too long $data['type'] = "TXT"; $data['content'] = '"' . str_repeat("a", 4096) . '"'; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); // Invalid priority for non-MX/SRV record $data['content'] = '""'; $data['priority'] = "a"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); // Valid priority for non-MX/SRV record $data['content'] = '""'; $data['priority'] = 12; $validator = new RecordValidator($data); $this->assertTrue($validator->validates()); $this->assertEmpty($validator->getErrors()); // Invalid AAAA record unset($data['priority']); $data['type'] = "AAAA"; $data['content'] = "2001:838:300:417:::"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); // Valid AAAA record $data['content'] = "2001:838:300:417::"; $validator = new RecordValidator($data); $this->assertTrue($validator->validates()); // Invalid NS record $data['type'] = "NS"; $data['content'] = "example.toolongtldtoolongtldtoolongtldtoolongtldtoolongtldtoolongtld1"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); // Invalid PTR record $data['type'] = "PTR"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); // NAPTR records $data['type'] = "NAPTR"; $wrong = array('only three parts', 'a 20 "s" "SIP+I2C" "" .', '10 b "s" "SIP+I2C" "" .', '10 20 s "SIP+I2C" "" .', '10 20 "!" "SIP+I2C" "" .', '10 20 "su" "SIP+I2C" "" .', '10 20 "s" SIP+I2C "" .', '10 20 "s" "" "" .', '10 20 "s" "+I2C" "" .', '10 20 "s" "SIP+I2C" A .', '10 20 "s" "SIP+I2C" "iAiAi" .', '10 20 "s" "SIP+I2C" "!A!" .', '10 20 "s" "SIP+I2C" "!A!A!z" .', '10 20 "s" "SIP+I2C" "!A!\\1!z" .', '10 20 "s" "SIP+I2C" "!A!\\1!i" example.com.', '10 20 "s" "SIP+I2C" "!A!\\1!z" example.com.', '10 20 "s" "SIP+I2C" "" ', '10 20 "s" "SIP+I2C" "" x'); $right = array('10 20 "s" "SIP+I2C" "" .', '10 20 "p" "" "" .', '10 20 "s" "SIP+I2C" "!A!\\3!i" .', '10 20 "u" "SIP+I2C" "" .', '10 20 "u" "SIP+I2C" "" example.com.'); foreach ($wrong as $w) { printf("Testing /%s/\n", $w); $data['content'] = $w; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); } foreach ($right as $r) { printf("Testing /%s/\n", $r); $data['content'] = $r; $validator = new RecordValidator($data); $this->assertTrue($validator->validates()); $this->assertEmpty($validator->getErrors()); } // Invalid RP record $data['type'] = "RP"; $data['content'] = "1 2 3"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); $data['content'] = "webmaster@example.com example.com"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); $data['content'] = "webmaster.example.com +invalid.example.com"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); // Valid RP record $data['content'] = "webmaster.example.com example.com"; $validator = new RecordValidator($data); $this->assertTrue($validator->validates()); $this->assertEmpty($validator->getErrors()); // Invalid SOA record $data['type'] = "SOA"; $data['content'] = "1 2"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); $data['content'] = "ns+.example.com hostmaster.example.com 0 86400 3600 86400 86400"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); $data['content'] = "ns.example.com hostmaster+.example.com 0 86400 3600 86400 86400"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); $data['content'] = "ns.example.com hostmaster.example.com a 86400 3600 86400 86400"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); // Valid SOA record $data['content'] = "ns.example.com hostmaster.example.com 0 86400 3600 86400 86400"; $validator = new RecordValidator($data); $this->assertTrue($validator->validates()); $this->assertEmpty($validator->getErrors()); // Invalid SPF record $data['type'] = "SPF"; $data['content'] = "unquoted string"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); // Invalid TXT record $data['type'] = "TXT"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); // Valid TXT/SPF record $data['content'] = '"quoted string"'; $validator = new RecordValidator($data); $this->assertTrue($validator->validates()); $this->assertEmpty($validator->getErrors()); // Invalid SSHFP record $data['type'] = "SSHFP"; $data['content'] = "1 2 3 4"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); $data['content'] = "1 2 0123456789ABCDEF0123456789ABCDEF01234567"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); $data['content'] = "1 1 0123456789ABCDEF0123456789ABCDEF01234567Z"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); // Valid SSHFP $data['content'] = "1 1 0123456789ABCDEF0123456789ABCDEF01234567"; $validator = new RecordValidator($data); $this->assertTrue($validator->validates()); $this->assertEmpty($validator->getErrors()); $data['content'] = "3 2 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"; $validator = new RecordValidator($data); $this->assertTrue($validator->validates()); $this->assertEmpty($validator->getErrors()); // Invalid SRV record $data['type'] = "SRV"; $data['content'] = "1 2 3 4"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); $data['priority'] = 10; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); $data['content'] = "a 443 service.example.com"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); $data['content'] = "100 a service.example.com"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); $data['content'] = "100 443 invalid+.service.example.com"; $validator = new RecordValidator($data); $this->assertFalse($validator->validates()); $this->assertCount(1, $validator->getErrors()); // Valid SRV record $data['content'] = "100 443 service.example.com"; $validator = new RecordValidator($data); $this->assertTrue($validator->validates()); $this->assertEmpty($validator->getErrors()); }