Skip to content

Commit 86f7753

Browse files
authored
feat(tests): Adds override for package version (#849)
Adds a "override_versions_file" option for EXPECT_PHP_PACKAGE that allows specifying overrides for given expected versions detected. This is useful for when a package did not modify the internal data structure used to by the agent to detect its version, causing the package test to fail. The override file should be in the same directory as the test_php_package.php test and is a JSON file implementing a simple dictionary like: { "4.13.0": "4.12.0" } In this case this specifies if the packge version "4.13.0" is detected then override this expectation with the version "4.12.0". In this example the upstream package bumped up to 4.13.0 but did not change the internal version variable so the agent still detects it as 4.12.0.
1 parent b033a3d commit 86f7753

File tree

2 files changed

+87
-11
lines changed

2 files changed

+87
-11
lines changed

daemon/internal/newrelic/integration/php_packages.go

+67-10
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,12 @@ type PhpPackagesCollection struct {
3131
// PHP packages config describes how to collect the JSON for the packages installed
3232
// for the current test case
3333
type PhpPackagesConfiguration struct {
34-
path string
35-
command string
36-
supportedListFile string
37-
expectedPackages []string
38-
packageNameOnly []string
34+
path string
35+
command string
36+
supportedListFile string
37+
overrideVersionsFile string
38+
expectedPackages []string
39+
packageNameOnly []string
3940
}
4041

4142
// composer package JSON
@@ -135,6 +136,7 @@ func NewPhpPackagesCollection(path string, config []byte) (*PhpPackagesCollectio
135136
var supportedListFile string
136137
var expectedPackages string
137138
var packageNameOnly string
139+
var overrideVersionsFile string
138140
var expectedPackagesArr []string
139141
var packageNameOnlyArr []string
140142
var commandOK, supportedOK, expectedOK bool
@@ -177,13 +179,36 @@ func NewPhpPackagesCollection(path string, config []byte) (*PhpPackagesCollectio
177179
}
178180
}
179181

182+
// option file containing overrides for expected package versions
183+
// this is useful when a package is detected as the wrong version
184+
// because the internal mechanism the agent uses to get pacakge
185+
// versions was not updated by the upstream maintainers properly
186+
// on a release.
187+
//
188+
// this is a JSON file of the format
189+
// {
190+
// "<expected>": "<override",
191+
// ...
192+
// }
193+
//
194+
// such as:
195+
// {
196+
// "4.13.0": "4.12.0",
197+
// "3.4.5": "3.4.4"
198+
// }
199+
//
200+
// which creates overrides to version "4.13.0" to change its expecation to "4.12.0"
201+
// and "3.4.5" to be changed to an expectation of "3.4.4"
202+
overrideVersionsFile, ok = params["override_versions_file"]
203+
180204
p := &PhpPackagesCollection{
181205
config: PhpPackagesConfiguration{
182-
command: command,
183-
path: path,
184-
supportedListFile: supportedListFile,
185-
expectedPackages: expectedPackagesArr,
186-
packageNameOnly: packageNameOnlyArr},
206+
command: command,
207+
path: path,
208+
supportedListFile: supportedListFile,
209+
overrideVersionsFile: overrideVersionsFile,
210+
expectedPackages: expectedPackagesArr,
211+
packageNameOnly: packageNameOnlyArr},
187212
}
188213

189214
return p, nil
@@ -220,6 +245,38 @@ func ParsePackagesList(expectedPackages string) ([]string, error) {
220245
return strings.Split(tmp, ","), nil
221246
}
222247

248+
func ParseOverrideVersionsFile(path, overrideVersionFile string) (map[string]interface{}, error) {
249+
jsonFile, err := os.Open(filepath.Dir(path) + "/" + overrideVersionFile)
250+
if err != nil {
251+
return nil, fmt.Errorf("error opening versions override list %s!", err.Error())
252+
} else {
253+
defer jsonFile.Close()
254+
}
255+
256+
versions_json, err := ioutil.ReadAll(jsonFile)
257+
if err != nil {
258+
return nil, fmt.Errorf("Error reading versions override list %s!", err.Error())
259+
}
260+
261+
var versions_override map[string]interface{}
262+
263+
err = json.Unmarshal([]byte(versions_json), &versions_override)
264+
if nil != err {
265+
return nil, fmt.Errorf("Error unmarshalling versions override list %s\n", err.Error())
266+
}
267+
268+
return versions_override, nil
269+
}
270+
271+
// Returns name of versions override file (if exists)
272+
func (pkgs *PhpPackagesCollection) OverrideVersionsFile() string {
273+
if nil == pkgs {
274+
return ""
275+
}
276+
277+
return pkgs.config.overrideVersionsFile
278+
}
279+
223280
// Detects installed PHP packages
224281
//
225282
// Returns : []PhpPackage with extracted package info, sorted by package name

daemon/internal/newrelic/integration/test.go

+20-1
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,7 @@ func (t *Test) comparePhpPackages(harvest *newrelic.Harvest) {
516516
var expectedPackages []PhpPackage
517517
var expectedPkgsCollection *PhpPackagesCollection
518518
var expectNullPkgs bool
519+
var version_overrides map[string]interface{}
519520

520521
if nil != t.phpPackagesConfig {
521522
var err error
@@ -545,6 +546,15 @@ func (t *Test) comparePhpPackages(harvest *newrelic.Harvest) {
545546
t.Fatal(fmt.Errorf("EXPECTED_PHP_PACKAGES used but no packages detected in environment!"))
546547
}
547548

549+
// load any expected versions overrides
550+
if 0 < len(expectedPkgsCollection.OverrideVersionsFile()) {
551+
var err error
552+
version_overrides, err = ParseOverrideVersionsFile(t.Path, expectedPkgsCollection.OverrideVersionsFile())
553+
if nil != err {
554+
t.Fatal(err)
555+
}
556+
}
557+
548558
audit, err := newrelic.IntegrationData(harvest.PhpPackages, newrelic.AgentRunID("?? agent run id"), time.Now())
549559
if nil != err {
550560
t.Fatal(err)
@@ -580,7 +590,16 @@ func (t *Test) comparePhpPackages(harvest *newrelic.Harvest) {
580590
t.AddNote(fmt.Sprintf("Tested package name only for packages: %+v", expectedPkgsCollection.config.packageNameOnly))
581591
}
582592
}
583-
if testPackageNameOnly || expectedPackages[i].Version == actualPackages[i].Version {
593+
594+
// see if a version override exists for the expectation
595+
expected_version := expectedPackages[i].Version
596+
override_version, ok := version_overrides[expected_version]
597+
if ok {
598+
t.AddNote(fmt.Sprintf("Overrode detected version %s with %s", expected_version, override_version))
599+
expected_version = override_version.(string)
600+
}
601+
602+
if testPackageNameOnly || expected_version == actualPackages[i].Version {
584603
continue
585604
}
586605
}

0 commit comments

Comments
 (0)