Skip to content

Commit

Permalink
Change signature for SerializerInterface::serialize
Browse files Browse the repository at this point in the history
Serializer test: Mock object instead of dummy class
  • Loading branch information
nokitakaze committed May 4, 2017
1 parent d56a1b6 commit e736e40
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 39 deletions.
4 changes: 2 additions & 2 deletions lib/Raven/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -1064,7 +1064,7 @@ public function sanitize(&$data)
$data['request'] = $this->serializer->serialize($data['request']);
}
if (!empty($data['user'])) {
$data['user'] = $this->serializer->serialize($data['user'], 3);
$data['user'] = $this->serializer->serialize($data['user'], ['max_depth' => 3]);
}
if (!empty($data['extra'])) {
$data['extra'] = $this->serializer->serialize($data['extra']);
Expand All @@ -1075,7 +1075,7 @@ public function sanitize(&$data)
}
}
if (!empty($data['contexts'])) {
$data['contexts'] = $this->serializer->serialize($data['contexts'], 5);
$data['contexts'] = $this->serializer->serialize($data['contexts'], ['max_depth' => 5]);
}
}

Expand Down
33 changes: 30 additions & 3 deletions lib/Raven/Serializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,33 @@ public function __construct($mb_detect_order = null)
}
}

/**
* Serialize an object (recursively) into something safe for data
* sanitization and encoding.
*
* @param mixed $value
* @param array $context
* @return string|bool|double|int|null|object|array
*/
public function serialize($value, array $context = [])
{
$full_context = $this->get_full_context($context);
return $this->serialize_inner($value, $full_context['max_depth'], 0);
}

/**
* @param array $context
* @return array
*/
protected function get_full_context(array $context)
{
if (!array_key_exists('max_depth', $context)) {
$context['max_depth'] = 3;
}

return $context;
}

/**
* Serialize an object (recursively) into something safe for data
* sanitization and encoding.
Expand All @@ -71,13 +98,13 @@ public function __construct($mb_detect_order = null)
* @param int $_depth
* @return string|bool|double|int|null|object|array
*/
public function serialize($value, $max_depth = 3, $_depth = 0)
protected function serialize_inner($value, $max_depth, $_depth)
{
if ($_depth < $max_depth) {
if (is_array($value)) {
$new = [];
foreach ($value as $k => $v) {
$new[$this->serializeValue($k)] = $this->serialize($v, $max_depth, $_depth + 1);
$new[$this->serializeValue($k)] = $this->serialize_inner($v, $max_depth, $_depth + 1);
}

return $new;
Expand Down Expand Up @@ -111,7 +138,7 @@ public function serializeObject($object, $max_depth = 3, $_depth = 0, $hashes =
if (is_object($value)) {
$new_value = $this->serializeObject($value, $max_depth, $_depth + 1, $hashes);
} else {
$new_value = $this->serialize($value, $max_depth, $_depth + 1);
$new_value = $this->serialize($value, ['max_depth' => $max_depth - $_depth - 1]);
}
$return[$key] = $new_value;
}
Expand Down
5 changes: 2 additions & 3 deletions lib/Raven/SerializerInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,8 @@ interface SerializerInterface
* sanitization and encoding.
*
* @param mixed $value
* @param int $max_depth
* @param int $_depth
* @param array $context
* @return string|bool|double|int|null|object|array
*/
public function serialize($value, $max_depth = 3, $_depth = 0);
public function serialize($value, array $context = []);
}
30 changes: 8 additions & 22 deletions tests/ClientTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -207,24 +207,6 @@ public function join($timeout = null)
}
}

class Dummy_Serializer implements \Raven\SerializerInterface
{
public static $default_value = 'foobar';

public function serialize($value, $max_depth = 3, $_depth = 0)
{
if (is_array($value)) {
foreach ($value as $key => &$real_value) {
$real_value = $this->serialize($real_value);
}

return $value;
} else {
return self::$default_value;
}
}
}

class Raven_Tests_ClientTest extends \PHPUnit_Framework_TestCase
{
public function tearDown()
Expand Down Expand Up @@ -2506,7 +2488,13 @@ public function dataOurSerializer()
*/
public function testOurSerializer($after_creation)
{
$serializer = new Dummy_Serializer();
$serializer = $this->getMockBuilder('\\Raven\\SerializerInterface')
->setMethods(['serialize'])->getMock();
$serializer->expects($this->atLeastOnce())->method('serialize');

/**
* @var \Raven\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject $serializer
*/
if ($after_creation) {
$client = new Dummy_Raven_Client();
$client->setSerializer($serializer);
Expand All @@ -2528,9 +2516,7 @@ public function testOurSerializer($after_creation)
],
]
);
$events = $client->getSentEvents();
$event = array_pop($events);
$this->assertEquals(Dummy_Serializer::$default_value, $event['extra']['foo']);
$serializer->__phpunit_verify();
}
}
}
21 changes: 12 additions & 9 deletions tests/SerializerAbstractTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -186,19 +186,19 @@ public function testRecursionMaxDepth($serialize_all_objects)
}
$input = [];
$input[] = &$input;
$result = $serializer->serialize($input, 3);
$result = $serializer->serialize($input, ['max_depth' => 3]);
$this->assertEquals([[['Array of length 1']]], $result);

$result = $serializer->serialize([], 3);
$result = $serializer->serialize([], ['max_depth' => 3]);
$this->assertEquals([], $result);

$result = $serializer->serialize([[]], 3);
$result = $serializer->serialize([[]], ['max_depth' => 3]);
$this->assertEquals([[]], $result);

$result = $serializer->serialize([[[]]], 3);
$result = $serializer->serialize([[[]]], ['max_depth' => 3]);
$this->assertEquals([[[]]], $result);

$result = $serializer->serialize([[[[]]]], 3);
$result = $serializer->serialize([[[[]]]], ['max_depth' => 3]);
$this->assertEquals([[['Array of length 0']]], $result);
}

Expand Down Expand Up @@ -297,7 +297,7 @@ public function testRecursionInObjects($object, $result_serialize, $result_seria
$serializer = new $class_name();
$serializer->setAllObjectSerialize(true);

$result1 = $serializer->serialize($object, 3);
$result1 = $serializer->serialize($object, ['max_depth' => 3]);
$result2 = $serializer->serializeObject($object, 3);
$this->assertEquals($result_serialize, $result1);
$this->assertEquals($result_serialize_object, $result2);
Expand All @@ -310,14 +310,17 @@ public function testRecursionMaxDepthForObject()
$serializer = new $class_name();
$serializer->setAllObjectSerialize(true);

$result = $serializer->serialize((object)['key' => (object)['key' => 12345]], 3);
$result = $serializer->serialize((object)['key' => (object)['key' => 12345]], ['max_depth' => 3]);
$this->assertEquals(['key' => ['key' => 12345]], $result);

$result = $serializer->serialize((object)['key' => (object)['key' => (object)['key' => 12345]]], 3);
$result = $serializer->serialize(
(object)['key' => (object)['key' => (object)['key' => 12345]]],
['max_depth' => 3]
);
$this->assertEquals(['key' => ['key' => ['key' => 12345]]], $result);

$result = $serializer->serialize(
(object)['key' => (object)['key' => (object)['key' => (object)['key' => 12345]]]], 3
(object)['key' => (object)['key' => (object)['key' => (object)['key' => 12345]]]], ['max_depth' => 3]
);
$this->assertEquals(['key' => ['key' => ['key' => 'Object stdClass']]], $result);
}
Expand Down

0 comments on commit e736e40

Please sign in to comment.