mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Add artifacts test fixture (#30300)
Closes https://github.com/go-gitea/gitea/issues/30296 - Adds a DB fixture for actions artifacts - Adds artifacts test files - Clears artifacts test files between each run - Note: I initially initialized the artifacts only for artifacts tests, but because the files are small it only takes ~8ms, so I changed it to always run in test setup for simplicity - Fix some otherwise flaky tests by making them not depend on previous tests
This commit is contained in:
		
							
								
								
									
										71
									
								
								models/fixtures/action_artifact.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								models/fixtures/action_artifact.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | |||||||
|  | - | ||||||
|  |   id: 1 | ||||||
|  |   run_id: 791 | ||||||
|  |   runner_id: 1 | ||||||
|  |   repo_id: 4 | ||||||
|  |   owner_id: 1 | ||||||
|  |   commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 | ||||||
|  |   storage_path: "26/1/1712166500347189545.chunk" | ||||||
|  |   file_size: 1024 | ||||||
|  |   file_compressed_size: 1024 | ||||||
|  |   content_encoding: "" | ||||||
|  |   artifact_path: "abc.txt" | ||||||
|  |   artifact_name: "artifact-download" | ||||||
|  |   status: 1 | ||||||
|  |   created_unix: 1712338649 | ||||||
|  |   updated_unix: 1712338649 | ||||||
|  |   expired_unix: 1720114649 | ||||||
|  |  | ||||||
|  | - | ||||||
|  |   id: 19 | ||||||
|  |   run_id: 791 | ||||||
|  |   runner_id: 1 | ||||||
|  |   repo_id: 4 | ||||||
|  |   owner_id: 1 | ||||||
|  |   commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 | ||||||
|  |   storage_path: "26/19/1712348022422036662.chunk" | ||||||
|  |   file_size: 1024 | ||||||
|  |   file_compressed_size: 1024 | ||||||
|  |   content_encoding: "" | ||||||
|  |   artifact_path: "abc.txt" | ||||||
|  |   artifact_name: "multi-file-download" | ||||||
|  |   status: 2 | ||||||
|  |   created_unix: 1712348022 | ||||||
|  |   updated_unix: 1712348022 | ||||||
|  |   expired_unix: 1720124022 | ||||||
|  |  | ||||||
|  | - | ||||||
|  |   id: 20 | ||||||
|  |   run_id: 791 | ||||||
|  |   runner_id: 1 | ||||||
|  |   repo_id: 4 | ||||||
|  |   owner_id: 1 | ||||||
|  |   commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 | ||||||
|  |   storage_path: "26/20/1712348022423431524.chunk" | ||||||
|  |   file_size: 1024 | ||||||
|  |   file_compressed_size: 1024 | ||||||
|  |   content_encoding: "" | ||||||
|  |   artifact_path: "xyz/def.txt" | ||||||
|  |   artifact_name: "multi-file-download" | ||||||
|  |   status: 2 | ||||||
|  |   created_unix: 1712348022 | ||||||
|  |   updated_unix: 1712348022 | ||||||
|  |   expired_unix: 1720124022 | ||||||
|  |  | ||||||
|  | - | ||||||
|  |   id: 22 | ||||||
|  |   run_id: 792 | ||||||
|  |   runner_id: 1 | ||||||
|  |   repo_id: 4 | ||||||
|  |   owner_id: 1 | ||||||
|  |   commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0 | ||||||
|  |   storage_path: "27/5/1730330775594233150.chunk" | ||||||
|  |   file_size: 1024 | ||||||
|  |   file_compressed_size: 1024 | ||||||
|  |   content_encoding: "application/zip" | ||||||
|  |   artifact_path: "artifact-v4-download.zip" | ||||||
|  |   artifact_name: "artifact-v4-download" | ||||||
|  |   status: 2 | ||||||
|  |   created_unix: 1730330775 | ||||||
|  |   updated_unix: 1730330775 | ||||||
|  |   expired_unix: 1738106775 | ||||||
| @@ -131,7 +131,7 @@ var ( | |||||||
| 	ActionsArtifacts ObjectStorage = uninitializedStorage | 	ActionsArtifacts ObjectStorage = uninitializedStorage | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // Init init the stoarge | // Init init the storage | ||||||
| func Init() error { | func Init() error { | ||||||
| 	for _, f := range []func() error{ | 	for _, f := range []func() error{ | ||||||
| 		initAttachments, | 		initAttachments, | ||||||
|   | |||||||
| @@ -38,21 +38,21 @@ func TestActionsArtifactUploadSingleFile(t *testing.T) { | |||||||
|  |  | ||||||
| 	// get upload url | 	// get upload url | ||||||
| 	idx := strings.Index(uploadResp.FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") | 	idx := strings.Index(uploadResp.FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") | ||||||
| 	url := uploadResp.FileContainerResourceURL[idx:] + "?itemPath=artifact/abc.txt" | 	url := uploadResp.FileContainerResourceURL[idx:] + "?itemPath=artifact/abc-2.txt" | ||||||
|  |  | ||||||
| 	// upload artifact chunk | 	// upload artifact chunk | ||||||
| 	body := strings.Repeat("A", 1024) | 	body := strings.Repeat("C", 1024) | ||||||
| 	req = NewRequestWithBody(t, "PUT", url, strings.NewReader(body)). | 	req = NewRequestWithBody(t, "PUT", url, strings.NewReader(body)). | ||||||
| 		AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a"). | 		AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a"). | ||||||
| 		SetHeader("Content-Range", "bytes 0-1023/1024"). | 		SetHeader("Content-Range", "bytes 0-1023/1024"). | ||||||
| 		SetHeader("x-tfs-filelength", "1024"). | 		SetHeader("x-tfs-filelength", "1024"). | ||||||
| 		SetHeader("x-actions-results-md5", "1HsSe8LeLWh93ILaw1TEFQ==") // base64(md5(body)) | 		SetHeader("x-actions-results-md5", "XVlf820rMInUi64wmMi6EA==") // base64(md5(body)) | ||||||
| 	MakeRequest(t, req, http.StatusOK) | 	MakeRequest(t, req, http.StatusOK) | ||||||
|  |  | ||||||
| 	t.Logf("Create artifact confirm") | 	t.Logf("Create artifact confirm") | ||||||
|  |  | ||||||
| 	// confirm artifact upload | 	// confirm artifact upload | ||||||
| 	req = NewRequest(t, "PATCH", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts?artifactName=artifact"). | 	req = NewRequest(t, "PATCH", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts?artifactName=artifact-single"). | ||||||
| 		AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | 		AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | ||||||
| 	MakeRequest(t, req, http.StatusOK) | 	MakeRequest(t, req, http.StatusOK) | ||||||
| } | } | ||||||
| @@ -115,29 +115,40 @@ func TestActionsArtifactDownload(t *testing.T) { | |||||||
| 	resp := MakeRequest(t, req, http.StatusOK) | 	resp := MakeRequest(t, req, http.StatusOK) | ||||||
| 	var listResp listArtifactsResponse | 	var listResp listArtifactsResponse | ||||||
| 	DecodeJSON(t, resp, &listResp) | 	DecodeJSON(t, resp, &listResp) | ||||||
| 	assert.Equal(t, int64(1), listResp.Count) | 	assert.Equal(t, int64(2), listResp.Count) | ||||||
| 	assert.Equal(t, "artifact", listResp.Value[0].Name) |  | ||||||
| 	assert.Contains(t, listResp.Value[0].FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts") |  | ||||||
|  |  | ||||||
| 	idx := strings.Index(listResp.Value[0].FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") | 	// Return list might be in any order. Get one file. | ||||||
| 	url := listResp.Value[0].FileContainerResourceURL[idx+1:] + "?itemPath=artifact" | 	var artifactIdx int | ||||||
|  | 	for i, artifact := range listResp.Value { | ||||||
|  | 		if artifact.Name == "artifact-download" { | ||||||
|  | 			artifactIdx = i | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	assert.NotNil(t, artifactIdx) | ||||||
|  | 	assert.Equal(t, listResp.Value[artifactIdx].Name, "artifact-download") | ||||||
|  | 	assert.Contains(t, listResp.Value[artifactIdx].FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts") | ||||||
|  |  | ||||||
|  | 	idx := strings.Index(listResp.Value[artifactIdx].FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") | ||||||
|  | 	url := listResp.Value[artifactIdx].FileContainerResourceURL[idx+1:] + "?itemPath=artifact-download" | ||||||
| 	req = NewRequest(t, "GET", url). | 	req = NewRequest(t, "GET", url). | ||||||
| 		AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | 		AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | ||||||
| 	resp = MakeRequest(t, req, http.StatusOK) | 	resp = MakeRequest(t, req, http.StatusOK) | ||||||
| 	var downloadResp downloadArtifactResponse | 	var downloadResp downloadArtifactResponse | ||||||
| 	DecodeJSON(t, resp, &downloadResp) | 	DecodeJSON(t, resp, &downloadResp) | ||||||
| 	assert.Len(t, downloadResp.Value, 1) | 	assert.Len(t, downloadResp.Value, 1) | ||||||
| 	assert.Equal(t, "artifact/abc.txt", downloadResp.Value[0].Path) | 	assert.Equal(t, "artifact-download/abc.txt", downloadResp.Value[artifactIdx].Path) | ||||||
| 	assert.Equal(t, "file", downloadResp.Value[0].ItemType) | 	assert.Equal(t, "file", downloadResp.Value[artifactIdx].ItemType) | ||||||
| 	assert.Contains(t, downloadResp.Value[0].ContentLocation, "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts") | 	assert.Contains(t, downloadResp.Value[artifactIdx].ContentLocation, "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts") | ||||||
|  |  | ||||||
| 	idx = strings.Index(downloadResp.Value[0].ContentLocation, "/api/actions_pipeline/_apis/pipelines/") | 	idx = strings.Index(downloadResp.Value[artifactIdx].ContentLocation, "/api/actions_pipeline/_apis/pipelines/") | ||||||
| 	url = downloadResp.Value[0].ContentLocation[idx:] | 	url = downloadResp.Value[artifactIdx].ContentLocation[idx:] | ||||||
| 	req = NewRequest(t, "GET", url). | 	req = NewRequest(t, "GET", url). | ||||||
| 		AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | 		AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | ||||||
| 	resp = MakeRequest(t, req, http.StatusOK) | 	resp = MakeRequest(t, req, http.StatusOK) | ||||||
|  |  | ||||||
| 	body := strings.Repeat("A", 1024) | 	body := strings.Repeat("A", 1024) | ||||||
| 	assert.Equal(t, resp.Body.String(), body) | 	assert.Equal(t, body, resp.Body.String()) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestActionsArtifactUploadMultipleFile(t *testing.T) { | func TestActionsArtifactUploadMultipleFile(t *testing.T) { | ||||||
| @@ -163,14 +174,14 @@ func TestActionsArtifactUploadMultipleFile(t *testing.T) { | |||||||
|  |  | ||||||
| 	files := []uploadingFile{ | 	files := []uploadingFile{ | ||||||
| 		{ | 		{ | ||||||
| 			Path:    "abc.txt", | 			Path:    "abc-3.txt", | ||||||
| 			Content: strings.Repeat("A", 1024), | 			Content: strings.Repeat("D", 1024), | ||||||
| 			MD5:     "1HsSe8LeLWh93ILaw1TEFQ==", | 			MD5:     "9nqj7E8HZmfQtPifCJ5Zww==", | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			Path:    "xyz/def.txt", | 			Path:    "xyz/def-2.txt", | ||||||
| 			Content: strings.Repeat("B", 1024), | 			Content: strings.Repeat("E", 1024), | ||||||
| 			MD5:     "6fgADK/7zjadf+6cB9Q1CQ==", | 			MD5:     "/s1kKvxeHlUX85vaTaVxuA==", | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -199,7 +210,7 @@ func TestActionsArtifactUploadMultipleFile(t *testing.T) { | |||||||
| func TestActionsArtifactDownloadMultiFiles(t *testing.T) { | func TestActionsArtifactDownloadMultiFiles(t *testing.T) { | ||||||
| 	defer tests.PrepareTestEnv(t)() | 	defer tests.PrepareTestEnv(t)() | ||||||
|  |  | ||||||
| 	const testArtifactName = "multi-files" | 	const testArtifactName = "multi-file-download" | ||||||
|  |  | ||||||
| 	req := NewRequest(t, "GET", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts"). | 	req := NewRequest(t, "GET", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts"). | ||||||
| 		AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | 		AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | ||||||
| @@ -226,7 +237,7 @@ func TestActionsArtifactDownloadMultiFiles(t *testing.T) { | |||||||
| 	DecodeJSON(t, resp, &downloadResp) | 	DecodeJSON(t, resp, &downloadResp) | ||||||
| 	assert.Len(t, downloadResp.Value, 2) | 	assert.Len(t, downloadResp.Value, 2) | ||||||
|  |  | ||||||
| 	downloads := [][]string{{"multi-files/abc.txt", "A"}, {"multi-files/xyz/def.txt", "B"}} | 	downloads := [][]string{{"multi-file-download/abc.txt", "B"}, {"multi-file-download/xyz/def.txt", "C"}} | ||||||
| 	for _, v := range downloadResp.Value { | 	for _, v := range downloadResp.Value { | ||||||
| 		var bodyChar string | 		var bodyChar string | ||||||
| 		var path string | 		var path string | ||||||
| @@ -247,8 +258,7 @@ func TestActionsArtifactDownloadMultiFiles(t *testing.T) { | |||||||
| 		req = NewRequest(t, "GET", url). | 		req = NewRequest(t, "GET", url). | ||||||
| 			AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | 			AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | ||||||
| 		resp = MakeRequest(t, req, http.StatusOK) | 		resp = MakeRequest(t, req, http.StatusOK) | ||||||
| 		body := strings.Repeat(bodyChar, 1024) | 		assert.Equal(t, strings.Repeat(bodyChar, 1024), resp.Body.String()) | ||||||
| 		assert.Equal(t, resp.Body.String(), body) |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -300,7 +310,7 @@ func TestActionsArtifactOverwrite(t *testing.T) { | |||||||
| 		DecodeJSON(t, resp, &listResp) | 		DecodeJSON(t, resp, &listResp) | ||||||
|  |  | ||||||
| 		idx := strings.Index(listResp.Value[0].FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") | 		idx := strings.Index(listResp.Value[0].FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") | ||||||
| 		url := listResp.Value[0].FileContainerResourceURL[idx+1:] + "?itemPath=artifact" | 		url := listResp.Value[0].FileContainerResourceURL[idx+1:] + "?itemPath=artifact-download" | ||||||
| 		req = NewRequest(t, "GET", url). | 		req = NewRequest(t, "GET", url). | ||||||
| 			AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | 			AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | ||||||
| 		resp = MakeRequest(t, req, http.StatusOK) | 		resp = MakeRequest(t, req, http.StatusOK) | ||||||
| @@ -320,14 +330,14 @@ func TestActionsArtifactOverwrite(t *testing.T) { | |||||||
| 		// upload same artifact, it uses 4096 B | 		// upload same artifact, it uses 4096 B | ||||||
| 		req := NewRequestWithJSON(t, "POST", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts", getUploadArtifactRequest{ | 		req := NewRequestWithJSON(t, "POST", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts", getUploadArtifactRequest{ | ||||||
| 			Type: "actions_storage", | 			Type: "actions_storage", | ||||||
| 			Name: "artifact", | 			Name: "artifact-download", | ||||||
| 		}).AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | 		}).AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | ||||||
| 		resp := MakeRequest(t, req, http.StatusOK) | 		resp := MakeRequest(t, req, http.StatusOK) | ||||||
| 		var uploadResp uploadArtifactResponse | 		var uploadResp uploadArtifactResponse | ||||||
| 		DecodeJSON(t, resp, &uploadResp) | 		DecodeJSON(t, resp, &uploadResp) | ||||||
|  |  | ||||||
| 		idx := strings.Index(uploadResp.FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") | 		idx := strings.Index(uploadResp.FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") | ||||||
| 		url := uploadResp.FileContainerResourceURL[idx:] + "?itemPath=artifact/abc.txt" | 		url := uploadResp.FileContainerResourceURL[idx:] + "?itemPath=artifact-download/abc.txt" | ||||||
| 		body := strings.Repeat("B", 4096) | 		body := strings.Repeat("B", 4096) | ||||||
| 		req = NewRequestWithBody(t, "PUT", url, strings.NewReader(body)). | 		req = NewRequestWithBody(t, "PUT", url, strings.NewReader(body)). | ||||||
| 			AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a"). | 			AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a"). | ||||||
| @@ -337,7 +347,7 @@ func TestActionsArtifactOverwrite(t *testing.T) { | |||||||
| 		MakeRequest(t, req, http.StatusOK) | 		MakeRequest(t, req, http.StatusOK) | ||||||
|  |  | ||||||
| 		// confirm artifact upload | 		// confirm artifact upload | ||||||
| 		req = NewRequest(t, "PATCH", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts?artifactName=artifact"). | 		req = NewRequest(t, "PATCH", "/api/actions_pipeline/_apis/pipelines/workflows/791/artifacts?artifactName=artifact-download"). | ||||||
| 			AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | 			AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | ||||||
| 		MakeRequest(t, req, http.StatusOK) | 		MakeRequest(t, req, http.StatusOK) | ||||||
| 	} | 	} | ||||||
| @@ -352,15 +362,15 @@ func TestActionsArtifactOverwrite(t *testing.T) { | |||||||
|  |  | ||||||
| 		var uploadedItem listArtifactsResponseItem | 		var uploadedItem listArtifactsResponseItem | ||||||
| 		for _, item := range listResp.Value { | 		for _, item := range listResp.Value { | ||||||
| 			if item.Name == "artifact" { | 			if item.Name == "artifact-download" { | ||||||
| 				uploadedItem = item | 				uploadedItem = item | ||||||
| 				break | 				break | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		assert.Equal(t, uploadedItem.Name, "artifact") | 		assert.Equal(t, uploadedItem.Name, "artifact-download") | ||||||
|  |  | ||||||
| 		idx := strings.Index(uploadedItem.FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") | 		idx := strings.Index(uploadedItem.FileContainerResourceURL, "/api/actions_pipeline/_apis/pipelines/") | ||||||
| 		url := uploadedItem.FileContainerResourceURL[idx+1:] + "?itemPath=artifact" | 		url := uploadedItem.FileContainerResourceURL[idx+1:] + "?itemPath=artifact-download" | ||||||
| 		req = NewRequest(t, "GET", url). | 		req = NewRequest(t, "GET", url). | ||||||
| 			AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | 			AddTokenAuth("8061e833a55f6fc0157c98b883e91fcfeeb1a71a") | ||||||
| 		resp = MakeRequest(t, req, http.StatusOK) | 		resp = MakeRequest(t, req, http.StatusOK) | ||||||
|   | |||||||
| @@ -308,7 +308,7 @@ func TestActionsArtifactV4DownloadSingle(t *testing.T) { | |||||||
|  |  | ||||||
| 	// acquire artifact upload url | 	// acquire artifact upload url | ||||||
| 	req := NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/ListArtifacts", toProtoJSON(&actions.ListArtifactsRequest{ | 	req := NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/ListArtifacts", toProtoJSON(&actions.ListArtifactsRequest{ | ||||||
| 		NameFilter:              wrapperspb.String("artifact"), | 		NameFilter:              wrapperspb.String("artifact-v4-download"), | ||||||
| 		WorkflowRunBackendId:    "792", | 		WorkflowRunBackendId:    "792", | ||||||
| 		WorkflowJobRunBackendId: "193", | 		WorkflowJobRunBackendId: "193", | ||||||
| 	})).AddTokenAuth(token) | 	})).AddTokenAuth(token) | ||||||
| @@ -319,7 +319,7 @@ func TestActionsArtifactV4DownloadSingle(t *testing.T) { | |||||||
|  |  | ||||||
| 	// confirm artifact upload | 	// confirm artifact upload | ||||||
| 	req = NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/GetSignedArtifactURL", toProtoJSON(&actions.GetSignedArtifactURLRequest{ | 	req = NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/GetSignedArtifactURL", toProtoJSON(&actions.GetSignedArtifactURLRequest{ | ||||||
| 		Name:                    "artifact", | 		Name:                    "artifact-v4-download", | ||||||
| 		WorkflowRunBackendId:    "792", | 		WorkflowRunBackendId:    "792", | ||||||
| 		WorkflowJobRunBackendId: "193", | 		WorkflowJobRunBackendId: "193", | ||||||
| 	})). | 	})). | ||||||
| @@ -331,8 +331,8 @@ func TestActionsArtifactV4DownloadSingle(t *testing.T) { | |||||||
|  |  | ||||||
| 	req = NewRequest(t, "GET", finalizeResp.SignedUrl) | 	req = NewRequest(t, "GET", finalizeResp.SignedUrl) | ||||||
| 	resp = MakeRequest(t, req, http.StatusOK) | 	resp = MakeRequest(t, req, http.StatusOK) | ||||||
| 	body := strings.Repeat("A", 1024) | 	body := strings.Repeat("D", 1024) | ||||||
| 	assert.Equal(t, resp.Body.String(), body) | 	assert.Equal(t, body, resp.Body.String()) | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestActionsArtifactV4Delete(t *testing.T) { | func TestActionsArtifactV4Delete(t *testing.T) { | ||||||
| @@ -343,7 +343,7 @@ func TestActionsArtifactV4Delete(t *testing.T) { | |||||||
|  |  | ||||||
| 	// delete artifact by name | 	// delete artifact by name | ||||||
| 	req := NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/DeleteArtifact", toProtoJSON(&actions.DeleteArtifactRequest{ | 	req := NewRequestWithBody(t, "POST", "/twirp/github.actions.results.api.v1.ArtifactService/DeleteArtifact", toProtoJSON(&actions.DeleteArtifactRequest{ | ||||||
| 		Name:                    "artifact", | 		Name:                    "artifact-v4-download", | ||||||
| 		WorkflowRunBackendId:    "792", | 		WorkflowRunBackendId:    "792", | ||||||
| 		WorkflowJobRunBackendId: "193", | 		WorkflowJobRunBackendId: "193", | ||||||
| 	})).AddTokenAuth(token) | 	})).AddTokenAuth(token) | ||||||
|   | |||||||
| @@ -192,6 +192,20 @@ func PrepareAttachmentsStorage(t testing.TB) { | |||||||
| 	})) | 	})) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func PrepareArtifactsStorage(t testing.TB) { | ||||||
|  | 	// prepare actions artifacts directory and files | ||||||
|  | 	assert.NoError(t, storage.Clean(storage.ActionsArtifacts)) | ||||||
|  |  | ||||||
|  | 	s, err := storage.NewStorage(setting.LocalStorageType, &setting.Storage{ | ||||||
|  | 		Path: filepath.Join(filepath.Dir(setting.AppPath), "tests", "testdata", "data", "artifacts"), | ||||||
|  | 	}) | ||||||
|  | 	assert.NoError(t, err) | ||||||
|  | 	assert.NoError(t, s.IterateObjects("", func(p string, obj storage.Object) error { | ||||||
|  | 		_, err = storage.Copy(storage.ActionsArtifacts, p, s, p) | ||||||
|  | 		return err | ||||||
|  | 	})) | ||||||
|  | } | ||||||
|  |  | ||||||
| func PrepareTestEnv(t testing.TB, skip ...int) func() { | func PrepareTestEnv(t testing.TB, skip ...int) func() { | ||||||
| 	t.Helper() | 	t.Helper() | ||||||
| 	ourSkip := 1 | 	ourSkip := 1 | ||||||
| @@ -206,6 +220,7 @@ func PrepareTestEnv(t testing.TB, skip ...int) func() { | |||||||
| 	// load git repo fixtures | 	// load git repo fixtures | ||||||
| 	assert.NoError(t, util.RemoveAll(setting.RepoRootPath)) | 	assert.NoError(t, util.RemoveAll(setting.RepoRootPath)) | ||||||
| 	assert.NoError(t, unittest.CopyDir(path.Join(filepath.Dir(setting.AppPath), "tests/gitea-repositories-meta"), setting.RepoRootPath)) | 	assert.NoError(t, unittest.CopyDir(path.Join(filepath.Dir(setting.AppPath), "tests/gitea-repositories-meta"), setting.RepoRootPath)) | ||||||
|  |  | ||||||
| 	ownerDirs, err := os.ReadDir(setting.RepoRootPath) | 	ownerDirs, err := os.ReadDir(setting.RepoRootPath) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		assert.NoError(t, err, "unable to read the new repo root: %v\n", err) | 		assert.NoError(t, err, "unable to read the new repo root: %v\n", err) | ||||||
| @@ -227,6 +242,9 @@ func PrepareTestEnv(t testing.TB, skip ...int) func() { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// Initialize actions artifact data | ||||||
|  | 	PrepareArtifactsStorage(t) | ||||||
|  |  | ||||||
| 	// load LFS object fixtures | 	// load LFS object fixtures | ||||||
| 	// (LFS storage can be on any of several backends, including remote servers, so we init it with the storage API) | 	// (LFS storage can be on any of several backends, including remote servers, so we init it with the storage API) | ||||||
| 	lfsFixtures, err := storage.NewStorage(setting.LocalStorageType, &setting.Storage{ | 	lfsFixtures, err := storage.NewStorage(setting.LocalStorageType, &setting.Storage{ | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								tests/testdata/data/artifacts/26/1/1712166500347189545.chunk
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/testdata/data/artifacts/26/1/1712166500347189545.chunk
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | ||||||
							
								
								
									
										1
									
								
								tests/testdata/data/artifacts/26/19/1712348022422036662.chunk
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/testdata/data/artifacts/26/19/1712348022422036662.chunk
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | ||||||
							
								
								
									
										1
									
								
								tests/testdata/data/artifacts/26/20/1712348022423431524.chunk
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/testdata/data/artifacts/26/20/1712348022423431524.chunk
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | ||||||
							
								
								
									
										1
									
								
								tests/testdata/data/artifacts/27/5/1730330775594233150.chunk
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/testdata/data/artifacts/27/5/1730330775594233150.chunk
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD | ||||||
		Reference in New Issue
	
	Block a user