Skip to content

Commit f717b29

Browse files
Add test cases
1 parent a8c7e42 commit f717b29

5 files changed

Lines changed: 128 additions & 6 deletions

File tree

internal/commands/scan.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,6 @@ const (
129129
sbomScanTypeErrMsg = "The --sbom-only flag can only be used when the scan type is sca"
130130
BranchPrimaryPrefix = "--branch-primary="
131131
OverridePolicyManagement = "override-policy-management"
132-
maxSizeGB = 5 // 5 GB
133-
maxSizeBytes = maxSizeGB * 1024 * 1024 * 1024 // 5 GB in bytes
134132
)
135133

136134
var (
@@ -155,6 +153,7 @@ var (
155153
aditionalParameters []string
156154
kicsErrorCodes = []string{"60", "50", "40", "30", "20"}
157155
containerResolver wrappers.ContainerResolverWrapper
156+
MaxSizeBytes int64 = 5 * 1024 * 1024 * 1024 // 5 GB in bytes
158157
)
159158

160159
func NewScanCommand(
@@ -2095,7 +2094,7 @@ func uploadZip(uploadsWrapper wrappers.UploadsWrapper, zipFilePath string, unzip
20952094
// check for INCREASE_FILE_UPLOAD_LIMIT feature flag
20962095
flagResponse, _ := wrappers.GetSpecificFeatureFlag(featureFlagsWrapper, wrappers.IncreaseFileUploadLimit)
20972096

2098-
if flagResponse.Status && fileInfo.Size() > maxSizeBytes {
2097+
if flagResponse.Status && fileInfo.Size() > MaxSizeBytes {
20992098
// File size >5GB, proceed with multipart upload
21002099
logger.PrintIfVerbose("File size >5GB and INCREASE_FILE_UPLOAD_LIMIT flag is enabled,hence uploading file in multiple parts...")
21012100
preSignedURL, zipFilePathErr = uploadsWrapper.UploadFileInMultipart(zipFilePath, featureFlagsWrapper)

internal/commands/scan_test.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4280,3 +4280,106 @@ func TestEnforceLocalResolutionForTarFiles_Integration(t *testing.T) {
42804280
})
42814281
}
42824282
}
4283+
4284+
func TestUploadZip_AsMultipartUpload_when_FF_Enable_ZIP_Exceeds_5GB(t *testing.T) {
4285+
fileInfo, err := os.Stat("data/sources.zip")
4286+
if err != nil {
4287+
t.Fatalf("Failed to close zip file: %v", err)
4288+
}
4289+
// Simulate a file size > 5GB by setting MaxSizeBytes to less than actual size
4290+
MaxSizeBytes = fileInfo.Size() - 1
4291+
defer func() { MaxSizeBytes = 5 * 1024 * 1024 * 1024 }() // Reset after test
4292+
4293+
uploadWrapper := mock.UploadsMockWrapper{}
4294+
mock.Flag = wrappers.FeatureFlagResponseModel{Name: wrappers.IncreaseFileUploadLimit, Status: true}
4295+
featureFlagsWrapper := &mock.FeatureFlagsMockWrapper{}
4296+
url, zipPath, err := uploadZip(&uploadWrapper, "data/sources.zip", false, true, featureFlagsWrapper)
4297+
assert.NilError(t, err)
4298+
assert.Equal(t, zipPath, "")
4299+
assert.Equal(t, url, "multiPart/path/to/nowhere")
4300+
}
4301+
4302+
func TestUploadZip_AsMultipartUpload_when_FF_Disable_ZIP_Exceeds_5GB(t *testing.T) {
4303+
fileInfo, err := os.Stat("data/sources.zip")
4304+
if err != nil {
4305+
t.Fatalf("Failed to close zip file: %v", err)
4306+
}
4307+
// Simulate a file size > 5GB by setting MaxSizeBytes to less than actual size
4308+
MaxSizeBytes = fileInfo.Size() - 1
4309+
defer func() { MaxSizeBytes = 5 * 1024 * 1024 * 1024 }() // Reset after test
4310+
4311+
uploadWrapper := mock.UploadsMockWrapper{}
4312+
mock.Flag = wrappers.FeatureFlagResponseModel{Name: wrappers.IncreaseFileUploadLimit, Status: false}
4313+
featureFlagsWrapper := &mock.FeatureFlagsMockWrapper{}
4314+
url, zipPath, err := uploadZip(&uploadWrapper, "data/sources.zip", false, true, featureFlagsWrapper)
4315+
assert.NilError(t, err)
4316+
assert.Equal(t, zipPath, "")
4317+
assert.Equal(t, url, "singlePart/path/to/nowhere")
4318+
}
4319+
4320+
func TestUploadZip_AsMultipartUpload_when_FF_Enable_ZIP_LessThan_5GB(t *testing.T) {
4321+
uploadWrapper := mock.UploadsMockWrapper{}
4322+
mock.Flag = wrappers.FeatureFlagResponseModel{Name: wrappers.IncreaseFileUploadLimit, Status: true}
4323+
featureFlagsWrapper := &mock.FeatureFlagsMockWrapper{}
4324+
url, zipPath, err := uploadZip(&uploadWrapper, "data/sources.zip", false, true, featureFlagsWrapper)
4325+
assert.NilError(t, err)
4326+
assert.Equal(t, zipPath, "")
4327+
assert.Equal(t, url, "singlePart/path/to/nowhere")
4328+
}
4329+
4330+
func TestUploadZip_AsMultipartUpload_when_FF_Disable_ZIP_LessThan_5GB(t *testing.T) {
4331+
uploadWrapper := mock.UploadsMockWrapper{}
4332+
mock.Flag = wrappers.FeatureFlagResponseModel{Name: wrappers.IncreaseFileUploadLimit, Status: false}
4333+
featureFlagsWrapper := &mock.FeatureFlagsMockWrapper{}
4334+
url, zipPath, err := uploadZip(&uploadWrapper, "data/sources.zip", false, true, featureFlagsWrapper)
4335+
assert.NilError(t, err)
4336+
assert.Equal(t, zipPath, "")
4337+
assert.Equal(t, url, "singlePart/path/to/nowhere")
4338+
}
4339+
4340+
func TestUploadZip_AsMultipartUpload_when_FF_Enable_ZIP_Exceeds_5GB_Error(t *testing.T) {
4341+
// Create a temporary zip file
4342+
dir := t.TempDir()
4343+
zipPathTemp := filepath.Join(dir, "failureCaseLarge.zip")
4344+
4345+
// Create the zip file
4346+
zipFile, err := os.Create(zipPathTemp)
4347+
if err != nil {
4348+
t.Fatalf("Failed to create zip file: %v", err)
4349+
}
4350+
defer func(zipFile *os.File) {
4351+
err := zipFile.Close()
4352+
if err != nil {
4353+
t.Fatalf("Failed to close zip file: %v", err)
4354+
}
4355+
}(zipFile)
4356+
4357+
// Seek to 5KB + 1 byte
4358+
_, err = zipFile.Seek(5*1024+1, 0) // 5121 bytes
4359+
if err != nil {
4360+
panic("Failed to seek in zip file: " + err.Error())
4361+
}
4362+
4363+
// Write a single byte to allocate space
4364+
_, err = zipFile.Write([]byte{0})
4365+
if err != nil {
4366+
panic("Failed to write to zip file: " + err.Error())
4367+
}
4368+
4369+
fileInfo, err := os.Stat(zipPathTemp)
4370+
if err != nil {
4371+
t.Fatalf("Failed to close zip file: %v", err)
4372+
}
4373+
4374+
// Simulate a file size > 5GB by setting MaxSizeBytes to less than actual size
4375+
MaxSizeBytes = fileInfo.Size() - 1
4376+
defer func() { MaxSizeBytes = 5 * 1024 * 1024 * 1024 }() //
4377+
4378+
uploadWrapper := mock.UploadsMockWrapper{}
4379+
mock.Flag = wrappers.FeatureFlagResponseModel{Name: wrappers.IncreaseFileUploadLimit, Status: true}
4380+
featureFlagsWrapper := &mock.FeatureFlagsMockWrapper{}
4381+
_, zipPath, err := uploadZip(&uploadWrapper, zipPathTemp, false, true, featureFlagsWrapper)
4382+
assert.Assert(t, err != nil)
4383+
assert.Assert(t, strings.Contains(err.Error(), "error from UploadFileInMultipart"), err.Error())
4384+
assert.Equal(t, zipPath, "")
4385+
}

internal/wrappers/mock/uploads-mock.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ type UploadsMockWrapper struct {
1414

1515
func (u *UploadsMockWrapper) UploadFileInMultipart(filePath string, wrapper wrappers.FeatureFlagsWrapper) (*string, error) {
1616
fmt.Println("UploadFileInMultipart called Create in UploadsMockWrapper")
17-
if filePath == "failureCase2.zip" {
17+
if strings.Contains(filePath, "failureCaseLarge.zip") {
1818
return nil, errors.New("error from UploadFileInMultipart")
1919
}
20-
url := "/path/to/largeZipFile"
20+
url := "multiPart/path/to/nowhere"
2121
return &url, nil
2222
}
2323

@@ -26,6 +26,6 @@ func (u *UploadsMockWrapper) UploadFile(filePath string, featureFlagsWrapper wra
2626
if strings.Contains(filePath, "failureCase.zip") {
2727
return nil, errors.New("error from UploadFile")
2828
}
29-
url := "/path/to/nowhere"
29+
url := "singlePart/path/to/nowhere"
3030
return &url, nil
3131
}

internal/wrappers/uploads-http.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ func getPartSizeBytes() (int64, error) {
433433
logger.PrintIfVerbose(fmt.Sprintf("Configured part size %d GB is outside the allowed range (1 – 5 GB). Defaulting to 2 GB.", truncatedSize))
434434
truncatedSize = 2
435435
}
436+
logger.PrintIfVerbose("Splitting zip file into parts of size: " + fmt.Sprintf("%.0f", float64(truncatedSize)) + " GB")
436437
const bytesPerGB = 1024 * 1024 * 1024
437438
return int64(float64(truncatedSize) * float64(bytesPerGB)), nil
438439
}

test/integration/scan_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2726,3 +2726,22 @@ func TestCreateScanWithNewProjectName_Assign_Groups(t *testing.T) {
27262726
assert.NilError(t, err, "Groups should be assigned to newly created projects")
27272727

27282728
}
2729+
func TestCreateScan_AsMultipartUpload_Success(t *testing.T) {
2730+
// Simulate a file size > 5GB by setting MaxSizeBytes to less than actual size
2731+
commands.MaxSizeBytes = 10240 // 10KB less than actual file size
2732+
defer func() { commands.MaxSizeBytes = 5 * 1024 * 1024 * 1024 }() // Reset after test
2733+
args := []string{
2734+
"scan", "create",
2735+
flag(params.ProjectName), getProjectNameForScanTests(),
2736+
flag(params.SourcesFlag), "data/insecure.zip",
2737+
flag(params.BranchFlag), "dummy_branch",
2738+
flag(params.DebugFlag),
2739+
}
2740+
var buf bytes.Buffer
2741+
log.SetOutput(&buf)
2742+
2743+
err, _ := executeCommand(t, args...)
2744+
assert.NilError(t, err)
2745+
log.SetOutput(os.Stderr)
2746+
assert.Assert(t, strings.Contains(buf.String(), "File size >5GB and INCREASE_FILE_UPLOAD_LIMIT flag is enabled,hence uploading file in multiple parts"), "uploading file in multiple parts")
2747+
}

0 commit comments

Comments
 (0)