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.
		
		
		
		
		
			
		
			
				
					
					
						
							149 lines
						
					
					
						
							4.1 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							149 lines
						
					
					
						
							4.1 KiB
						
					
					
				
								package s3api
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"testing"
							 | 
						|
									"time"
							 | 
						|
								
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
							 | 
						|
									"github.com/stretchr/testify/assert"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								// mockAccountManager implements AccountManager for testing
							 | 
						|
								type mockAccountManager struct {
							 | 
						|
									accounts map[string]string
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (m *mockAccountManager) GetAccountNameById(id string) string {
							 | 
						|
									if name, exists := m.accounts[id]; exists {
							 | 
						|
										return name
							 | 
						|
									}
							 | 
						|
									return ""
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (m *mockAccountManager) GetAccountIdByEmail(email string) string {
							 | 
						|
									return ""
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func TestNewListEntryOwnerDisplayName(t *testing.T) {
							 | 
						|
									// Create mock IAM with test accounts
							 | 
						|
									iam := &mockAccountManager{
							 | 
						|
										accounts: map[string]string{
							 | 
						|
											"testid":    "M. Tester",
							 | 
						|
											"userid123": "John Doe",
							 | 
						|
										},
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Create test entry with owner metadata
							 | 
						|
									entry := &filer_pb.Entry{
							 | 
						|
										Name: "test-object",
							 | 
						|
										Attributes: &filer_pb.FuseAttributes{
							 | 
						|
											Mtime:    time.Now().Unix(),
							 | 
						|
											FileSize: 1024,
							 | 
						|
										},
							 | 
						|
										Extended: map[string][]byte{
							 | 
						|
											s3_constants.ExtAmzOwnerKey: []byte("testid"),
							 | 
						|
										},
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									// Test that display name is correctly looked up from IAM
							 | 
						|
									listEntry := newListEntry(entry, "", "dir", "test-object", "/buckets/test/", true, false, false, iam)
							 | 
						|
								
							 | 
						|
									assert.NotNil(t, listEntry.Owner, "Owner should be set when fetchOwner is true")
							 | 
						|
									assert.Equal(t, "testid", listEntry.Owner.ID, "Owner ID should match stored owner")
							 | 
						|
									assert.Equal(t, "M. Tester", listEntry.Owner.DisplayName, "Display name should be looked up from IAM")
							 | 
						|
								
							 | 
						|
									// Test with owner that doesn't exist in IAM (should fallback to ID)
							 | 
						|
									entry.Extended[s3_constants.ExtAmzOwnerKey] = []byte("unknown-user")
							 | 
						|
									listEntry = newListEntry(entry, "", "dir", "test-object", "/buckets/test/", true, false, false, iam)
							 | 
						|
								
							 | 
						|
									assert.Equal(t, "unknown-user", listEntry.Owner.ID, "Owner ID should match stored owner")
							 | 
						|
									assert.Equal(t, "unknown-user", listEntry.Owner.DisplayName, "Display name should fallback to ID when not found in IAM")
							 | 
						|
								
							 | 
						|
									// Test with no owner metadata (should use anonymous)
							 | 
						|
									entry.Extended = make(map[string][]byte)
							 | 
						|
									listEntry = newListEntry(entry, "", "dir", "test-object", "/buckets/test/", true, false, false, iam)
							 | 
						|
								
							 | 
						|
									assert.Equal(t, s3_constants.AccountAnonymousId, listEntry.Owner.ID, "Should use anonymous ID when no owner metadata")
							 | 
						|
									assert.Equal(t, "anonymous", listEntry.Owner.DisplayName, "Should use anonymous display name when no owner metadata")
							 | 
						|
								
							 | 
						|
									// Test with fetchOwner false (should not set owner)
							 | 
						|
									listEntry = newListEntry(entry, "", "dir", "test-object", "/buckets/test/", false, false, false, iam)
							 | 
						|
								
							 | 
						|
									assert.Nil(t, listEntry.Owner, "Owner should not be set when fetchOwner is false")
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func TestRemoveDuplicateSlashes(t *testing.T) {
							 | 
						|
									tests := []struct {
							 | 
						|
										name           string
							 | 
						|
										path           string
							 | 
						|
										expectedResult string
							 | 
						|
									}{
							 | 
						|
										{
							 | 
						|
											name:           "empty",
							 | 
						|
											path:           "",
							 | 
						|
											expectedResult: "",
							 | 
						|
										},
							 | 
						|
										{
							 | 
						|
											name:           "slash",
							 | 
						|
											path:           "/",
							 | 
						|
											expectedResult: "/",
							 | 
						|
										},
							 | 
						|
										{
							 | 
						|
											name:           "object",
							 | 
						|
											path:           "object",
							 | 
						|
											expectedResult: "object",
							 | 
						|
										},
							 | 
						|
										{
							 | 
						|
											name:           "correct path",
							 | 
						|
											path:           "/path/to/object",
							 | 
						|
											expectedResult: "/path/to/object",
							 | 
						|
										},
							 | 
						|
										{
							 | 
						|
											name:           "path with duplicates",
							 | 
						|
											path:           "///path//to/object//",
							 | 
						|
											expectedResult: "/path/to/object/",
							 | 
						|
										},
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
									for _, tst := range tests {
							 | 
						|
										t.Run(tst.name, func(t *testing.T) {
							 | 
						|
											obj := removeDuplicateSlashes(tst.path)
							 | 
						|
											assert.Equal(t, tst.expectedResult, obj)
							 | 
						|
										})
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func TestS3ApiServer_toFilerUrl(t *testing.T) {
							 | 
						|
									tests := []struct {
							 | 
						|
										name string
							 | 
						|
										args string
							 | 
						|
										want string
							 | 
						|
									}{
							 | 
						|
										{
							 | 
						|
											"simple",
							 | 
						|
											"/uploads/eaf10b3b-3b3a-4dcd-92a7-edf2a512276e/67b8b9bf-7cca-4cb6-9b34-22fcb4d6e27d/Bildschirmfoto 2022-09-19 um 21.38.37.png",
							 | 
						|
											"/uploads/eaf10b3b-3b3a-4dcd-92a7-edf2a512276e/67b8b9bf-7cca-4cb6-9b34-22fcb4d6e27d/Bildschirmfoto%202022-09-19%20um%2021.38.37.png",
							 | 
						|
										},
							 | 
						|
										{
							 | 
						|
											"double prefix",
							 | 
						|
											"//uploads/t.png",
							 | 
						|
											"/uploads/t.png",
							 | 
						|
										},
							 | 
						|
										{
							 | 
						|
											"triple prefix",
							 | 
						|
											"///uploads/t.png",
							 | 
						|
											"/uploads/t.png",
							 | 
						|
										},
							 | 
						|
										{
							 | 
						|
											"empty prefix",
							 | 
						|
											"uploads/t.png",
							 | 
						|
											"/uploads/t.png",
							 | 
						|
										},
							 | 
						|
									}
							 | 
						|
									for _, tt := range tests {
							 | 
						|
										t.Run(tt.name, func(t *testing.T) {
							 | 
						|
											assert.Equalf(t, tt.want, urlEscapeObject(tt.args), "clean %v", tt.args)
							 | 
						|
										})
							 | 
						|
									}
							 | 
						|
								}
							 |