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