12
12
namespace Symfony \Component \VarDumper \Tests \Caster ;
13
13
14
14
use PHPUnit \Framework \TestCase ;
15
+ use Symfony \Component \VarDumper \Caster \FFICaster ;
15
16
use Symfony \Component \VarDumper \Test \VarDumperTestTrait ;
16
17
17
18
/**
@@ -23,6 +24,11 @@ class FFICasterTest extends TestCase
23
24
{
24
25
use VarDumperTestTrait;
25
26
27
+ /**
28
+ * @see FFICaster::MAX_STRING_LENGTH
29
+ */
30
+ private const MAX_STRING_LENGTH = 255 ;
31
+
26
32
protected function setUp (): void
27
33
{
28
34
if (\in_array (\PHP_SAPI , ['cli ' , 'phpdbg ' ], true ) && 'preload ' === \ini_get ('ffi.enable ' )) {
@@ -172,17 +178,24 @@ public function testCastCuttedPointerToChar()
172
178
{
173
179
$ actualMessage = str_repeat ('Hello World! ' , 30 )."\0" ;
174
180
$ actualLength = \strlen ($ actualMessage );
175
-
176
- $ expectedMessage = 'Hello World!Hello World!Hello World!Hello World! '
177
- .'Hello World!Hello World!Hello World!Hello World!Hello World!Hel '
178
- .'lo World!Hello World!Hello World!Hello World!Hello World!Hello '
179
- .'World!Hello World!Hello World!Hello World!Hello World!Hello Wor '
180
- .'ld!Hello World!Hel ' ;
181
+ $ expectedMessage = substr ($ actualMessage , 0 , self ::MAX_STRING_LENGTH );
181
182
182
183
$ string = \FFI ::cdef ()->new ('char[ ' .$ actualLength .'] ' );
183
184
$ pointer = \FFI ::addr ($ string [0 ]);
184
185
\FFI ::memcpy ($ pointer , $ actualMessage , $ actualLength );
185
186
187
+ // the max length is platform-dependent and can be less than 255,
188
+ // so we need to cut the expected message to the maximum length
189
+ // allowed by pages size of the current system
190
+ $ ffi = \FFI ::cdef (<<<C
191
+ size_t zend_get_page_size(void);
192
+ C );
193
+
194
+ $ pageSize = $ ffi ->zend_get_page_size ();
195
+ $ start = $ ffi ->cast ('uintptr_t ' , $ ffi ->cast ('char* ' , $ pointer ))->cdata ;
196
+ $ max = min (self ::MAX_STRING_LENGTH , ($ start | ($ pageSize - 1 )) - $ start );
197
+ $ expectedMessage = substr ($ expectedMessage , 0 , $ max );
198
+
186
199
$ this ->assertDumpEquals (<<<PHP
187
200
FFI\CData<char*> size 8 align 8 {
188
201
cdata: " $ expectedMessage"…
0 commit comments