mirror of
https://github.com/gocsaf/csaf.git
synced 2025-12-22 18:15:42 +01:00
Extend links test
This commit is contained in:
parent
3ba29f94de
commit
8e4e508073
3 changed files with 316 additions and 1 deletions
67
cmd/csaf_aggregator/client_test.go
Normal file
67
cmd/csaf_aggregator/client_test.go
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
// This file is Free Software under the MIT License
|
||||||
|
// without warranty, see README.md and LICENSES/MIT.txt for details.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
//
|
||||||
|
// SPDX-FileCopyrightText: 2022 German Federal Office for Information Security (BSI) <https://www.bsi.bund.de>
|
||||||
|
// Software-Engineering: 2022 Intevation GmbH <https://intevation.de>
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/csaf-poc/csaf_distribution/v3/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_downloadJSON(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
statusCode int
|
||||||
|
contentType string
|
||||||
|
wantErr error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "status ok, application/json",
|
||||||
|
statusCode: http.StatusOK,
|
||||||
|
contentType: "application/json",
|
||||||
|
wantErr: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "status found, application/json",
|
||||||
|
statusCode: http.StatusFound,
|
||||||
|
contentType: "application/json",
|
||||||
|
wantErr: errNotFound,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "status ok, application/xml",
|
||||||
|
statusCode: http.StatusOK,
|
||||||
|
contentType: "application/xml",
|
||||||
|
wantErr: errNotFound,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Parallel()
|
||||||
|
for _, testToRun := range tests {
|
||||||
|
test := testToRun
|
||||||
|
t.Run(test.name, func(tt *testing.T) {
|
||||||
|
tt.Parallel()
|
||||||
|
found := func(r io.Reader) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Add("Content-Type", test.contentType)
|
||||||
|
w.WriteHeader(test.statusCode)
|
||||||
|
}))
|
||||||
|
defer server.Close()
|
||||||
|
hClient := http.Client{}
|
||||||
|
client := util.Client(&hClient)
|
||||||
|
if gotErr := downloadJSON(client, server.URL, found); gotErr != test.wantErr {
|
||||||
|
t.Errorf("downloadJSON: Expected %q but got %q.", test.wantErr, gotErr)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -10,8 +10,12 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/csaf-poc/csaf_distribution/v3/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
const page0 = `<html>
|
const page0 = `<html>
|
||||||
|
|
@ -31,7 +35,6 @@ const page0 = `<html>
|
||||||
</html>`
|
</html>`
|
||||||
|
|
||||||
func TestLinksOnPage(t *testing.T) {
|
func TestLinksOnPage(t *testing.T) {
|
||||||
|
|
||||||
var links []string
|
var links []string
|
||||||
|
|
||||||
err := linksOnPage(
|
err := linksOnPage(
|
||||||
|
|
@ -58,3 +61,78 @@ func TestLinksOnPage(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_listed(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
badDirs util.Set[string]
|
||||||
|
path string
|
||||||
|
want bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "listed path",
|
||||||
|
badDirs: util.Set[string]{},
|
||||||
|
path: "/white/avendor-advisory-0004.json",
|
||||||
|
want: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "badDirs contains path",
|
||||||
|
badDirs: util.Set[string]{"/white/": {}},
|
||||||
|
path: "/white/avendor-advisory-0004.json",
|
||||||
|
want: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "not found",
|
||||||
|
badDirs: util.Set[string]{},
|
||||||
|
path: "/not-found/resource.json",
|
||||||
|
want: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "badDirs does not contain path",
|
||||||
|
badDirs: util.Set[string]{"/bad-dir/": {}},
|
||||||
|
path: "/white/avendor-advisory-0004.json",
|
||||||
|
want: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "unlisted path",
|
||||||
|
badDirs: util.Set[string]{},
|
||||||
|
path: "/white/avendor-advisory-0004-not-listed.json",
|
||||||
|
want: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Parallel()
|
||||||
|
for _, testToRun := range tests {
|
||||||
|
test := testToRun
|
||||||
|
t.Run(test.name, func(tt *testing.T) {
|
||||||
|
tt.Parallel()
|
||||||
|
serverURL := ""
|
||||||
|
fs := http.FileServer(http.Dir("../../testdata/simple-directory-feed"))
|
||||||
|
server := httptest.NewTLSServer(fs)
|
||||||
|
defer server.Close()
|
||||||
|
|
||||||
|
serverURL = server.URL
|
||||||
|
|
||||||
|
hClient := server.Client()
|
||||||
|
client := util.Client(hClient)
|
||||||
|
|
||||||
|
pgs := pages{}
|
||||||
|
cfg := config{RemoteValidator: "", RemoteValidatorCache: ""}
|
||||||
|
p, err := newProcessor(&cfg)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
p.client = client
|
||||||
|
|
||||||
|
badDirs := util.Set[string]{}
|
||||||
|
for dir := range test.badDirs {
|
||||||
|
badDirs.Add(serverURL + dir)
|
||||||
|
}
|
||||||
|
|
||||||
|
got, _ := pgs.listed(serverURL+test.path, p, badDirs)
|
||||||
|
if got != test.want {
|
||||||
|
t.Errorf("%q: Expected %t but got %t.", test.name, test.want, got)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
170
testdata/simple-directory-feed/white/avendor-advisory-0004-not-listed.json
vendored
Normal file
170
testdata/simple-directory-feed/white/avendor-advisory-0004-not-listed.json
vendored
Normal file
|
|
@ -0,0 +1,170 @@
|
||||||
|
{
|
||||||
|
"document": {
|
||||||
|
"category": "csaf_vex",
|
||||||
|
"csaf_version": "2.0",
|
||||||
|
"distribution": {
|
||||||
|
"tlp": {
|
||||||
|
"label": "WHITE",
|
||||||
|
"url": "https://www.first.org/tlp/v1/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"category": "summary",
|
||||||
|
"title": "Test document summary",
|
||||||
|
"text": "Auto generated test CSAF document"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"publisher": {
|
||||||
|
"category": "vendor",
|
||||||
|
"name": "ACME Inc.",
|
||||||
|
"namespace": "https://www.example.com"
|
||||||
|
},
|
||||||
|
"title": "Test CSAF document",
|
||||||
|
"tracking": {
|
||||||
|
"current_release_date": "2020-00-00T00:00:00Z",
|
||||||
|
"generator": {
|
||||||
|
"date": "2020-00-00T00:00:00Z",
|
||||||
|
"engine": {
|
||||||
|
"name": "csaf-tool",
|
||||||
|
"version": "0.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"id": "Avendor-advisory-0004",
|
||||||
|
"initial_release_date": "2020-00-00T00:00:00Z",
|
||||||
|
"revision_history": [
|
||||||
|
{
|
||||||
|
"date": "2020-00-00T00:00:00Z",
|
||||||
|
"number": "1",
|
||||||
|
"summary": "Initial version"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"status": "final",
|
||||||
|
"version": "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"product_tree": {
|
||||||
|
"branches": [
|
||||||
|
{
|
||||||
|
"category": "vendor",
|
||||||
|
"name": "AVendor",
|
||||||
|
"branches": [
|
||||||
|
{
|
||||||
|
"category": "product_name",
|
||||||
|
"name": "product_1",
|
||||||
|
"branches": [
|
||||||
|
{
|
||||||
|
"category": "product_version",
|
||||||
|
"name": "1.1",
|
||||||
|
"product": {
|
||||||
|
"name": "AVendor product_1 1.1",
|
||||||
|
"product_id": "CSAFPID_0001"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "product_version",
|
||||||
|
"name": "1.2",
|
||||||
|
"product": {
|
||||||
|
"name": "AVendor product_1 1.2",
|
||||||
|
"product_id": "CSAFPID_0002"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "product_version",
|
||||||
|
"name": "2.0",
|
||||||
|
"product": {
|
||||||
|
"name": "AVendor product_1 2.0",
|
||||||
|
"product_id": "CSAFPID_0003"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "vendor",
|
||||||
|
"name": "AVendor1",
|
||||||
|
"branches": [
|
||||||
|
{
|
||||||
|
"category": "product_name",
|
||||||
|
"name": "product_2",
|
||||||
|
"branches": [
|
||||||
|
{
|
||||||
|
"category": "product_version",
|
||||||
|
"name": "1",
|
||||||
|
"product": {
|
||||||
|
"name": "AVendor1 product_2 1",
|
||||||
|
"product_id": "CSAFPID_0004"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"category": "vendor",
|
||||||
|
"name": "AVendor",
|
||||||
|
"branches": [
|
||||||
|
{
|
||||||
|
"category": "product_name",
|
||||||
|
"name": "product_3",
|
||||||
|
"branches": [
|
||||||
|
{
|
||||||
|
"category": "product_version",
|
||||||
|
"name": "2022H2",
|
||||||
|
"product": {
|
||||||
|
"name": "AVendor product_3 2022H2",
|
||||||
|
"product_id": "CSAFPID_0005"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"vulnerabilities": [
|
||||||
|
{
|
||||||
|
"cve": "CVE-2020-1234",
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"category": "description",
|
||||||
|
"title": "CVE description",
|
||||||
|
"text": "https://nvd.nist.gov/vuln/detail/CVE-2020-1234"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"product_status": {
|
||||||
|
"under_investigation": ["CSAFPID_0001"]
|
||||||
|
},
|
||||||
|
"threats": [
|
||||||
|
{
|
||||||
|
"category": "impact",
|
||||||
|
"details": "Customers should upgrade to the latest version of the product",
|
||||||
|
"date": "2020-00-00T00:00:00Z",
|
||||||
|
"product_ids": ["CSAFPID_0001"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cve": "CVE-2020-9876",
|
||||||
|
"notes": [
|
||||||
|
{
|
||||||
|
"category": "description",
|
||||||
|
"title": "CVE description",
|
||||||
|
"text": "https://nvd.nist.gov/vuln/detail/CVE-2020-9876"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"product_status": {
|
||||||
|
"under_investigation": ["CSAFPID_0001"]
|
||||||
|
},
|
||||||
|
"threats": [
|
||||||
|
{
|
||||||
|
"category": "impact",
|
||||||
|
"details": "Still under investigation",
|
||||||
|
"date": "2020-00-00T00:00:00Z",
|
||||||
|
"product_ids": ["CSAFPID_0001"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue