2018-10-09 21:35:33 +00:00
|
|
|
// Copyright 2018 clair authors
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
// Package featurefmt contains utility functions for featurefmt tests
|
|
|
|
package featurefmt
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io/ioutil"
|
|
|
|
"path/filepath"
|
|
|
|
"runtime"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
|
|
|
"github.com/coreos/clair/database"
|
|
|
|
"github.com/coreos/clair/pkg/tarutil"
|
|
|
|
)
|
|
|
|
|
|
|
|
// LoadFileForTest can be used in order to obtain the []byte contents of a file
|
|
|
|
// that is meant to be used for test data.
|
|
|
|
func LoadFileForTest(name string) []byte {
|
|
|
|
_, filename, _, _ := runtime.Caller(0)
|
|
|
|
path := filepath.Join(filepath.Dir(filename), name)
|
|
|
|
d, err := ioutil.ReadFile(path)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return d
|
|
|
|
}
|
|
|
|
|
|
|
|
func loadTestFiles(testFilePaths map[string]string) tarutil.FilesMap {
|
|
|
|
m := tarutil.FilesMap{}
|
|
|
|
for tarPath, fsPath := range testFilePaths {
|
|
|
|
m[tarPath] = LoadFileForTest(fsPath)
|
|
|
|
}
|
|
|
|
|
|
|
|
return m
|
|
|
|
}
|
|
|
|
|
|
|
|
// TestCase is used by the RunTest function to execute.
|
|
|
|
type TestCase struct {
|
|
|
|
Name string
|
|
|
|
FilePaths map[string]string
|
2018-10-15 20:26:24 +00:00
|
|
|
ExpectedResult []database.Feature
|
2018-10-09 21:35:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// RunTest runs a featurefmt test by loading the package info database files and
|
|
|
|
// the expected packages.
|
|
|
|
func RunTest(t *testing.T, test TestCase, lister Lister, expectedVersionFormat string) {
|
|
|
|
t.Run(test.Name, func(t *testing.T) {
|
|
|
|
filesMap := loadTestFiles(test.FilePaths)
|
|
|
|
expected := test.ExpectedResult
|
|
|
|
features, err := lister.ListFeatures(filesMap)
|
|
|
|
require.Nil(t, err)
|
2018-10-15 20:26:24 +00:00
|
|
|
visited := map[database.Feature]bool{}
|
2018-10-09 21:35:33 +00:00
|
|
|
// we only enforce the unique packages to match, the result features
|
|
|
|
// should be always deduplicated.
|
|
|
|
for _, pkg := range expected {
|
|
|
|
visited[pkg] = false
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.Len(t, features, len(visited))
|
|
|
|
for _, f := range features {
|
|
|
|
assert.Equal(t, expectedVersionFormat, f.VersionFormat)
|
2018-10-15 20:26:24 +00:00
|
|
|
if ok, found := visited[f]; ok {
|
|
|
|
assert.Fail(t, "duplicated features is not allowed", "feature=%#v", f)
|
2018-10-09 21:35:33 +00:00
|
|
|
} else if !found {
|
2018-10-15 20:26:24 +00:00
|
|
|
assert.Fail(t, "unexpected feature", "feature = %#v", f)
|
2018-10-09 21:35:33 +00:00
|
|
|
}
|
|
|
|
|
2018-10-15 20:26:24 +00:00
|
|
|
visited[f] = true
|
2018-10-09 21:35:33 +00:00
|
|
|
}
|
|
|
|
|
2018-10-15 20:26:24 +00:00
|
|
|
missingPackages := []database.Feature{}
|
2018-10-09 21:35:33 +00:00
|
|
|
for pkg, ok := range visited {
|
|
|
|
if !ok {
|
|
|
|
missingPackages = append(missingPackages, pkg)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.Len(t, missingPackages, 0, "missing packages")
|
|
|
|
})
|
|
|
|
}
|