128 lines
3.3 KiB
Go
128 lines
3.3 KiB
Go
package app
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"net/url"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestValidRegistrySegment(t *testing.T) {
|
|
t.Parallel()
|
|
valid := []string{"sentinelone-linux", "26.2.0.10", "agent_x86_64+release.deb"}
|
|
for _, value := range valid {
|
|
if !validRegistrySegment(value, 255) {
|
|
t.Errorf("expected %q to be valid", value)
|
|
}
|
|
}
|
|
invalid := []string{"", "../agent.deb", "agent/name.deb", "agent name.deb"}
|
|
for _, value := range invalid {
|
|
if validRegistrySegment(value, 255) {
|
|
t.Errorf("expected %q to be invalid", value)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestStreamPackageToGitea(t *testing.T) {
|
|
t.Parallel()
|
|
content := "test package content"
|
|
registry := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodPut {
|
|
t.Errorf("method = %s, want PUT", r.Method)
|
|
}
|
|
if r.URL.Path != "/api/packages/TAI/generic/sentinelone-linux/26.2.0.10/agent.deb" {
|
|
t.Errorf("path = %s", r.URL.Path)
|
|
}
|
|
username, password, ok := r.BasicAuth()
|
|
if !ok || username != "publisher" || password != "write-token" {
|
|
t.Errorf("unexpected registry credentials")
|
|
}
|
|
body, err := io.ReadAll(r.Body)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if string(body) != content {
|
|
t.Errorf("body = %q", body)
|
|
}
|
|
w.WriteHeader(http.StatusCreated)
|
|
}))
|
|
defer registry.Close()
|
|
|
|
registryURL, err := url.Parse(registry.URL)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
server := &Server{
|
|
cfg: Config{
|
|
GiteaURL: registryURL,
|
|
GiteaInternalURL: registryURL,
|
|
GiteaPackageOwner: "TAI",
|
|
GiteaWriteUser: "publisher",
|
|
GiteaWriteToken: "write-token",
|
|
},
|
|
packageClient: registry.Client(),
|
|
}
|
|
request := httptest.NewRequest(http.MethodPost, "/portal/packages/upload", nil)
|
|
checksum, size, status, err := server.streamPackageToGitea(
|
|
request,
|
|
"sentinelone-linux",
|
|
"26.2.0.10",
|
|
"agent.deb",
|
|
strings.NewReader(content),
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
expected := sha256.Sum256([]byte(content))
|
|
if checksum != hex.EncodeToString(expected[:]) {
|
|
t.Errorf("checksum = %s", checksum)
|
|
}
|
|
if size != int64(len(content)) {
|
|
t.Errorf("size = %d", size)
|
|
}
|
|
if status != http.StatusCreated {
|
|
t.Errorf("status = %d", status)
|
|
}
|
|
}
|
|
|
|
func TestDeletePackageVersion(t *testing.T) {
|
|
t.Parallel()
|
|
registry := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodDelete {
|
|
t.Errorf("method = %s, want DELETE", r.Method)
|
|
}
|
|
if r.URL.Path != "/api/packages/TAI/generic/sentinelone-linux/26.1.1.31" {
|
|
t.Errorf("path = %s", r.URL.Path)
|
|
}
|
|
username, password, ok := r.BasicAuth()
|
|
if !ok || username != "publisher" || password != "write-token" {
|
|
t.Errorf("unexpected registry credentials")
|
|
}
|
|
w.WriteHeader(http.StatusNoContent)
|
|
}))
|
|
defer registry.Close()
|
|
|
|
registryURL, err := url.Parse(registry.URL)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
server := &Server{
|
|
cfg: Config{
|
|
GiteaURL: registryURL,
|
|
GiteaInternalURL: registryURL,
|
|
GiteaPackageOwner: "TAI",
|
|
GiteaWriteUser: "publisher",
|
|
GiteaWriteToken: "write-token",
|
|
},
|
|
packageClient: registry.Client(),
|
|
}
|
|
request := httptest.NewRequest(http.MethodPost, "/portal/packages/upload", nil)
|
|
if err := server.deletePackageVersion(request, "sentinelone-linux", "26.1.1.31"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|