1<?php 2 3function get_active_cp($kind = "") 4{ 5 if (version_compare(PHP_VERSION, '7.1', '<')) { 6 $s = exec("chcp"); 7 preg_match(",.*: (\d+),", $s, $m); 8 9 return $m[1]; 10 } else { 11 return sapi_windows_cp_get($kind); 12 } 13} 14 15function set_active_cp($cp, $echo = true) 16{ 17 if (version_compare(PHP_VERSION, '7.1', '<')) { 18 $ret = exec("chcp $cp"); 19 } else { 20 if (!sapi_windows_cp_set($cp)) { 21 echo "Failed to set cp $cp\n"; 22 return; 23 } 24 25 if ($echo) echo "Active code page: ", get_active_cp(), "\n"; 26 } 27} 28 29function get_basename_with_cp($path, $cp, $echo = true) 30{ 31 $old_cp = get_active_cp(); 32 set_active_cp($cp, $echo); 33 34 if ($echo) echo "getting basename of $path\n"; 35 36 $cmd = "powershell -command \"Get-Item -Path '$path' | Format-Table -HideTableHeaders Name\""; 37 $out = trim(shell_exec($cmd)); 38 39 if ($echo) var_dump($out, $out == basename($path)); 40 if ($echo) var_dump(realpath($path)); 41 42 set_active_cp($old_cp, $echo); 43 44 return $out; 45} 46 47function skip_if_wrong_cp($cp, $kind = "") 48{ 49 if (get_active_cp($kind) != $cp) { 50 die("skip this test expect codepage $cp"); 51 } 52} 53 54function skip_if_no_required_exts() 55{ 56 $exts = func_get_args(); 57 $exts[] = "iconv"; 58 59 foreach ($exts as $ext) { 60 if (!extension_loaded($ext)) { 61 die("skip $ext is not loaded"); 62 } 63 } 64} 65 66function skip_if_not_win() 67{ 68 if(substr(PHP_OS, 0, 3) != 'WIN' ) { 69 die('skip windows only test'); 70 } 71} 72 73function create_verify_file($prefix, $basename, $content = "", $cp = 65001) 74{ 75 $full = $prefix . DIRECTORY_SEPARATOR . $basename; 76 77 if (!touch($full)) { 78 echo "failed to touch create $full\n"; 79 return; 80 } 81 82 $now = get_basename_with_cp($full, $cp, false); 83 if ($now !== $basename) { 84 echo "expected '$basename', got '$now'\n"; 85 return; 86 } 87 88 if ($content) { 89 file_put_contents($full, $content); 90 } 91} 92 93function create_verify_dir($prefix, $basename, $cp = 65001) 94{ 95 $full = $prefix . DIRECTORY_SEPARATOR . $basename; 96 97 if (!mkdir($full)) { 98 echo "failed to create dir '$full'\n"; 99 return; 100 } 101 102 $now = get_basename_with_cp($full, $cp, false); 103 if ($now !== $basename) { 104 echo "expected '$basename', got '$now'\n"; 105 } 106} 107 108function remove_data($id, $dir = NULL) 109{ 110 if (!$dir) { 111 $dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . $id; 112 } 113 114 if (is_dir($dir)) { 115 $objects = scandir($dir); 116 foreach ($objects as $object) { 117 if ($object != "." && $object != "..") { 118 if (filetype($dir . DIRECTORY_SEPARATOR . $object) == "dir") 119 remove_data($id, $dir . DIRECTORY_SEPARATOR . $object); 120 else 121 unlink($dir . DIRECTORY_SEPARATOR . $object); 122 } 123 } 124 reset($objects); 125 rmdir($dir); 126 } 127} 128 129function create_data($id, $item = "", $cp = 65001, $utf8 = true) 130{ 131 if ($utf8) { 132 /* Keep this file ASCII, so zend.multibyte related stuff can be tasted as well. */ 133 include dirname(__FILE__) . DIRECTORY_SEPARATOR . "util_utf8.inc"; 134 return create_data_from_utf8($id, $item, $cp); 135 } else { 136 137 $prefix = dirname(__FILE__) . DIRECTORY_SEPARATOR . $id; 138 139 if (!is_dir($prefix)) { 140 mkdir($prefix); 141 } 142 143 if (0 === strpos($id, "dir")) { 144 create_verify_dir($prefix, $item, $cp); 145 } else if (0 === strpos($id, "file")) { 146 /* a bit unhandy, but content can be put from outside, if needed */ 147 create_verify_file($prefix, $item, "dummy content", $cp); 148 } else { 149 echo "Item has either to start with \"dir\" or \"file\""; 150 } 151 } 152 153 return $prefix; 154} 155