package alpine import ( "archive/tar" "bytes" "compress/gzip" "fmt" "testing" ) func apkindexTarGz(entries [][2]string) []byte { var buf bytes.Buffer gz := gzip.NewWriter(&buf) tw := tar.NewWriter(gz) sig := []byte("not a real signature") tw.WriteHeader(&tar.Header{Name: ".SIGN.RSA.alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub", Mode: 0o644, Size: int64(len(sig))}) tw.Write(sig) tw.Flush() // no Close: apk's signature segment has no trailer gz.Close() var idx bytes.Buffer for _, e := range entries { fmt.Fprintf(&idx, "C:Q1x=\nP:%s\nV:1.0-r0\nA:x86_64\nU:https://example.org/\n", e[0]) if e[1] != "" { fmt.Fprintf(&idx, "o:%s\n", e[1]) } idx.WriteString("t:1\n\n") } gz = gzip.NewWriter(&buf) tw = tar.NewWriter(gz) desc := []byte("alpine-edge-main") tw.WriteHeader(&tar.Header{Name: "DESCRIPTION", Mode: 0o644, Size: int64(len(desc))}) tw.Write(desc) tw.WriteHeader(&tar.Header{Name: "APKINDEX", Mode: 0o644, Size: int64(idx.Len())}) tw.Write(idx.Bytes()) tw.Close() gz.Close() return buf.Bytes() } func TestParseAPKINDEX(t *testing.T) { entries, err := ParseAPKINDEX(apkindexTarGz([][2]string{{"curl", "curl"}, {"libcurl", "curl"}})) if err != nil { t.Fatal(err) } if len(entries) != 2 || entries[1].Name != "libcurl" || entries[1].Origin != "curl" || entries[1].Version != "1.0-r0" || entries[1].URL != "https://example.org/" { t.Errorf("entries = %+v", entries) } if _, err := ParseAPKINDEX([]byte("not gzip")); err == nil { t.Error("garbage should fail") } }