From 545eefbf83c37c7c3dff0a1bdde69dfd17da3e23 Mon Sep 17 00:00:00 2001 From: Mihir Vala Date: Mon, 7 Jul 2025 16:28:52 +0530 Subject: [PATCH 1/5] chore(modelarmor): added floorsettings tests --- modelarmor/test/modelarmorTest.php | 164 ++++++++++++++++++++++++++++- 1 file changed, 162 insertions(+), 2 deletions(-) diff --git a/modelarmor/test/modelarmorTest.php b/modelarmor/test/modelarmorTest.php index 8f071fbed..919d7acad 100644 --- a/modelarmor/test/modelarmorTest.php +++ b/modelarmor/test/modelarmorTest.php @@ -50,6 +50,8 @@ use Google\Cloud\ModelArmor\V1\RaiFilterType; use Google\Cloud\ModelArmor\V1\RaiFilterSettings; use Google\Cloud\ModelArmor\V1\RaiFilterSettings\RaiFilter; +use Google\Cloud\ModelArmor\V1\FloorSetting; +use Google\Cloud\ModelArmor\V1\UpdateFloorSettingRequest; class modelarmorTest extends TestCase { @@ -76,6 +78,8 @@ class modelarmorTest extends TestCase protected static $testRaiTemplateId; protected static $testMaliciousTemplateId; protected static $testPIandJailbreakTemplateId; + protected static $organizationId; + protected static $folderId; public static function setUpBeforeClass(): void { @@ -96,7 +100,9 @@ public static function setUpBeforeClass(): void self::$testSanitizeModelResponseUserPromptId = self::getTemplateId('php-sanitize-model-response-user-prompt-'); self::$testRaiTemplateId = self::getTemplateId('php-rai-template-'); self::$testMaliciousTemplateId = self::getTemplateId('php-malicious-template-'); - self::$testPIandJailbreakTemplateId = self::getTemplateId('php-pi-and-jailbreak-template-'); + self::$testPIandJailbreakTemplateId = self::getTemplateId('php-template-with-pijailbreak-'); + self::$organizationId = getenv('MA_ORG_ID'); + self::$folderId = getenv('MA_FOLDER_ID'); self::createTemplateWithMaliciousURI(); self::createTemplateWithPIJailbreakFilter(); self::createTemplateWithRAI(); @@ -122,6 +128,18 @@ public static function tearDownAfterClass(): void self::deleteTemplate(self::$projectId, self::$locationId, self::$testMaliciousTemplateId); self::deleteTemplate(self::$projectId, self::$locationId, self::$testPIandJailbreakTemplateId); self::deleteDlpTemplates(self::$inspectTemplateName, self::$deidentifyTemplateName, self::$locationId); + + // Reset floor settings after tests + if (self::$projectId) { + self::resetProjectFloorSettings(); + } + if (self::$folderId) { + self::resetFolderFloorSettings(); + } + if (self::$organizationId) { + self::resetOrganizationFloorSettings(); + } + self::$client->close(); } @@ -143,6 +161,90 @@ public static function getTemplateId(string $testId): string return uniqid($testId); } + /** + * Reset project floor settings to default values + */ + protected static function resetProjectFloorSettings(): void + { + try { + $client = new ModelArmorClient(); + $floorSettingsName = sprintf('projects/%s/locations/global/floorSetting', self::$projectId); + + // Create an empty filter config + $filterConfig = new FilterConfig(); + + // Create floor setting with enforcement disabled + $floorSetting = (new FloorSetting()) + ->setName($floorSettingsName) + ->setFilterConfig($filterConfig) + ->setEnableFloorSettingEnforcement(false); + + $updateRequest = (new UpdateFloorSettingRequest())->setFloorSetting($floorSetting); + $response = $client->updateFloorSetting($updateRequest); + + echo "Floor settings reset for project " . self::$projectId . "\n"; + } catch (\Exception $e) { + // Log but don't fail teardown if reset fails + echo "Warning: Failed to reset project floor settings: " . $e->getMessage() . "\n"; + } + } + + /** + * Reset folder floor settings to default values + */ + protected static function resetFolderFloorSettings(): void + { + try { + $client = new ModelArmorClient(); + $floorSettingsName = sprintf('folders/%s/locations/global/floorSetting', self::$folderId); + + // Create an empty filter config + $filterConfig = new FilterConfig(); + + // Create floor setting with enforcement disabled + $floorSetting = (new FloorSetting()) + ->setName($floorSettingsName) + ->setFilterConfig($filterConfig) + ->setEnableFloorSettingEnforcement(false); + + $updateRequest = (new UpdateFloorSettingRequest())->setFloorSetting($floorSetting); + $response = $client->updateFloorSetting($updateRequest); + + echo "Floor settings reset for folder " . self::$folderId . "\n"; + } catch (\Exception $e) { + // Log but don't fail teardown if reset fails + echo "Warning: Failed to reset folder floor settings: " . $e->getMessage() . "\n"; + } + } + + /** + * Reset organization floor settings to default values + */ + protected static function resetOrganizationFloorSettings(): void + { + try { + $client = new ModelArmorClient(); + $floorSettingsName = sprintf('organizations/%s/locations/global/floorSetting', self::$organizationId); + + // Create an empty filter config + $filterConfig = new FilterConfig(); + + // Create floor setting with enforcement disabled + $floorSetting = (new FloorSetting()) + ->setName($floorSettingsName) + ->setFilterConfig($filterConfig) + ->setEnableFloorSettingEnforcement(false); + + $updateRequest = (new UpdateFloorSettingRequest())->setFloorSetting($floorSetting); + $response = $client->updateFloorSetting($updateRequest); + + echo "Floor settings reset for organization " . self::$organizationId . "\n"; + } catch (\Exception $e) { + // Log but don't fail teardown if reset fails + echo "Warning: Failed to reset organization floor settings: " . $e->getMessage() . "\n"; + } + } + public function testCreateTemplate() { $output = $this->runFunctionSnippet('create_template', [ @@ -696,5 +798,63 @@ protected static function createTemplate($templateId, $template) } } - # TODO: Add tests for floor settings once API issues are resolved. + public function testGetFolderFloorSettings() + { + $output = $this->runSnippet('get_folder_floor_settings', [ + self::$folderId, + ]); + + $expectedResponseString = 'Floor settings retrieved successfully:'; + $this->assertStringContainsString($expectedResponseString, $output); + } + + public function testGetProjectFloorSettings() + { + $output = $this->runSnippet('get_project_floor_settings', [ + self::$projectId, + ]); + + $expectedResponseString = 'Floor settings retrieved successfully:'; + $this->assertStringContainsString($expectedResponseString, $output); + } + + public function testGetOrganizationFloorSettings() + { + $output = $this->runSnippet('get_organization_floor_settings', [ + self::$organizationId, + ]); + + $expectedResponseString = 'Floor settings retrieved successfully:'; + $this->assertStringContainsString($expectedResponseString, $output); + } + + public function testUpdateFolderFloorSettings() + { + $output = $this->runSnippet('update_folder_floor_settings', [ + self::$folderId, + ]); + + $expectedResponseString = 'Floor settings retrieved successfully:'; + $this->assertStringContainsString($expectedResponseString, $output); + } + + public function testUpdateProjectFloorSettings() + { + $output = $this->runSnippet('update_project_floor_settings', [ + self::$projectId, + ]); + + $expectedResponseString = 'Floor settings retrieved successfully:'; + $this->assertStringContainsString($expectedResponseString, $output); + } + + public function testUpdateOrganizationFloorSettings() + { + $output = $this->runSnippet('update_organization_floor_settings', [ + self::$organizationId, + ]); + + $expectedResponseString = 'Floor settings retrieved successfully:'; + $this->assertStringContainsString($expectedResponseString, $output); + } } From 643e577be2060afcdcd339656672cd15b190648a Mon Sep 17 00:00:00 2001 From: Mihir Vala Date: Mon, 7 Jul 2025 16:49:39 +0530 Subject: [PATCH 2/5] fix(tests): updated assertions --- modelarmor/test/modelarmorTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modelarmor/test/modelarmorTest.php b/modelarmor/test/modelarmorTest.php index 919d7acad..2da275026 100644 --- a/modelarmor/test/modelarmorTest.php +++ b/modelarmor/test/modelarmorTest.php @@ -834,7 +834,7 @@ public function testUpdateFolderFloorSettings() self::$folderId, ]); - $expectedResponseString = 'Floor settings retrieved successfully:'; + $expectedResponseString = 'Floor setting updated'; $this->assertStringContainsString($expectedResponseString, $output); } @@ -844,7 +844,7 @@ public function testUpdateProjectFloorSettings() self::$projectId, ]); - $expectedResponseString = 'Floor settings retrieved successfully:'; + $expectedResponseString = 'Floor setting updated'; $this->assertStringContainsString($expectedResponseString, $output); } @@ -854,7 +854,7 @@ public function testUpdateOrganizationFloorSettings() self::$organizationId, ]); - $expectedResponseString = 'Floor settings retrieved successfully:'; + $expectedResponseString = 'Floor setting updated'; $this->assertStringContainsString($expectedResponseString, $output); } } From 5cce9d29964b366b17ae0f6ac29638ac506ba565 Mon Sep 17 00:00:00 2001 From: Mihir Vala Date: Mon, 7 Jul 2025 18:14:45 +0530 Subject: [PATCH 3/5] chore(tests): fixed linting/styling --- modelarmor/test/modelarmorTest.php | 40 +++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/modelarmor/test/modelarmorTest.php b/modelarmor/test/modelarmorTest.php index 2da275026..836ff0bac 100644 --- a/modelarmor/test/modelarmorTest.php +++ b/modelarmor/test/modelarmorTest.php @@ -128,7 +128,7 @@ public static function tearDownAfterClass(): void self::deleteTemplate(self::$projectId, self::$locationId, self::$testMaliciousTemplateId); self::deleteTemplate(self::$projectId, self::$locationId, self::$testPIandJailbreakTemplateId); self::deleteDlpTemplates(self::$inspectTemplateName, self::$deidentifyTemplateName, self::$locationId); - + // Reset floor settings after tests if (self::$projectId) { self::resetProjectFloorSettings(); @@ -139,7 +139,7 @@ public static function tearDownAfterClass(): void if (self::$organizationId) { self::resetOrganizationFloorSettings(); } - + self::$client->close(); } @@ -169,23 +169,23 @@ protected static function resetProjectFloorSettings(): void try { $client = new ModelArmorClient(); $floorSettingsName = sprintf('projects/%s/locations/global/floorSetting', self::$projectId); - + // Create an empty filter config $filterConfig = new FilterConfig(); - + // Create floor setting with enforcement disabled $floorSetting = (new FloorSetting()) ->setName($floorSettingsName) ->setFilterConfig($filterConfig) ->setEnableFloorSettingEnforcement(false); - + $updateRequest = (new UpdateFloorSettingRequest())->setFloorSetting($floorSetting); $response = $client->updateFloorSetting($updateRequest); - - echo "Floor settings reset for project " . self::$projectId . "\n"; + + echo 'Floor settings reset for project ' . self::$projectId . "\n"; } catch (\Exception $e) { // Log but don't fail teardown if reset fails - echo "Warning: Failed to reset project floor settings: " . $e->getMessage() . "\n"; + echo 'Warning: Failed to reset project floor settings: ' . $e->getMessage() . "\n"; } } @@ -197,23 +197,23 @@ protected static function resetFolderFloorSettings(): void try { $client = new ModelArmorClient(); $floorSettingsName = sprintf('folders/%s/locations/global/floorSetting', self::$folderId); - + // Create an empty filter config $filterConfig = new FilterConfig(); - + // Create floor setting with enforcement disabled $floorSetting = (new FloorSetting()) ->setName($floorSettingsName) ->setFilterConfig($filterConfig) ->setEnableFloorSettingEnforcement(false); - + $updateRequest = (new UpdateFloorSettingRequest())->setFloorSetting($floorSetting); $response = $client->updateFloorSetting($updateRequest); - - echo "Floor settings reset for folder " . self::$folderId . "\n"; + + echo 'Floor settings reset for folder ' . self::$folderId . "\n"; } catch (\Exception $e) { // Log but don't fail teardown if reset fails - echo "Warning: Failed to reset folder floor settings: " . $e->getMessage() . "\n"; + echo 'Warning: Failed to reset folder floor settings: ' . $e->getMessage() . "\n"; } } @@ -225,23 +225,23 @@ protected static function resetOrganizationFloorSettings(): void try { $client = new ModelArmorClient(); $floorSettingsName = sprintf('organizations/%s/locations/global/floorSetting', self::$organizationId); - + // Create an empty filter config $filterConfig = new FilterConfig(); - + // Create floor setting with enforcement disabled $floorSetting = (new FloorSetting()) ->setName($floorSettingsName) ->setFilterConfig($filterConfig) ->setEnableFloorSettingEnforcement(false); - + $updateRequest = (new UpdateFloorSettingRequest())->setFloorSetting($floorSetting); $response = $client->updateFloorSetting($updateRequest); - - echo "Floor settings reset for organization " . self::$organizationId . "\n"; + + echo 'Floor settings reset for organization ' . self::$organizationId . "\n"; } catch (\Exception $e) { // Log but don't fail teardown if reset fails - echo "Warning: Failed to reset organization floor settings: " . $e->getMessage() . "\n"; + echo 'Warning: Failed to reset organization floor settings: ' . $e->getMessage() . "\n"; } } From 99be252cb35e7672570ee8f65b4b6875efe0f8b5 Mon Sep 17 00:00:00 2001 From: Mihir Vala Date: Tue, 8 Jul 2025 15:20:25 +0530 Subject: [PATCH 4/5] chore(tests): refactored floorsettings reset logic --- modelarmor/test/modelarmorTest.php | 80 +++++++----------------------- 1 file changed, 19 insertions(+), 61 deletions(-) diff --git a/modelarmor/test/modelarmorTest.php b/modelarmor/test/modelarmorTest.php index 836ff0bac..b3d6adc31 100644 --- a/modelarmor/test/modelarmorTest.php +++ b/modelarmor/test/modelarmorTest.php @@ -131,13 +131,13 @@ public static function tearDownAfterClass(): void // Reset floor settings after tests if (self::$projectId) { - self::resetProjectFloorSettings(); + self::resetFloorSettings('project', self::$projectId); } if (self::$folderId) { - self::resetFolderFloorSettings(); + self::resetFloorSettings('folder', self::$folderId); } if (self::$organizationId) { - self::resetOrganizationFloorSettings(); + self::resetFloorSettings('organization', self::$organizationId); } self::$client->close(); @@ -162,41 +162,25 @@ public static function getTemplateId(string $testId): string } /** - * Reset project floor settings to default values + * Resets floor settings to default values for various resource types + * + * @param string $resourceType The type of resource (project, folder, organization) + * @param string $resourceId The ID of the resource */ - protected static function resetProjectFloorSettings(): void + protected static function resetFloorSettings(string $resourceType, string $resourceId): void { try { $client = new ModelArmorClient(); - $floorSettingsName = sprintf('projects/%s/locations/global/floorSetting', self::$projectId); - // Create an empty filter config - $filterConfig = new FilterConfig(); - - // Create floor setting with enforcement disabled - $floorSetting = (new FloorSetting()) - ->setName($floorSettingsName) - ->setFilterConfig($filterConfig) - ->setEnableFloorSettingEnforcement(false); - - $updateRequest = (new UpdateFloorSettingRequest())->setFloorSetting($floorSetting); - $response = $client->updateFloorSetting($updateRequest); + // Format resource path based on resource type + $resourcePathFormat = match($resourceType) { + 'project' => 'projects/%s/locations/global/floorSetting', + 'folder' => 'folders/%s/locations/global/floorSetting', + 'organization' => 'organizations/%s/locations/global/floorSetting', + default => throw new \InvalidArgumentException("Invalid resource type: {$resourceType}"), + }; - echo 'Floor settings reset for project ' . self::$projectId . "\n"; - } catch (\Exception $e) { - // Log but don't fail teardown if reset fails - echo 'Warning: Failed to reset project floor settings: ' . $e->getMessage() . "\n"; - } - } - - /** - * Reset folder floor settings to default values - */ - protected static function resetFolderFloorSettings(): void - { - try { - $client = new ModelArmorClient(); - $floorSettingsName = sprintf('folders/%s/locations/global/floorSetting', self::$folderId); + $floorSettingsName = sprintf($resourcePathFormat, $resourceId); // Create an empty filter config $filterConfig = new FilterConfig(); @@ -210,40 +194,14 @@ protected static function resetFolderFloorSettings(): void $updateRequest = (new UpdateFloorSettingRequest())->setFloorSetting($floorSetting); $response = $client->updateFloorSetting($updateRequest); - echo 'Floor settings reset for folder ' . self::$folderId . "\n"; + echo "Floor settings reset for {$resourceType} {$resourceId}\n"; } catch (\Exception $e) { // Log but don't fail teardown if reset fails - echo 'Warning: Failed to reset folder floor settings: ' . $e->getMessage() . "\n"; + echo "Warning: Failed to reset {$resourceType} floor settings: " . $e->getMessage() . "\n"; } } - /** - * Reset organization floor settings to default values - */ - protected static function resetOrganizationFloorSettings(): void - { - try { - $client = new ModelArmorClient(); - $floorSettingsName = sprintf('organizations/%s/locations/global/floorSetting', self::$organizationId); - - // Create an empty filter config - $filterConfig = new FilterConfig(); - - // Create floor setting with enforcement disabled - $floorSetting = (new FloorSetting()) - ->setName($floorSettingsName) - ->setFilterConfig($filterConfig) - ->setEnableFloorSettingEnforcement(false); - - $updateRequest = (new UpdateFloorSettingRequest())->setFloorSetting($floorSetting); - $response = $client->updateFloorSetting($updateRequest); - - echo 'Floor settings reset for organization ' . self::$organizationId . "\n"; - } catch (\Exception $e) { - // Log but don't fail teardown if reset fails - echo 'Warning: Failed to reset organization floor settings: ' . $e->getMessage() . "\n"; - } - } + // Wrapper methods removed in favor of directly calling resetFloorSettings public function testCreateTemplate() { From 745500fb1eb7eb1cae13c9ebcf7c08986eaa657f Mon Sep 17 00:00:00 2001 From: Mihir Vala Date: Thu, 10 Jul 2025 00:19:21 +0530 Subject: [PATCH 5/5] chore(tests): addressed review comments --- modelarmor/test/modelarmorTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modelarmor/test/modelarmorTest.php b/modelarmor/test/modelarmorTest.php index b3d6adc31..943dcee14 100644 --- a/modelarmor/test/modelarmorTest.php +++ b/modelarmor/test/modelarmorTest.php @@ -101,8 +101,8 @@ public static function setUpBeforeClass(): void self::$testRaiTemplateId = self::getTemplateId('php-rai-template-'); self::$testMaliciousTemplateId = self::getTemplateId('php-malicious-template-'); self::$testPIandJailbreakTemplateId = self::getTemplateId('php-template-with-pijailbreak-'); - self::$organizationId = getenv('MA_ORG_ID'); - self::$folderId = getenv('MA_FOLDER_ID'); + self::$organizationId = self::requireEnv('MA_ORG_ID'); + self::$folderId = self::requireEnv('MA_FOLDER_ID'); self::createTemplateWithMaliciousURI(); self::createTemplateWithPIJailbreakFilter(); self::createTemplateWithRAI();