@@ -36,6 +36,7 @@ import (
3636 "github.com/stretchr/testify/require"
3737
3838 "github.com/elastic/elastic-agent/dev-tools/mage"
39+ "github.com/elastic/elastic-agent/dev-tools/notice"
3940 v1 "github.com/elastic/elastic-agent/pkg/api/v1"
4041)
4142
6566
6667var (
6768 files = flag .String ("files" , "../build/distributions/*" , "filepath glob containing package files" )
69+ sourceRoot = flag .String ("source-root" , "../" , "path to root directory of Agent repository" )
6870 modules = flag .Bool ("modules" , false , "check modules folder contents" )
6971 minModules = flag .Int ("min-modules" , 4 , "minimum number of modules to expect in modules folder" )
7072 modulesd = flag .Bool ("modules.d" , false , "check modules.d folder contents" )
@@ -190,6 +192,7 @@ func checkTar(t *testing.T, file string, fipsCheck bool) {
190192 require .NoErrorf (t , err , "error extracting archive %q" , file )
191193
192194 t .Run ("check_manifest_file" , testManifestFile (tempExtractionPath , fipsCheck ))
195+ t .Run ("check_notice_file" , testNoticeFile (tempExtractionPath , fipsCheck ))
193196
194197 checkSha512PackageHash (t , file )
195198
@@ -220,20 +223,31 @@ func checkZip(t *testing.T, file string) {
220223 require .NoErrorf (t , err , "error extracting archive %q" , file )
221224
222225 t .Run ("check_manifest_file" , testManifestFile (tempExtractionPath , false ))
226+ t .Run ("check_notice_file" , testNoticeFile (tempExtractionPath , false ))
223227
224228 checkSha512PackageHash (t , file )
225229}
226230
227231func testManifestFile (agentPackageRootDir string , checkFips bool ) func (t * testing.T ) {
228232 return func (t * testing.T ) {
229- dirEntries , err := os .ReadDir (agentPackageRootDir )
230- require .NoErrorf (t , err , "error listing extraction dir %q" , agentPackageRootDir )
231- require .Lenf (t , dirEntries , 1 , "archive should contain a single directory: found %v" , dirEntries )
232- containingDir := dirEntries [0 ].Name ()
233- checkManifestFileContents (t , filepath .Join (agentPackageRootDir , containingDir ))
233+ checkManifestFileContents (t , getExtractedPackageDir (agentPackageRootDir , t ))
234234 }
235235}
236236
237+ func testNoticeFile (agentPackageRootDir string , checkFips bool ) func (t * testing.T ) {
238+ return func (t * testing.T ) {
239+ checkNoticeFileContents (t , getExtractedPackageDir (agentPackageRootDir , t ), checkFips )
240+ }
241+ }
242+
243+ func getExtractedPackageDir (agentPackageRootDir string , t * testing.T ) string {
244+ dirEntries , err := os .ReadDir (agentPackageRootDir )
245+ require .NoErrorf (t , err , "error listing extraction dir %q" , agentPackageRootDir )
246+ require .Lenf (t , dirEntries , 1 , "archive should contain a single directory: found %v" , dirEntries )
247+
248+ return filepath .Join (agentPackageRootDir , dirEntries [0 ].Name ())
249+ }
250+
237251func checkManifestFileContents (t * testing.T , extractedPackageDir string ) {
238252 t .Log ("Checking file manifest.yaml" )
239253 m := parseManifest (t , extractedPackageDir )
@@ -275,6 +289,47 @@ func parseManifest(t *testing.T, dir string) v1.PackageManifest {
275289 return * m
276290}
277291
292+ func checkNoticeFileContents (t * testing.T , extractedPackageDir string , checkFips bool ) {
293+ t .Logf ("Checking package file NOTICE.txt; checkFips = %t" , checkFips )
294+
295+ // Hash the source NOTICE file
296+ sourceNoticeFile := filepath .Join (* sourceRoot , notice .NoticeFilename )
297+ if checkFips {
298+ sourceNoticeFile = filepath .Join (* sourceRoot , notice .FIPSNoticeFilename )
299+ }
300+ sourceNoticeFile , err := filepath .Abs (sourceNoticeFile )
301+ require .NoError (t , err )
302+
303+ sourceNoticeFileHash , err := fileHash (sourceNoticeFile )
304+ require .NoError (t , err )
305+
306+ // Hash the NOTICE file in the package
307+ packageNoticeFile := filepath .Join (extractedPackageDir , "NOTICE.txt" )
308+ packageNoticeFileHash , err := fileHash (packageNoticeFile )
309+ require .NoError (t , err )
310+
311+ // Compare the two hashes; they should be equal
312+ require .Equalf (
313+ t , sourceNoticeFileHash , packageNoticeFileHash ,
314+ "Contents of NOTICE.txt file in package are not the same as contents of %s" , sourceNoticeFile ,
315+ )
316+ }
317+
318+ func fileHash (path string ) ([]byte , error ) {
319+ f , err := os .Open (path )
320+ if err != nil {
321+ return nil , err
322+ }
323+ defer f .Close ()
324+
325+ h := sha512 .New ()
326+ if _ , err := io .Copy (h , f ); err != nil {
327+ return nil , err
328+ }
329+
330+ return h .Sum (nil ), nil
331+ }
332+
278333const (
279334 npcapLicense = `Dependency : Npcap \(https://nmap.org/npcap/\)`
280335 libpcapLicense = `Dependency : Libpcap \(http://www.tcpdump.org/\)`
@@ -621,11 +676,7 @@ func checkDockerUser(t *testing.T, p *packageFile, info *dockerInfo, expectRoot
621676}
622677
623678func checkFIPS (t * testing.T , agentPackageRootDir string ) {
624- dirEntries , err := os .ReadDir (agentPackageRootDir )
625- require .NoErrorf (t , err , "error listing extraction dir %q" , agentPackageRootDir )
626- require .Lenf (t , dirEntries , 1 , "archive should contain a single directory: found %v" , dirEntries )
627-
628- extractedPackageDir := filepath .Join (agentPackageRootDir , dirEntries [0 ].Name ())
679+ extractedPackageDir := getExtractedPackageDir (agentPackageRootDir , t )
629680 t .Logf ("Checking agent binary in %q for FIPS compliance" , extractedPackageDir )
630681 m := parseManifest (t , extractedPackageDir )
631682 versionedHome := m .Package .VersionedHome
0 commit comments