| <?php |
| |
| |
| use PHPUnit\Framework\TestCase; |
| |
| class UpdateReservedTest extends TestCase |
| { |
| public function testBashScriptIdempotency() |
| { |
| $repo_root = dirname(dirname(__DIR__)); |
| $script_path = $repo_root . '/php/update_reserved_words.sh'; |
| |
| $this->assertFileExists($script_path); |
| |
| $files_to_check = [ |
| 'src/google/protobuf/compiler/php/names.cc', |
| 'php/ext/google/protobuf/names.c', |
| 'src/google/protobuf/compiler/php/php_generator.cc', |
| 'php/tests/proto/test_reserved_message_lower.proto', |
| 'php/tests/proto/test_reserved_message_upper.proto', |
| 'php/tests/proto/test_reserved_enum_lower.proto', |
| 'php/tests/proto/test_reserved_enum_upper.proto', |
| 'php/tests/proto/test_reserved_enum_value_lower.proto', |
| 'php/tests/proto/test_reserved_enum_value_upper.proto', |
| 'php/tests/GeneratedClassTest.php', |
| ]; |
| |
| // Store original contents |
| $original_contents = []; |
| foreach ($files_to_check as $file) { |
| $path = $repo_root . '/' . $file; |
| $this->assertFileExists($path); |
| $original_contents[$file] = file_get_contents($path); |
| } |
| |
| try { |
| // Run the script (this will modify files in place) |
| $output = []; |
| $return_var = 0; |
| exec("bash " . escapeshellarg($script_path), $output, $return_var); |
| $this->assertSame(0, $return_var, "Script failed to execute: " . implode("\n", $output)); |
| |
| // Compare new contents with original |
| $changed_files = []; |
| foreach ($files_to_check as $file) { |
| $path = $repo_root . '/' . $file; |
| $new_content = file_get_contents($path); |
| if ($new_content !== $original_contents[$file]) { |
| $changed_files[] = $file; |
| } |
| } |
| |
| $msg = "The following files were modified by the script (idempotency check failed). " . |
| "Please run 'bash php/update_reserved_words.sh' to sync them: " . |
| implode(", ", $changed_files); |
| $this->assertEmpty($changed_files, $msg); |
| } finally { |
| // ALWAYS restore original contents to keep filesystem clean |
| foreach ($original_contents as $file => $content) { |
| file_put_contents($repo_root . '/' . $file, $content); |
| } |
| } |
| } |
| } |