5 changed files with 193 additions and 15 deletions
-
8weed/s3api/s3api_object_handlers_put.go
-
21weed/s3api/s3api_object_retention.go
-
169weed/s3api/s3api_object_retention_test.go
-
8weed/s3api/s3api_server.go
-
2weed/s3api/s3err/s3api_errors.go
@ -0,0 +1,169 @@ |
|||
package s3api |
|||
|
|||
import ( |
|||
"testing" |
|||
"time" |
|||
|
|||
"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants" |
|||
) |
|||
|
|||
func TestValidateRetention(t *testing.T) { |
|||
futureTime := time.Now().Add(24 * time.Hour) |
|||
pastTime := time.Now().Add(-24 * time.Hour) |
|||
|
|||
tests := []struct { |
|||
name string |
|||
retention *ObjectRetention |
|||
expectError bool |
|||
errorMsg string |
|||
}{ |
|||
{ |
|||
name: "Valid GOVERNANCE retention", |
|||
retention: &ObjectRetention{ |
|||
Mode: s3_constants.RetentionModeGovernance, |
|||
RetainUntilDate: &futureTime, |
|||
}, |
|||
expectError: false, |
|||
}, |
|||
{ |
|||
name: "Valid COMPLIANCE retention", |
|||
retention: &ObjectRetention{ |
|||
Mode: s3_constants.RetentionModeCompliance, |
|||
RetainUntilDate: &futureTime, |
|||
}, |
|||
expectError: false, |
|||
}, |
|||
{ |
|||
name: "Missing Mode", |
|||
retention: &ObjectRetention{ |
|||
RetainUntilDate: &futureTime, |
|||
}, |
|||
expectError: true, |
|||
errorMsg: "retention configuration must specify Mode", |
|||
}, |
|||
{ |
|||
name: "Missing RetainUntilDate", |
|||
retention: &ObjectRetention{ |
|||
Mode: s3_constants.RetentionModeGovernance, |
|||
}, |
|||
expectError: true, |
|||
errorMsg: "retention configuration must specify RetainUntilDate", |
|||
}, |
|||
{ |
|||
name: "Invalid Mode", |
|||
retention: &ObjectRetention{ |
|||
Mode: "INVALID_MODE", |
|||
RetainUntilDate: &futureTime, |
|||
}, |
|||
expectError: true, |
|||
errorMsg: "invalid retention mode: INVALID_MODE", |
|||
}, |
|||
{ |
|||
name: "Past RetainUntilDate", |
|||
retention: &ObjectRetention{ |
|||
Mode: s3_constants.RetentionModeGovernance, |
|||
RetainUntilDate: &pastTime, |
|||
}, |
|||
expectError: true, |
|||
errorMsg: "retain until date must be in the future", |
|||
}, |
|||
{ |
|||
name: "Empty retention", |
|||
retention: &ObjectRetention{}, |
|||
expectError: true, |
|||
errorMsg: "retention configuration must specify Mode", |
|||
}, |
|||
} |
|||
|
|||
for _, tt := range tests { |
|||
t.Run(tt.name, func(t *testing.T) { |
|||
err := validateRetention(tt.retention) |
|||
|
|||
if tt.expectError { |
|||
if err == nil { |
|||
t.Errorf("Expected error but got none") |
|||
} else if err.Error() != tt.errorMsg { |
|||
t.Errorf("Expected error message '%s', got '%s'", tt.errorMsg, err.Error()) |
|||
} |
|||
} else { |
|||
if err != nil { |
|||
t.Errorf("Expected no error but got: %v", err) |
|||
} |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
|
|||
func TestValidateLegalHold(t *testing.T) { |
|||
tests := []struct { |
|||
name string |
|||
legalHold *ObjectLegalHold |
|||
expectError bool |
|||
errorMsg string |
|||
}{ |
|||
{ |
|||
name: "Valid ON status", |
|||
legalHold: &ObjectLegalHold{ |
|||
Status: s3_constants.LegalHoldOn, |
|||
}, |
|||
expectError: false, |
|||
}, |
|||
{ |
|||
name: "Valid OFF status", |
|||
legalHold: &ObjectLegalHold{ |
|||
Status: s3_constants.LegalHoldOff, |
|||
}, |
|||
expectError: false, |
|||
}, |
|||
{ |
|||
name: "Invalid status", |
|||
legalHold: &ObjectLegalHold{ |
|||
Status: "INVALID_STATUS", |
|||
}, |
|||
expectError: true, |
|||
errorMsg: "invalid legal hold status: INVALID_STATUS", |
|||
}, |
|||
{ |
|||
name: "Empty status", |
|||
legalHold: &ObjectLegalHold{ |
|||
Status: "", |
|||
}, |
|||
expectError: true, |
|||
errorMsg: "invalid legal hold status: ", |
|||
}, |
|||
{ |
|||
name: "Lowercase on", |
|||
legalHold: &ObjectLegalHold{ |
|||
Status: "on", |
|||
}, |
|||
expectError: true, |
|||
errorMsg: "invalid legal hold status: on", |
|||
}, |
|||
{ |
|||
name: "Lowercase off", |
|||
legalHold: &ObjectLegalHold{ |
|||
Status: "off", |
|||
}, |
|||
expectError: true, |
|||
errorMsg: "invalid legal hold status: off", |
|||
}, |
|||
} |
|||
|
|||
for _, tt := range tests { |
|||
t.Run(tt.name, func(t *testing.T) { |
|||
err := validateLegalHold(tt.legalHold) |
|||
|
|||
if tt.expectError { |
|||
if err == nil { |
|||
t.Errorf("Expected error but got none") |
|||
} else if err.Error() != tt.errorMsg { |
|||
t.Errorf("Expected error message '%s', got '%s'", tt.errorMsg, err.Error()) |
|||
} |
|||
} else { |
|||
if err != nil { |
|||
t.Errorf("Expected no error but got: %v", err) |
|||
} |
|||
} |
|||
}) |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue