@@ -18,6 +18,7 @@ import (
18
18
"time"
19
19
20
20
"github.com/Masterminds/semver"
21
+ "github.com/kolide/launcher/ee/agent/flags/keys"
21
22
"github.com/kolide/launcher/ee/agent/storage"
22
23
storageci "github.com/kolide/launcher/ee/agent/storage/ci"
23
24
"github.com/kolide/launcher/ee/agent/types"
@@ -41,6 +42,8 @@ func TestNewTufAutoupdater(t *testing.T) {
41
42
mockKnapsack .On ("UpdateDirectory" ).Return ("" )
42
43
mockKnapsack .On ("MirrorServerURL" ).Return ("https://example.com" )
43
44
mockKnapsack .On ("Slogger" ).Return (multislogger .NewNopLogger ())
45
+ mockKnapsack .On ("UpdateChannel" ).Return ("nightly" )
46
+ mockKnapsack .On ("RegisterChangeObserver" , mock .Anything , keys .UpdateChannel ).Return ()
44
47
45
48
_ , err := NewTufAutoupdater (context .TODO (), mockKnapsack , http .DefaultClient , http .DefaultClient , newMockQuerier (t ))
46
49
require .NoError (t , err , "could not initialize new TUF autoupdater" )
@@ -79,6 +82,7 @@ func TestExecute_launcherUpdate(t *testing.T) {
79
82
mockKnapsack .On ("UpdateDirectory" ).Return ("" )
80
83
mockKnapsack .On ("MirrorServerURL" ).Return ("https://example.com" )
81
84
mockKnapsack .On ("LocalDevelopmentPath" ).Return ("" )
85
+ mockKnapsack .On ("RegisterChangeObserver" , mock .Anything , keys .UpdateChannel ).Return ()
82
86
mockQuerier := newMockQuerier (t )
83
87
84
88
// Set logger so that we can capture output
@@ -169,6 +173,7 @@ func TestExecute_osquerydUpdate(t *testing.T) {
169
173
mockKnapsack .On ("TufServerURL" ).Return (tufServerUrl )
170
174
mockKnapsack .On ("UpdateDirectory" ).Return ("" )
171
175
mockKnapsack .On ("MirrorServerURL" ).Return ("https://example.com" )
176
+ mockKnapsack .On ("RegisterChangeObserver" , mock .Anything , keys .UpdateChannel ).Return ()
172
177
mockQuerier := newMockQuerier (t )
173
178
174
179
// Set logger so that we can capture output
@@ -243,6 +248,7 @@ func TestExecute_downgrade(t *testing.T) {
243
248
mockKnapsack .On ("TufServerURL" ).Return (tufServerUrl )
244
249
mockKnapsack .On ("UpdateDirectory" ).Return ("" )
245
250
mockKnapsack .On ("MirrorServerURL" ).Return ("https://example.com" )
251
+ mockKnapsack .On ("RegisterChangeObserver" , mock .Anything , keys .UpdateChannel ).Return ()
246
252
mockQuerier := newMockQuerier (t )
247
253
248
254
// Set logger so that we can capture output
@@ -328,6 +334,8 @@ func TestExecute_withInitialDelay(t *testing.T) {
328
334
mockKnapsack .On ("TufServerURL" ).Return (tufServerUrl )
329
335
mockKnapsack .On ("UpdateDirectory" ).Return ("" )
330
336
mockKnapsack .On ("MirrorServerURL" ).Return ("https://example.com" )
337
+ mockKnapsack .On ("UpdateChannel" ).Return ("nightly" )
338
+ mockKnapsack .On ("RegisterChangeObserver" , mock .Anything , keys .UpdateChannel ).Return ()
331
339
mockQuerier := newMockQuerier (t )
332
340
333
341
// Set logger so that we can capture output
@@ -393,6 +401,8 @@ func TestInterrupt_Multiple(t *testing.T) {
393
401
mockKnapsack .On ("UpdateDirectory" ).Return ("" )
394
402
mockKnapsack .On ("MirrorServerURL" ).Return ("https://example.com" )
395
403
mockKnapsack .On ("Slogger" ).Return (multislogger .NewNopLogger ())
404
+ mockKnapsack .On ("UpdateChannel" ).Return ("nightly" )
405
+ mockKnapsack .On ("RegisterChangeObserver" , mock .Anything , keys .UpdateChannel ).Return ()
396
406
mockQuerier := newMockQuerier (t )
397
407
398
408
// Set up autoupdater
@@ -519,6 +529,7 @@ func TestDo(t *testing.T) {
519
529
mockKnapsack .On ("LocalDevelopmentPath" ).Return ("" ).Maybe ()
520
530
mockQuerier := newMockQuerier (t )
521
531
mockKnapsack .On ("Slogger" ).Return (multislogger .NewNopLogger ())
532
+ mockKnapsack .On ("RegisterChangeObserver" , mock .Anything , keys .UpdateChannel ).Return ()
522
533
523
534
// Set up autoupdater
524
535
autoupdater , err := NewTufAutoupdater (context .TODO (), mockKnapsack , http .DefaultClient , http .DefaultClient , mockQuerier , WithOsqueryRestart (func () error { return nil }))
@@ -585,6 +596,7 @@ func TestDo_HandlesSimultaneousUpdates(t *testing.T) {
585
596
mockKnapsack .On ("LocalDevelopmentPath" ).Return ("" )
586
597
mockQuerier := newMockQuerier (t )
587
598
mockKnapsack .On ("Slogger" ).Return (multislogger .NewNopLogger ())
599
+ mockKnapsack .On ("RegisterChangeObserver" , mock .Anything , keys .UpdateChannel ).Return ()
588
600
589
601
// Set up autoupdater
590
602
autoupdater , err := NewTufAutoupdater (context .TODO (), mockKnapsack , http .DefaultClient , http .DefaultClient , mockQuerier , WithOsqueryRestart (func () error { return nil }))
@@ -640,6 +652,63 @@ func TestDo_HandlesSimultaneousUpdates(t *testing.T) {
640
652
mockKnapsack .AssertExpectations (t )
641
653
}
642
654
655
+ func TestFlagsChanged (t * testing.T ) {
656
+ t .Parallel ()
657
+
658
+ testRootDir := t .TempDir ()
659
+ testReleaseVersion := "2.2.3"
660
+ tufServerUrl , rootJson := tufci .InitRemoteTufServer (t , testReleaseVersion )
661
+ s := setupStorage (t )
662
+ mockKnapsack := typesmocks .NewKnapsack (t )
663
+ mockKnapsack .On ("RootDirectory" ).Return (testRootDir )
664
+ mockKnapsack .On ("AutoupdateErrorsStore" ).Return (s )
665
+ mockKnapsack .On ("TufServerURL" ).Return (tufServerUrl )
666
+ mockKnapsack .On ("UpdateDirectory" ).Return ("" )
667
+ mockKnapsack .On ("MirrorServerURL" ).Return ("https://example.com" )
668
+ mockKnapsack .On ("LocalDevelopmentPath" ).Return ("" ).Maybe ()
669
+ mockQuerier := newMockQuerier (t )
670
+ mockKnapsack .On ("Slogger" ).Return (multislogger .NewNopLogger ())
671
+ mockKnapsack .On ("RegisterChangeObserver" , mock .Anything , keys .UpdateChannel ).Return ()
672
+
673
+ // Start out on beta channel, then swap to nightly
674
+ mockKnapsack .On ("UpdateChannel" ).Return ("beta" ).Once ()
675
+ mockKnapsack .On ("UpdateChannel" ).Return ("nightly" )
676
+
677
+ // Set up autoupdater
678
+ autoupdater , err := NewTufAutoupdater (context .TODO (), mockKnapsack , http .DefaultClient , http .DefaultClient , mockQuerier , WithOsqueryRestart (func () error { return nil }))
679
+ require .NoError (t , err , "could not initialize new TUF autoupdater" )
680
+ require .Equal (t , "beta" , autoupdater .updateChannel )
681
+
682
+ // Update the metadata client with our test root JSON
683
+ require .NoError (t , autoupdater .metadataClient .Init (rootJson ), "could not initialize metadata client with test root JSON" )
684
+
685
+ // Get metadata for each release
686
+ _ , err = autoupdater .metadataClient .Update ()
687
+ require .NoError (t , err , "could not update metadata client to fetch target metadata" )
688
+
689
+ // Expect that we attempt to update the library
690
+ mockLibraryManager := NewMocklibrarian (t )
691
+ autoupdater .libraryManager = mockLibraryManager
692
+ currentOsqueryVersion := "1.1.1"
693
+ mockQuerier .On ("Query" , mock .Anything ).Return ([]map [string ]string {{"version" : currentOsqueryVersion }}, nil )
694
+ mockLibraryManager .On ("Available" , binaryOsqueryd , fmt .Sprintf ("%s-%s.tar.gz" , binaryOsqueryd , testReleaseVersion )).Return (false )
695
+ mockLibraryManager .On ("AddToLibrary" , binaryOsqueryd , mock .Anything , mock .Anything , mock .Anything ).Return (nil )
696
+ mockLibraryManager .On ("Available" , binaryLauncher , fmt .Sprintf ("%s-%s.tar.gz" , binaryLauncher , testReleaseVersion )).Return (false )
697
+ mockLibraryManager .On ("AddToLibrary" , binaryLauncher , mock .Anything , mock .Anything , mock .Anything ).Return (nil )
698
+
699
+ // Notify that flags changed
700
+ autoupdater .FlagsChanged (keys .UpdateChannel )
701
+
702
+ // Assert expectation that we added the expected `testReleaseVersion` to the updates library
703
+ mockLibraryManager .AssertExpectations (t )
704
+
705
+ // Confirm we pulled all config items as expected
706
+ mockKnapsack .AssertExpectations (t )
707
+
708
+ // Confirm we're on the expected update channel
709
+ require .Equal (t , "nightly" , autoupdater .updateChannel )
710
+ }
711
+
643
712
func Test_currentRunningVersion_launcher_errorWhenVersionIsNotSet (t * testing.T ) {
644
713
t .Parallel ()
645
714
@@ -711,6 +780,8 @@ func Test_storeError(t *testing.T) {
711
780
mockKnapsack .On ("UpdateDirectory" ).Return ("" )
712
781
mockKnapsack .On ("MirrorServerURL" ).Return ("https://example.com" )
713
782
mockKnapsack .On ("Slogger" ).Return (multislogger .NewNopLogger ())
783
+ mockKnapsack .On ("UpdateChannel" ).Return ("nightly" )
784
+ mockKnapsack .On ("RegisterChangeObserver" , mock .Anything , keys .UpdateChannel ).Return ()
714
785
mockQuerier := newMockQuerier (t )
715
786
716
787
autoupdater , err := NewTufAutoupdater (context .TODO (), mockKnapsack , http .DefaultClient , http .DefaultClient , mockQuerier )
0 commit comments