142 lines
3.5 KiB
Go
142 lines
3.5 KiB
Go
// Copyright 2019 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 ancestry
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/coreos/clair/database"
|
|
"github.com/coreos/clair/database/pgsql/testutil"
|
|
)
|
|
|
|
var upsertAncestryTests = []struct {
|
|
in *database.Ancestry
|
|
err string
|
|
title string
|
|
}{
|
|
{
|
|
title: "ancestry with invalid layer",
|
|
in: &database.Ancestry{
|
|
Name: "a1",
|
|
Layers: []database.AncestryLayer{
|
|
{
|
|
Hash: "layer-non-existing",
|
|
},
|
|
},
|
|
},
|
|
err: database.ErrMissingEntities.Error(),
|
|
},
|
|
{
|
|
title: "ancestry with invalid name",
|
|
in: &database.Ancestry{},
|
|
err: database.ErrInvalidParameters.Error(),
|
|
},
|
|
{
|
|
title: "new valid ancestry",
|
|
in: &database.Ancestry{
|
|
Name: "a",
|
|
Layers: []database.AncestryLayer{{Hash: "layer-0"}},
|
|
},
|
|
},
|
|
{
|
|
title: "ancestry with invalid feature",
|
|
in: &database.Ancestry{
|
|
Name: "a",
|
|
By: []database.Detector{testutil.RealDetectors[1], testutil.RealDetectors[2]},
|
|
Layers: []database.AncestryLayer{{Hash: "layer-1", Features: []database.AncestryFeature{
|
|
{testutil.FakeNamespacedFeatures[1], testutil.FakeDetector[1], testutil.FakeDetector[2]},
|
|
}}},
|
|
},
|
|
err: database.ErrMissingEntities.Error(),
|
|
},
|
|
{
|
|
title: "replace old ancestry",
|
|
in: &database.Ancestry{
|
|
Name: "a",
|
|
By: []database.Detector{testutil.RealDetectors[1], testutil.RealDetectors[2]},
|
|
Layers: []database.AncestryLayer{
|
|
{"layer-1", []database.AncestryFeature{{testutil.RealNamespacedFeatures[1], testutil.RealDetectors[2], testutil.RealDetectors[1]}}},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
func TestUpsertAncestry(t *testing.T) {
|
|
tx, cleanup := testutil.CreateTestTxWithFixtures(t, "TestUpsertAncestry")
|
|
defer cleanup()
|
|
|
|
for _, test := range upsertAncestryTests {
|
|
t.Run(test.title, func(t *testing.T) {
|
|
err := UpsertAncestry(tx, *test.in)
|
|
if test.err != "" {
|
|
assert.EqualError(t, err, test.err, "unexpected error")
|
|
return
|
|
}
|
|
assert.Nil(t, err)
|
|
actual, ok, err := FindAncestry(tx, test.in.Name)
|
|
assert.Nil(t, err)
|
|
assert.True(t, ok)
|
|
database.AssertAncestryEqual(t, test.in, &actual)
|
|
})
|
|
}
|
|
}
|
|
|
|
var findAncestryTests = []struct {
|
|
title string
|
|
in string
|
|
|
|
ancestry *database.Ancestry
|
|
err string
|
|
ok bool
|
|
}{
|
|
{
|
|
title: "missing ancestry",
|
|
in: "ancestry-non",
|
|
err: "",
|
|
ancestry: nil,
|
|
ok: false,
|
|
},
|
|
{
|
|
title: "valid ancestry",
|
|
in: "ancestry-2",
|
|
err: "",
|
|
ok: true,
|
|
ancestry: testutil.TakeAncestryPointerFromMap(testutil.RealAncestries, 2),
|
|
},
|
|
}
|
|
|
|
func TestFindAncestry(t *testing.T) {
|
|
tx, cleanup := testutil.CreateTestTxWithFixtures(t, "TestFindAncestry")
|
|
defer cleanup()
|
|
|
|
for _, test := range findAncestryTests {
|
|
t.Run(test.title, func(t *testing.T) {
|
|
ancestry, ok, err := FindAncestry(tx, test.in)
|
|
if test.err != "" {
|
|
assert.EqualError(t, err, test.err, "unexpected error")
|
|
return
|
|
}
|
|
|
|
assert.Nil(t, err)
|
|
assert.Equal(t, test.ok, ok)
|
|
if test.ok {
|
|
database.AssertAncestryEqual(t, test.ancestry, &ancestry)
|
|
}
|
|
})
|
|
}
|
|
}
|