// Copyright 2017 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 pgsql import ( "testing" "github.com/stretchr/testify/assert" "github.com/coreos/clair/database" ) func TestPersistLayer(t *testing.T) { datastore, tx := openSessionForTest(t, "PersistLayer", false) defer closeTest(t, datastore, tx) l1 := "" l2 := "HESOYAM" // invalid assert.NotNil(t, tx.PersistLayer(l1)) // valid assert.Nil(t, tx.PersistLayer(l2)) // duplicated assert.Nil(t, tx.PersistLayer(l2)) } func TestPersistLayerProcessors(t *testing.T) { datastore, tx := openSessionForTest(t, "PersistLayerProcessors", true) defer closeTest(t, datastore, tx) // invalid assert.NotNil(t, tx.PersistLayerContent("hash", []database.Namespace{}, []database.Feature{}, database.Processors{})) // valid assert.Nil(t, tx.PersistLayerContent("layer-4", []database.Namespace{}, []database.Feature{}, database.Processors{Detectors: []string{"new detector!"}})) } func TestFindLayer(t *testing.T) { datastore, tx := openSessionForTest(t, "FindLayer", true) defer closeTest(t, datastore, tx) expected := database.Layer{ Hash: "layer-4", ProcessedBy: database.Processors{ Detectors: []string{"os-release", "apt-sources"}, Listers: []string{"dpkg", "rpm"}, }, } // invalid _, _, err := tx.FindLayer("") assert.NotNil(t, err) _, ok, err := tx.FindLayer("layer-non") assert.Nil(t, err) assert.False(t, ok) // valid layer, ok2, err := tx.FindLayer("layer-4") if assert.Nil(t, err) && assert.True(t, ok2) { assertLayerEqual(t, expected, layer) } } func TestFindLayerWithContent(t *testing.T) { datastore, tx := openSessionForTest(t, "FindLayerWithContent", true) defer closeTest(t, datastore, tx) _, _, err := tx.FindLayerWithContent("") assert.NotNil(t, err) _, ok, err := tx.FindLayerWithContent("layer-non") assert.Nil(t, err) assert.False(t, ok) expectedL := database.LayerWithContent{ Layer: database.Layer{ Hash: "layer-4", ProcessedBy: database.Processors{ Detectors: []string{"os-release", "apt-sources"}, Listers: []string{"dpkg", "rpm"}, }, }, Features: []database.Feature{ {Name: "fake", Version: "2.0", VersionFormat: "rpm"}, {Name: "openssl", Version: "2.0", VersionFormat: "dpkg"}, }, Namespaces: []database.Namespace{ {Name: "debian:7", VersionFormat: "dpkg"}, {Name: "fake:1.0", VersionFormat: "rpm"}, }, } layer, ok2, err := tx.FindLayerWithContent("layer-4") if assert.Nil(t, err) && assert.True(t, ok2) { assertLayerWithContentEqual(t, expectedL, layer) } } func assertLayerWithContentEqual(t *testing.T, expected database.LayerWithContent, actual database.LayerWithContent) bool { return assertLayerEqual(t, expected.Layer, actual.Layer) && assertFeaturesEqual(t, expected.Features, actual.Features) && assertNamespacesEqual(t, expected.Namespaces, actual.Namespaces) } func assertLayerEqual(t *testing.T, expected database.Layer, actual database.Layer) bool { return assertProcessorsEqual(t, expected.ProcessedBy, actual.ProcessedBy) && assert.Equal(t, expected.Hash, actual.Hash) }