From: Hendrik B. <nh...@us...> - 2010-07-15 18:54:45
|
Update of /cvsroot/arianne/stendhal_website/scripts/pharauroa/common/net In directory sfp-cvsdas-4.v30.ch3.sourceforge.com:/tmp/cvs-serv2559/scripts/pharauroa/common/net Modified Files: deserializer.php Added Files: deserializer.test.php Log Message: deserializer with tests by CodeCannon (fixes 3030009) Index: deserializer.php =================================================================== RCS file: /cvsroot/arianne/stendhal_website/scripts/pharauroa/common/net/deserializer.php,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** deserializer.php 15 Jul 2010 06:33:05 -0000 1.4 --- deserializer.php 15 Jul 2010 18:54:37 -0000 1.5 *************** *** 1,21 **** <?php class PharauroaDeserializer { ! private $data; private $protocolVersion = PHARAUROA_NETWORK_PROTOCOL_VERSION; ! public function __construct($data) { $this->data = $data; } public function setProtocolVersion($protocolVersion) { $this->$protocolVersion = min($protocolVersion, PHARAUROA_NETWORK_PROTOCOL_VERSION); } - public function getProtocolVersion() { return $this->protocolVersion; } public function readByte() { // TODO opposite of: $this->data = $this->data . chr($byte); --- 1,27 ---- <?php + { + if(!defined('PHARAUROA_NETWORK_PROTOCOL_VERSION')) + define('PHARAUROA_NETWORK_PROTOCOL_VERSION', 1); + } class PharauroaDeserializer { ! // Fields private $data; private $protocolVersion = PHARAUROA_NETWORK_PROTOCOL_VERSION; ! // Constructors public function __construct($data) { $this->data = $data; } + // Version public function setProtocolVersion($protocolVersion) { $this->$protocolVersion = min($protocolVersion, PHARAUROA_NETWORK_PROTOCOL_VERSION); } public function getProtocolVersion() { return $this->protocolVersion; } + + // Numeric public function readByte() { // TODO opposite of: $this->data = $this->data . chr($byte); *************** *** 24,37 **** return $output; // TODO } - public function readInt() { ! /// I recommend you use "V" - unsigned long (always 32 bit, little endian byte order) - to keep endian ordering and size accross network // TODO opposite of: $this->data = $this->data . pack("I", $int); $output = unpack("V", $this->data); $this->data = substr($this->data, 4); ! return $output[0]; } ! public function readString() { // TODO opposite of: $this->writeInt(strlen($string)); $this->data = $this->data . $string; --- 30,42 ---- return $output; // TODO } public function readInt() { ! // I recommend you use "V" - unsigned long (always 32 bit, little endian byte order) - to keep endian ordering and size accross network // TODO opposite of: $this->data = $this->data . pack("I", $int); $output = unpack("V", $this->data); $this->data = substr($this->data, 4); ! return $output[1]; } ! // String public function readString() { // TODO opposite of: $this->writeInt(strlen($string)); $this->data = $this->data . $string; *************** *** 41,46 **** return $output; } ! ! public function write256LongString($string) { // TODO opposite of: $this->writeByte(strlen($string)); $this->data = $this->data . $string; $length = $this->readByte(); --- 46,50 ---- return $output; } ! public function readShortString() { // TODO opposite of: $this->writeByte(strlen($string)); $this->data = $this->data . $string; $length = $this->readByte(); *************** *** 50,51 **** --- 54,56 ---- } } + ?> \ No newline at end of file --- NEW FILE: deserializer.test.php --- <?php { require_once('deserializer.php'); } // Test case readByte() // { $string = ''; $in_byte1 = 0xFF; $in_byte2 = 0x00; $in_byte3 = 128; $in_byte4 = ord('a'); $string = $string.chr($in_byte1); $string = $string.chr($in_byte2); $string = $string.chr($in_byte3); $string = $string.chr($in_byte4); $deserializer = new PharauroaDeserializer($string); $out_byte1 = $deserializer->readByte(); $out_byte2 = $deserializer->readByte(); $out_byte3 = $deserializer->readByte(); $out_byte4 = $deserializer->readByte(); if($out_byte1 != $in_byte1) die('Test case readByte() - 1'); if($out_byte2 != $in_byte2) die('Test case readByte() - 2'); if($out_byte3 != $in_byte3) die('Test case readByte() - 3'); if($out_byte4 != $in_byte4) die('Test case readByte() - 4'); } // Test case readInt() // { $string = ''; $in_int1 = 0xFF; $in_int2 = 0x00; $in_int3 = 128; $in_int4 = 65535; $string = $string.pack("V", $in_int1); $string = $string.pack("V", $in_int2); $string = $string.pack("V", $in_int3); $string = $string.pack("V", $in_int4); $deserializer = new PharauroaDeserializer($string); $out_int1 = $deserializer->readInt(); $out_int2 = $deserializer->readInt(); $out_int3 = $deserializer->readInt(); $out_int4 = $deserializer->readInt(); if($out_int1 != $in_int1) die('Test case readInt() - 1'); if($out_int2 != $in_int2) die('Test case readInt() - 2'); if($out_int3 != $in_int3) die('Test case readInt() - 3'); if($out_int4 != $in_int4) die('Test case readInt() - 4'); } // Test case readString() // { $string = ''; $in_str1 = 'abc123'; $in_str2 = ''; $in_str3 = "a\nb\0c\rd"; $in_str4 = ''; for($i = 0; $i < 512; ++$i) $in_str4 .= chr(rand(0, 255)); $string = $string.pack("V", strlen($in_str1)).$in_str1; $string = $string.pack("V", strlen($in_str2)).$in_str2; $string = $string.pack("V", strlen($in_str3)).$in_str3; $string = $string.pack("V", strlen($in_str4)).$in_str4; $deserializer = new PharauroaDeserializer($string); $out_str1 = $deserializer->readString(); $out_str2 = $deserializer->readString(); $out_str3 = $deserializer->readString(); $out_str4 = $deserializer->readString(); if($out_str1 != $in_str1) die('Test case readString() - 1'); if($out_str2 != $in_str2) die('Test case readString() - 2'); if($out_str3 != $in_str3) die('Test case readString() - 3'); if($out_str4 != $in_str4) die('Test case readString() - 4'); } // Test case readShortString() // { $string = ''; $in_sstr1 = 'abc123'; $in_sstr2 = ''; $in_sstr3 = "a\nb\0c\rd"; $in_sstr4 = '0123456789'; $string = $string.chr(strlen($in_sstr1)).$in_sstr1; $string = $string.chr(strlen($in_sstr2)).$in_sstr2; $string = $string.chr(strlen($in_sstr3)).$in_sstr3; $string = $string.chr(strlen($in_sstr4)).$in_sstr4; $deserializer = new PharauroaDeserializer($string); $out_sstr1 = $deserializer->readShortString(); $out_sstr2 = $deserializer->readShortString(); $out_sstr3 = $deserializer->readShortString(); $out_sstr4 = $deserializer->readShortString(); if($out_sstr1 != $in_sstr1) die('Test case readShortString() - 1'); if($out_sstr2 != $in_sstr2) die('Test case readShortString() - 2'); if($out_sstr3 != $in_sstr3) die('Test case readShortString() - 3'); if($out_sstr4 != $in_sstr4) die('Test case readShortString() - 4'); } // Test case mix // { $string = ''; $in_byte1 = 0xFF; $in_byte2 = 0x00; $in_byte3 = 128; $in_byte4 = ord('a'); $in_int1 = 0xFF; $in_int2 = 0x00; $in_int3 = 128; $in_int4 = 65535; $in_str1 = 'abc123'; $in_str2 = ''; $in_str3 = "a\nb\0c\rd"; $in_str4 = ''; for($i = 0; $i < 512; ++$i) $in_str4 .= chr(rand(0, 255)); $in_sstr1 = 'abc123'; $in_sstr2 = ''; $in_sstr3 = "a\nb\0c\rd"; $in_sstr4 = '0123456789'; $string = $string.chr($in_byte1); $string = $string.pack("V", $in_int1); $string = $string.pack("V", strlen($in_str1)).$in_str1; $string = $string.chr(strlen($in_sstr1)).$in_sstr1; $string = $string.chr(strlen($in_sstr3)).$in_sstr3; $string = $string.chr($in_byte3); $string = $string.pack("V", $in_int2); $string = $string.chr($in_byte4); $string = $string.pack("V", $in_int3); $string = $string.pack("V", $in_int4); $string = $string.pack("V", strlen($in_str2)).$in_str2; $string = $string.chr(strlen($in_sstr2)).$in_sstr2; $string = $string.pack("V", strlen($in_str3)).$in_str3; $string = $string.pack("V", strlen($in_str4)).$in_str4; $string = $string.chr(strlen($in_sstr4)).$in_sstr4; $string = $string.chr($in_byte2); $deserializer = new PharauroaDeserializer($string); $out_byte1 = $deserializer->readByte(); $out_int1 = $deserializer->readInt(); $out_str1 = $deserializer->readString(); $out_sstr1 = $deserializer->readShortString(); $out_sstr3 = $deserializer->readShortString(); $out_byte3 = $deserializer->readByte(); $out_int2 = $deserializer->readInt(); $out_byte4 = $deserializer->readByte(); $out_int3 = $deserializer->readInt(); $out_int4 = $deserializer->readInt(); $out_str2 = $deserializer->readString(); $out_sstr2 = $deserializer->readShortString(); $out_str3 = $deserializer->readString(); $out_str4 = $deserializer->readString(); $out_sstr4 = $deserializer->readShortString(); $out_byte2 = $deserializer->readByte(); if($out_byte1 != $in_byte1) die('Test case mix - readByte() - 1'); if($out_byte2 != $in_byte2) die('Test case mix - readByte() - 2'); if($out_byte3 != $in_byte3) die('Test case mix - readByte() - 3'); if($out_byte4 != $in_byte4) die('Test case mix - readByte() - 4'); if($out_int1 != $in_int1) die('Test case mix - readInt() - 1'); if($out_int2 != $in_int2) die('Test case mix - readInt() - 2'); if($out_int3 != $in_int3) die('Test case mix - readInt() - 3'); if($out_int4 != $in_int4) die('Test case mix - readInt() - 4'); if($out_str1 != $in_str1) die('Test case mix - readString() - 1'); if($out_str2 != $in_str2) die('Test case mix - readString() - 2'); if($out_str3 != $in_str3) die('Test case mix - readString() - 3'); if($out_str4 != $in_str4) die('Test case mix - readString() - 4'); if($out_sstr1 != $in_sstr1) die('Test case mix - readShortString() - 1'); if($out_sstr2 != $in_sstr2) die('Test case mix - readShortString() - 2'); if($out_sstr3 != $in_sstr3) die('Test case mix - readShortString() - 3'); if($out_sstr4 != $in_sstr4) die('Test case mix - readShortString() - 4'); } ?> |