Add test for potential namespace

Test verifies that potential namespace is stored in database and it can
be loaded back to structure.

The commit also fixes few typos and bugs.
master
Ales Raszka 5 years ago
parent 60b0bd27fa
commit a8a91379d9

@ -60,7 +60,7 @@ func ConvertFeatureSetToFeatures(features mapset.Set) []Feature {
return uniqueFeatures return uniqueFeatures
} }
func ConvertFeatureSerToLayerFeatures(features mapset.Set) []LayerFeature { func ConvertFeatureSetToLayerFeatures(features mapset.Set) []LayerFeature {
uniqueLayerFeatures := make([]LayerFeature, 0, features.Cardinality()) uniqueLayerFeatures := make([]LayerFeature, 0, features.Cardinality())
for f := range features.Iter() { for f := range features.Iter() {
feature := f.(Feature) feature := f.(Feature)

@ -37,12 +37,15 @@ const (
SELECT id FROM layer WHERE hash = $1` SELECT id FROM layer WHERE hash = $1`
findLayerFeatures = ` findLayerFeatures = `
SELECT f.name, f.version, f.version_format, t.name, lf.detector_id, ns.name, ns.version_format SELECT
FROM layer_feature AS lf, feature AS f, feature_type AS t, namespace AS ns f.name, f.version, f.version_format, ft.name, lf.detector_id, ns.name, ns.version_format
WHERE lf.feature_id = f.id FROM
AND t.id = f.type layer_feature AS lf
AND lf.namespace_id = ns.id LEFT JOIN feature f on f.id = lf.feature_id
AND lf.layer_id = $1` LEFT JOIN feature_type ft on ft.id = f.type
LEFT JOIN namespace ns ON ns.id = lf.namespace_id
WHERE lf.layer_id = $1`
findLayerNamespaces = ` findLayerNamespaces = `
SELECT ns.name, ns.version_format, ln.detector_id SELECT ns.name, ns.version_format, ln.detector_id
@ -320,9 +323,12 @@ func (tx *pgSession) findLayerFeatures(layerID int64, detectors detectorMap) ([]
detectorID int64 detectorID int64
feature database.LayerFeature feature database.LayerFeature
) )
if err := rows.Scan(&feature.Name, &feature.Version, &feature.VersionFormat, &feature.Type, &detectorID, &feature.PotentialNamespace.Name, &feature.PotentialNamespace.VersionFormat); err != nil { var namespaceName, namespaceVersion sql.NullString
if err := rows.Scan(&feature.Name, &feature.Version, &feature.VersionFormat, &feature.Type, &detectorID, &namespaceName, &namespaceVersion); err != nil {
return nil, handleError("findLayerFeatures", err) return nil, handleError("findLayerFeatures", err)
} }
feature.PotentialNamespace.Name = namespaceName.String
feature.PotentialNamespace.VersionFormat = namespaceVersion.String
feature.By = detectors.byID[detectorID] feature.By = detectors.byID[detectorID]
features = append(features, feature) features = append(features, feature)

@ -116,6 +116,28 @@ var persistLayerTests = []struct {
}, },
}, },
}, },
{
title: "layer with potential namespace",
name: "layer-potential-namespace",
by: []database.Detector{realDetectors[3]},
features: []database.LayerFeature{
{realFeatures[4], realDetectors[3], realNamespaces[4]},
},
namespaces: []database.LayerNamespace{
{realNamespaces[3], realDetectors[3]},
},
layer: &database.Layer{
Hash: "layer-potential-namespace",
By: []database.Detector{realDetectors[3]},
Features: []database.LayerFeature{
{realFeatures[4], realDetectors[3], realNamespaces[4]},
},
Namespaces: []database.LayerNamespace{
{realNamespaces[3], realDetectors[3]},
},
},
},
} }
func TestPersistLayer(t *testing.T) { func TestPersistLayer(t *testing.T) {

@ -89,7 +89,7 @@ var (
layer_id INT REFERENCES layer ON DELETE CASCADE, layer_id INT REFERENCES layer ON DELETE CASCADE,
feature_id INT REFERENCES feature ON DELETE CASCADE, feature_id INT REFERENCES feature ON DELETE CASCADE,
detector_id INT REFERENCES detector ON DELETE CASCADE, detector_id INT REFERENCES detector ON DELETE CASCADE,
namespace_id INT REFERENCES namespace ON DELETE CASCADE, namespace_id INT NULL REFERENCES namespace ON DELETE CASCADE,
UNIQUE (layer_id, feature_id, namespace_id));`, UNIQUE (layer_id, feature_id, namespace_id));`,
`CREATE INDEX ON layer_feature(layer_id);`, `CREATE INDEX ON layer_feature(layer_id);`,

@ -2,7 +2,8 @@
INSERT INTO namespace (id, name, version_format) VALUES INSERT INTO namespace (id, name, version_format) VALUES
(1, 'debian:7', 'dpkg'), (1, 'debian:7', 'dpkg'),
(2, 'debian:8', 'dpkg'), (2, 'debian:8', 'dpkg'),
(3, 'fake:1.0', 'rpm'); (3, 'fake:1.0', 'rpm'),
(4, 'cpe:/o:redhat:enterprise_linux:7::server', 'rpm');
INSERT INTO feature (id, name, version, version_format, type) VALUES INSERT INTO feature (id, name, version, version_format, type) VALUES
(1, 'ourchat', '0.5', 'dpkg', 1), (1, 'ourchat', '0.5', 'dpkg', 1),

@ -49,6 +49,7 @@ var (
1: {"debian:7", "dpkg"}, 1: {"debian:7", "dpkg"},
2: {"debian:8", "dpkg"}, 2: {"debian:8", "dpkg"},
3: {"fake:1.0", "rpm"}, 3: {"fake:1.0", "rpm"},
4: {"cpe:/o:redhat:enterprise_linux:7::server", "rpm"},
} }
realNamespacedFeatures = map[int]database.NamespacedFeature{ realNamespacedFeatures = map[int]database.NamespacedFeature{

@ -86,7 +86,7 @@ func (l lister) ListFeatures(files tarutil.FilesMap) ([]database.LayerFeature, e
packages.Add(pkg) packages.Add(pkg)
} }
return database.ConvertFeatureSerToLayerFeatures(packages), nil return database.ConvertFeatureSetToLayerFeatures(packages), nil
} }
func (l lister) RequiredFilenames() []string { func (l lister) RequiredFilenames() []string {

@ -69,7 +69,7 @@ func (l lister) ListFeatures(files tarutil.FilesMap) ([]database.LayerFeature, e
} }
} }
return database.ConvertFeatureSerToLayerFeatures(packages), nil return database.ConvertFeatureSetToLayerFeatures(packages), nil
} }
// parseDpkgDB consumes the status file scanner exactly one package info, until // parseDpkgDB consumes the status file scanner exactly one package info, until

@ -101,7 +101,7 @@ func (l lister) ListFeatures(files tarutil.FilesMap) ([]database.LayerFeature, e
} }
} }
return database.ConvertFeatureSerToLayerFeatures(packages), nil return database.ConvertFeatureSetToLayerFeatures(packages), nil
} }
func parseRPMOutput(raw string) (rpmPackage *database.Feature, srpmPackage *database.Feature) { func parseRPMOutput(raw string) (rpmPackage *database.Feature, srpmPackage *database.Feature) {

Loading…
Cancel
Save