]> granicus.if.org Git - php/commitdiff
- MFH: ext/wddx: classes providing __sleep() are stored without properties (fixed)
authorMark Karpeles <magicaltux@php.net>
Thu, 20 Nov 2008 14:35:22 +0000 (14:35 +0000)
committerMark Karpeles <magicaltux@php.net>
Thu, 20 Nov 2008 14:35:22 +0000 (14:35 +0000)
ext/wddx/tests/002.phpt [new file with mode: 0644]
ext/wddx/tests/003.phpt [new file with mode: 0644]
ext/wddx/tests/004.phpt [new file with mode: 0644]
ext/wddx/tests/005.phpt [new file with mode: 0644]
ext/wddx/wddx.c

diff --git a/ext/wddx/tests/002.phpt b/ext/wddx/tests/002.phpt
new file mode 100644 (file)
index 0000000..692bfa8
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+wddx packet construction using wddx ressource
+--SKIPIF--
+<?php if (!extension_loaded("wddx")) print "skip"; ?>
+--INI--
+precision=14
+--FILE--
+<?php
+       $pkt = wddx_packet_start('TEST comment');
+
+       $var1 = NULL;
+       $var2 = 'some string';
+       $var3 = 756;
+       $var4 = true;
+
+       // add vars to packet
+       wddx_add_vars($pkt, 'var1', 'var2', array('var3', 'var4'));
+       echo wddx_packet_end($pkt);
+?>
+--EXPECT--
+<wddxPacket version='1.0'><header><comment>TEST comment</comment></header><data><struct><var name='var1'><null/></var><var name='var2'><string>some string</string></var><var name='var3'><number>756</number></var><var name='var4'><boolean value='true'/></var></struct></data></wddxPacket>
diff --git a/ext/wddx/tests/003.phpt b/ext/wddx/tests/003.phpt
new file mode 100644 (file)
index 0000000..da5a1c4
--- /dev/null
@@ -0,0 +1,63 @@
+--TEST--
+wddx deserialize from ressource
+--SKIPIF--
+<?php if (!extension_loaded("wddx")) print "skip"; ?>
+--INI--
+precision=14
+--FILE--
+<?php
+       $path = dirname(__FILE__);
+       $fp = fopen("{$path}/wddx.xml", 'r');
+       var_dump(wddx_deserialize($fp));
+       fclose($fp);
+?>
+--EXPECT--
+array(11) {
+  ["aNull"]=>
+  NULL
+  ["aString"]=>
+  string(8) "a string"
+  ["aNumber"]=>
+  float(-12.456)
+  ["aDateTime"]=>
+  int(897625932)
+  ["aDateTime2"]=>
+  int(329632332)
+  ["aDateTime3"]=>
+  int(2223088332)
+  ["aBoolean"]=>
+  bool(true)
+  ["anArray"]=>
+  array(2) {
+    [0]=>
+    int(10)
+    [1]=>
+    string(14) "second element"
+  }
+  ["aBinary"]=>
+  string(11) "binary data"
+  ["anObject"]=>
+  array(2) {
+    ["s"]=>
+    string(8) "a string"
+    ["n"]=>
+    float(-12.456)
+  }
+  ["aRecordset"]=>
+  array(2) {
+    ["NAME"]=>
+    array(2) {
+      [0]=>
+      string(8) "John Doe"
+      [1]=>
+      string(8) "Jane Doe"
+    }
+    ["AGE"]=>
+    array(2) {
+      [0]=>
+      int(34)
+      [1]=>
+      int(31)
+    }
+  }
+}
diff --git a/ext/wddx/tests/004.phpt b/ext/wddx/tests/004.phpt
new file mode 100644 (file)
index 0000000..ae5a6b4
--- /dev/null
@@ -0,0 +1,63 @@
+--TEST--
+wddx session serializer handler (serialize)
+--SKIPIF--
+<?php
+       if (!extension_loaded("wddx")) die("skip Wddx module not loaded");
+       if (!extension_loaded('session')) die('skip Session module not enabled');
+
+       // following test code stolen from ext/session/skipif.inc
+       $save_path = ini_get("session.save_path");
+       if ($save_path) {
+               if (!file_exists($save_path)) {
+                       die("skip Session save_path doesn't exist");
+               }
+
+               if ($save_path && !@is_writable($save_path)) {
+                       if (($p = strpos($save_path, ';')) !== false) {
+                               $save_path = substr($save_path, ++$p);
+                       }
+                       if (!@is_writable($save_path)) {
+                               die("skip\n");
+                       }
+               }
+       }
+?>
+--INI--
+precision=14
+session.serialize_handler=wddx
+session.use_cookies=0
+session.cache_limiter=
+session.save_handler=files
+--FILE--
+<?php
+       class foo {
+               public $bar = "ok";
+               public $invisible = 'you don\'t see me!';
+
+               function method() { $this->yes = "done"; }
+
+               public function __sleep() { return array('bar', 'yes'); }
+       }
+
+       session_start();
+
+       $_SESSION['data'] = array(
+               'test1' => true,
+               'test2' => 'some string',
+               'test3' => 654321,
+               'test4' => array(
+                       'some string',
+                       true,
+                       null
+               ),
+       );
+
+       $_SESSION['class'] = new foo();
+       $_SESSION['class']->method();
+
+       var_dump(session_encode());
+
+       session_destroy();
+?>
+--EXPECT--
+string(550) "<wddxPacket version='1.0'><header/><data><struct><var name='data'><struct><var name='test1'><boolean value='true'/></var><var name='test2'><string>some string</string></var><var name='test3'><number>654321</number></var><var name='test4'><array length='3'><string>some string</string><boolean value='true'/><null/></array></var></struct></var><var name='class'><struct><var name='php_class_name'><string>foo</string></var><var name='bar'><string>ok</string></var><var name='yes'><string>done</string></var></struct></var></struct></data></wddxPacket>"
diff --git a/ext/wddx/tests/005.phpt b/ext/wddx/tests/005.phpt
new file mode 100644 (file)
index 0000000..99e7a9e
--- /dev/null
@@ -0,0 +1,74 @@
+--TEST--
+wddx session serializer handler (deserialize)
+--SKIPIF--
+<?php
+       if (!extension_loaded("wddx")) die("skip Wddx module not loaded");
+       if (!extension_loaded('session')) die('skip Session module not enabled');
+
+       // following test code stolen from ext/session/skipif.inc
+       $save_path = ini_get("session.save_path");
+       if ($save_path) {
+               if (!file_exists($save_path)) {
+                       die("skip Session save_path doesn't exist");
+               }
+
+               if ($save_path && !@is_writable($save_path)) {
+                       if (($p = strpos($save_path, ';')) !== false) {
+                               $save_path = substr($save_path, ++$p);
+                       }
+                       if (!@is_writable($save_path)) {
+                               die("skip\n");
+                       }
+               }
+       }
+?>
+--INI--
+precision=14
+session.serialize_handler=wddx
+session.use_cookies=0
+session.cache_limiter=
+session.save_handler=files
+--FILE--
+<?php
+       class foo {
+               public $bar = "ok";
+
+               function method() { $this->yes = "done"; }
+       }
+
+       session_start();
+
+       session_decode("<wddxPacket version='1.0'><header/><data><struct><var name='data'><struct><var name='test1'><boolean value='true'/></var><var name='test2'><string>some string</string></var><var name='test3'><number>654321</number></var><var name='test4'><array length='3'><string>some string</string><boolean value='true'/><null/></array></var></struct></var><var name='class'><struct><var name='php_class_name'><string>foo</string></var><var name='bar'><string>ok</string></var><var name='yes'><string>done</string></var></struct></var></struct></data></wddxPacket>");
+
+       var_dump($_SESSION);
+
+       session_destroy();
+?>
+--EXPECT--
+array(2) {
+  ["data"]=>
+  array(4) {
+    ["test1"]=>
+    bool(true)
+    ["test2"]=>
+    string(11) "some string"
+    ["test3"]=>
+    int(654321)
+    ["test4"]=>
+    array(3) {
+      [0]=>
+      string(11) "some string"
+      [1]=>
+      bool(true)
+      [2]=>
+      NULL
+    }
+  }
+  ["class"]=>
+  object(foo)#1 (2) {
+    ["bar"]=>
+    string(2) "ok"
+    ["yes"]=>
+    string(4) "done"
+  }
+}
index ca845bd171859e1c492dcd144dc572da7f574429..63e47047272d0f3870a9e3847f51144d50ba4e3a 100644 (file)
@@ -430,7 +430,7 @@ static void php_wddx_serialize_object(wddx_packet *packet, zval *obj)
        char *key;
        ulong idx;
        char tmp_buf[WDDX_BUF_LEN];
-       HashTable *objhash;
+       HashTable *objhash, *sleephash;
        TSRMLS_FETCH();
 
        MAKE_STD_ZVAL(fname);
@@ -441,7 +441,7 @@ static void php_wddx_serialize_object(wddx_packet *packet, zval *obj)
         * array of property names to be serialized.
         */
        if (call_user_function_ex(CG(function_table), &obj, fname, &retval, 0, 0, 1, NULL TSRMLS_CC) == SUCCESS) {
-               if (retval && (objhash = HASH_OF(retval))) {
+               if (retval && (sleephash = HASH_OF(retval))) {
                        PHP_CLASS_ATTRIBUTES;
                        
                        PHP_SET_CLASS_ATTRIBUTES(obj);
@@ -455,10 +455,12 @@ static void php_wddx_serialize_object(wddx_packet *packet, zval *obj)
                        php_wddx_add_chunk_static(packet, WDDX_VAR_E);
 
                        PHP_CLEANUP_CLASS_ATTRIBUTES();
+
+                       objhash = HASH_OF(obj);
                        
-                       for (zend_hash_internal_pointer_reset(objhash);
-                                zend_hash_get_current_data(objhash, (void **)&varname) == SUCCESS;
-                                zend_hash_move_forward(objhash)) {
+                       for (zend_hash_internal_pointer_reset(sleephash);
+                                zend_hash_get_current_data(sleephash, (void **)&varname) == SUCCESS;
+                                zend_hash_move_forward(sleephash)) {
                                if (Z_TYPE_PP(varname) != IS_STRING) {
                                        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "__sleep should return an array only containing the names of instance-variables to serialize.");
                                        continue;