You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							147 lines
						
					
					
						
							4.4 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							147 lines
						
					
					
						
							4.4 KiB
						
					
					
				| package test | |
| 
 | |
| import ( | |
| 	"context" | |
| 	"testing" | |
| 
 | |
| 	"github.com/seaweedfs/seaweedfs/weed/credential" | |
| 	"github.com/seaweedfs/seaweedfs/weed/credential/memory" | |
| 	"github.com/seaweedfs/seaweedfs/weed/s3api/policy_engine" | |
| 
 | |
| 	// Import all store implementations to register them | |
| 	_ "github.com/seaweedfs/seaweedfs/weed/credential/filer_etc" | |
| 	_ "github.com/seaweedfs/seaweedfs/weed/credential/memory" | |
| 	_ "github.com/seaweedfs/seaweedfs/weed/credential/postgres" | |
| ) | |
| 
 | |
| // TestPolicyManagement tests policy management across all credential stores | |
| func TestPolicyManagement(t *testing.T) { | |
| 	ctx := context.Background() | |
| 
 | |
| 	// Test with memory store (easiest to test) | |
| 	credentialManager, err := credential.NewCredentialManager(credential.StoreTypeMemory, nil, "") | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to create credential manager: %v", err) | |
| 	} | |
| 
 | |
| 	// Test policy operations | |
| 	testPolicyOperations(t, ctx, credentialManager) | |
| } | |
| 
 | |
| func testPolicyOperations(t *testing.T, ctx context.Context, credentialManager *credential.CredentialManager) { | |
| 	store := credentialManager.GetStore() | |
| 
 | |
| 	// Cast to memory store to access policy methods | |
| 	memoryStore, ok := store.(*memory.MemoryStore) | |
| 	if !ok { | |
| 		t.Skip("Store is not a memory store") | |
| 	} | |
| 
 | |
| 	// Test GetPolicies (should be empty initially) | |
| 	policies, err := memoryStore.GetPolicies(ctx) | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to get policies: %v", err) | |
| 	} | |
| 	if len(policies) != 0 { | |
| 		t.Errorf("Expected 0 policies, got %d", len(policies)) | |
| 	} | |
| 
 | |
| 	// Test CreatePolicy | |
| 	testPolicy := policy_engine.PolicyDocument{ | |
| 		Version: "2012-10-17", | |
| 		Statement: []policy_engine.PolicyStatement{ | |
| 			{ | |
| 				Effect:   policy_engine.PolicyEffectAllow, | |
| 				Action:   policy_engine.NewStringOrStringSlice("s3:GetObject"), | |
| 				Resource: policy_engine.NewStringOrStringSlice("arn:aws:s3:::test-bucket/*"), | |
| 			}, | |
| 		}, | |
| 	} | |
| 
 | |
| 	err = memoryStore.CreatePolicy(ctx, "test-policy", testPolicy) | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to create policy: %v", err) | |
| 	} | |
| 
 | |
| 	// Test GetPolicies (should have 1 policy now) | |
| 	policies, err = memoryStore.GetPolicies(ctx) | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to get policies: %v", err) | |
| 	} | |
| 	if len(policies) != 1 { | |
| 		t.Errorf("Expected 1 policy, got %d", len(policies)) | |
| 	} | |
| 
 | |
| 	// Verify policy content | |
| 	policy, exists := policies["test-policy"] | |
| 	if !exists { | |
| 		t.Error("test-policy not found") | |
| 	} | |
| 	if policy.Version != "2012-10-17" { | |
| 		t.Errorf("Expected policy version '2012-10-17', got '%s'", policy.Version) | |
| 	} | |
| 	if len(policy.Statement) != 1 { | |
| 		t.Errorf("Expected 1 statement, got %d", len(policy.Statement)) | |
| 	} | |
| 
 | |
| 	// Test UpdatePolicy | |
| 	updatedPolicy := policy_engine.PolicyDocument{ | |
| 		Version: "2012-10-17", | |
| 		Statement: []policy_engine.PolicyStatement{ | |
| 			{ | |
| 				Effect:   policy_engine.PolicyEffectAllow, | |
| 				Action:   policy_engine.NewStringOrStringSlice("s3:GetObject", "s3:PutObject"), | |
| 				Resource: policy_engine.NewStringOrStringSlice("arn:aws:s3:::test-bucket/*"), | |
| 			}, | |
| 		}, | |
| 	} | |
| 
 | |
| 	err = memoryStore.UpdatePolicy(ctx, "test-policy", updatedPolicy) | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to update policy: %v", err) | |
| 	} | |
| 
 | |
| 	// Verify the update | |
| 	policies, err = memoryStore.GetPolicies(ctx) | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to get policies after update: %v", err) | |
| 	} | |
| 
 | |
| 	updatedPolicyResult, exists := policies["test-policy"] | |
| 	if !exists { | |
| 		t.Error("test-policy not found after update") | |
| 	} | |
| 	if len(updatedPolicyResult.Statement) != 1 { | |
| 		t.Errorf("Expected 1 statement after update, got %d", len(updatedPolicyResult.Statement)) | |
| 	} | |
| 	if len(updatedPolicyResult.Statement[0].Action.Strings()) != 2 { | |
| 		t.Errorf("Expected 2 actions after update, got %d", len(updatedPolicyResult.Statement[0].Action.Strings())) | |
| 	} | |
| 
 | |
| 	// Test DeletePolicy | |
| 	err = memoryStore.DeletePolicy(ctx, "test-policy") | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to delete policy: %v", err) | |
| 	} | |
| 
 | |
| 	// Verify deletion | |
| 	policies, err = memoryStore.GetPolicies(ctx) | |
| 	if err != nil { | |
| 		t.Fatalf("Failed to get policies after deletion: %v", err) | |
| 	} | |
| 	if len(policies) != 0 { | |
| 		t.Errorf("Expected 0 policies after deletion, got %d", len(policies)) | |
| 	} | |
| } | |
| 
 | |
| // TestPolicyManagementWithFilerEtc tests policy management with filer_etc store | |
| func TestPolicyManagementWithFilerEtc(t *testing.T) { | |
| 	// Skip this test if we can't connect to a filer | |
| 	t.Skip("Filer connection required for filer_etc store testing") | |
| } | |
| 
 | |
| // TestPolicyManagementWithPostgres tests policy management with postgres store | |
| func TestPolicyManagementWithPostgres(t *testing.T) { | |
| 	// Skip this test if we can't connect to PostgreSQL | |
| 	t.Skip("PostgreSQL connection required for postgres store testing") | |
| }
 |