acvptool: factor out uploadResult

Change-Id: I7fdc63786654f488b2502d6e9c3fb535a2766574
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/55605
Reviewed-by: Adam Langley <agl@google.com>
Reviewed-by: David Benjamin <davidben@google.com>
Commit-Queue: Adam Langley <agl@google.com>
diff --git a/util/fipstools/acvp/acvptool/acvp.go b/util/fipstools/acvp/acvptool/acvp.go
index 723d29e..3e0ad44 100644
--- a/util/fipstools/acvp/acvptool/acvp.go
+++ b/util/fipstools/acvp/acvptool/acvp.go
@@ -313,6 +313,54 @@
 	}
 }
 
+func uploadResult(server *acvp.Server, setURL string, resultData []byte) error {
+	resultSize := uint64(len(resultData)) + 32 /* for framing overhead */
+	if server.SizeLimit == 0 || resultSize < server.SizeLimit {
+		log.Printf("Result size %d bytes", resultSize)
+		return server.Post(nil, trimLeadingSlash(setURL)+"/results", resultData)
+	}
+
+	// The NIST ACVP server no longer requires the large-upload process,
+	// suggesting that this may no longer be needed.
+	log.Printf("Result is %d bytes, too much given server limit of %d bytes. Using large-upload process.", resultSize, server.SizeLimit)
+	largeRequestBytes, err := json.Marshal(acvp.LargeUploadRequest{
+		Size: resultSize,
+		URL:  setURL,
+	})
+	if err != nil {
+		return errors.New("failed to marshal large-upload request: " + err.Error())
+	}
+
+	var largeResponse acvp.LargeUploadResponse
+	if err := server.Post(&largeResponse, "/large", largeRequestBytes); err != nil {
+		return errors.New("failed to request large-upload endpoint: " + err.Error())
+	}
+
+	log.Printf("Directed to large-upload endpoint at %q", largeResponse.URL)
+	req, err := http.NewRequest("POST", largeResponse.URL, bytes.NewBuffer(resultData))
+	if err != nil {
+		return errors.New("failed to create POST request: " + err.Error())
+	}
+	token := largeResponse.AccessToken
+	if len(token) == 0 {
+		token = server.AccessToken
+	}
+	req.Header.Add("Authorization", "Bearer "+token)
+	req.Header.Add("Content-Type", "application/json")
+
+	client := &http.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		return errors.New("failed writing large upload: " + err.Error())
+	}
+	resp.Body.Close()
+	if resp.StatusCode != 200 {
+		return fmt.Errorf("large upload resulted in status code %d", resp.StatusCode)
+	}
+
+	return nil
+}
+
 func main() {
 	flag.Parse()
 
@@ -613,53 +661,10 @@
 		resultBuf.Write(replyBytes)
 		resultBuf.WriteString("}")
 
-		resultData := resultBuf.Bytes()
-		resultSize := uint64(len(resultData)) + 32 /* for framing overhead */
-		if server.SizeLimit > 0 && resultSize >= server.SizeLimit {
-			// The NIST ACVP server no longer requires the large-upload process,
-			// suggesting that it may no longer be needed.
-			log.Printf("Result is %d bytes, too much given server limit of %d bytes. Using large-upload process.", resultSize, server.SizeLimit)
-			largeRequestBytes, err := json.Marshal(acvp.LargeUploadRequest{
-				Size: resultSize,
-				URL:  setURL,
-			})
-			if err != nil {
-				log.Printf("Failed to marshal large-upload request: %s", err)
-				log.Printf("Deleting test set")
-				server.Delete(url)
-				os.Exit(1)
-			}
-
-			var largeResponse acvp.LargeUploadResponse
-			if err := server.Post(&largeResponse, "/large", largeRequestBytes); err != nil {
-				log.Fatalf("Failed to request large-upload endpoint: %s", err)
-			}
-
-			log.Printf("Directed to large-upload endpoint at %q", largeResponse.URL)
-			client := &http.Client{}
-			req, err := http.NewRequest("POST", largeResponse.URL, bytes.NewBuffer(resultData))
-			if err != nil {
-				log.Fatalf("Failed to create POST request: %s", err)
-			}
-			token := largeResponse.AccessToken
-			if len(token) == 0 {
-				token = server.AccessToken
-			}
-			req.Header.Add("Authorization", "Bearer "+token)
-			req.Header.Add("Content-Type", "application/json")
-			resp, err := client.Do(req)
-			if err != nil {
-				log.Fatalf("Failed writing large upload: %s", err)
-			}
-			resp.Body.Close()
-			if resp.StatusCode != 200 {
-				log.Fatalf("Large upload resulted in status code %d", resp.StatusCode)
-			}
-		} else {
-			log.Printf("Result size %d bytes", resultSize)
-			if err := server.Post(nil, trimLeadingSlash(setURL)+"/results", resultData); err != nil {
-				log.Fatalf("Failed to upload results: %s\n", err)
-			}
+		if err := uploadResult(server, setURL, resultBuf.Bytes()); err != nil {
+			log.Printf("Deleting test set")
+			server.Delete(url)
+			log.Fatal(err)
 		}
 	}