@@ -2374,9 +2374,6 @@ variable "baz" {}
2374
2374
}
2375
2375
2376
2376
func TestLoadChildModulesFromLocalCache (t * testing.T ) {
2377
- var buf bytes.Buffer
2378
- slog .SetDefault (slog .New (log .NewHandler (& buf , & log.Options {Level : log .LevelDebug })))
2379
-
2380
2377
fsys := fstest.MapFS {
2381
2378
"main.tf" : & fstest.MapFile {Data : []byte (`module "level_1" {
2382
2379
source = "./modules/level_1"
@@ -2411,9 +2408,13 @@ func TestLoadChildModulesFromLocalCache(t *testing.T) {
2411
2408
}` )},
2412
2409
}
2413
2410
2411
+ var buf bytes.Buffer
2412
+ logger := slog .New (log .NewHandler (& buf , & log.Options {Level : log .LevelDebug }))
2413
+
2414
2414
parser := New (
2415
2415
fsys , "" ,
2416
2416
OptionStopOnHCLError (true ),
2417
+ OptionWithLogger (logger ),
2417
2418
)
2418
2419
require .NoError (t , parser .ParseFS (t .Context (), "." ))
2419
2420
@@ -2422,10 +2423,10 @@ func TestLoadChildModulesFromLocalCache(t *testing.T) {
2422
2423
2423
2424
assert .Len (t , modules , 5 )
2424
2425
2425
- assert .Contains (t , buf .String (), "Using module from Terraform cache .terraform/modules\t source =\" ./modules/level_1\" " )
2426
- assert .Contains (t , buf .String (), "Using module from Terraform cache .terraform/modules\t source =\" ../level_2\" " )
2427
- assert .Contains (t , buf .String (), "Using module from Terraform cache .terraform/modules\t source =\" ../level_3\" " )
2428
- assert .Contains (t , buf .String (), "Using module from Terraform cache .terraform/modules\t source =\" ../level_3\" " )
2426
+ assert .Contains (t , buf .String (), "Using module from Terraform cache .terraform/modules\t module= \" root \" source =\" ./modules/level_1\" " )
2427
+ assert .Contains (t , buf .String (), "Using module from Terraform cache .terraform/modules\t module= \" level_1 \" source =\" ../level_2\" " )
2428
+ assert .Contains (t , buf .String (), "Using module from Terraform cache .terraform/modules\t module= \" level_2 \" source =\" ../level_3\" " )
2429
+ assert .Contains (t , buf .String (), "Using module from Terraform cache .terraform/modules\t module= \" level_2 \" source =\" ../level_3\" " )
2429
2430
}
2430
2431
2431
2432
func TestNilParser (t * testing.T ) {
@@ -2633,3 +2634,118 @@ resource "foo" "bar" {
2633
2634
attr := foo .GetAttribute ("attr" )
2634
2635
assert .False (t , attr .IsResolvable ())
2635
2636
}
2637
+
2638
+ // TestInstancedLogger checks if any global logs are generated by the terraform
2639
+ // parser + evaluation. All logs should be attached to the instanced logger. This
2640
+ // test does not run all error cases, so it will not capture all log output.
2641
+ func TestInstancedLogger (t * testing.T ) {
2642
+ // reset global logger
2643
+ prevLog := slog .Default ()
2644
+ defer slog .SetDefault (prevLog )
2645
+
2646
+ // capture logs to the global logger
2647
+ var buf bytes.Buffer
2648
+
2649
+ slog .SetDefault (slog .New (log .NewHandler (& buf , & log.Options {
2650
+ Level : slog .LevelDebug ,
2651
+ })))
2652
+
2653
+ // create a new logger for the parser
2654
+ var instance bytes.Buffer
2655
+ logger := slog .New (log .NewHandler (& instance , & log.Options {
2656
+ Level : slog .LevelDebug ,
2657
+ }))
2658
+
2659
+ opts := []Option {
2660
+ OptionWithLogger (logger ),
2661
+ OptionStopOnHCLError (false ),
2662
+ OptionWithDownloads (false ),
2663
+ }
2664
+ // Run some scenarios that will trigger logs
2665
+ t .Run ("ParserLogs" , func (t * testing.T ) {
2666
+ fsys := fstest.MapFS {
2667
+ "main.tf" : & fstest.MapFile {
2668
+ Data : []byte (`
2669
+ bare words
2670
+ ` )},
2671
+ }
2672
+
2673
+ parser := New (fsys , "" , opts ... )
2674
+
2675
+ // No error is returned, but some parser logs are expected
2676
+ err := parser .ParseFS (t .Context (), "." )
2677
+ require .NoError (t , err )
2678
+ require .NotEmpty (t , instance .String ())
2679
+ instance .Reset ()
2680
+ })
2681
+
2682
+ t .Run ("Evaluator" , func (t * testing.T ) {
2683
+ fsys := fstest.MapFS {
2684
+ "main.tf" : & fstest.MapFile {
2685
+ Data : []byte (`
2686
+ locals {
2687
+ phrase = "hello world"
2688
+ }
2689
+
2690
+ output "phrase" {
2691
+ value = locals.phrase
2692
+ }
2693
+ ` )},
2694
+ }
2695
+
2696
+ parser := New (fsys , "" , opts ... )
2697
+
2698
+ err := parser .ParseFS (t .Context (), "." )
2699
+ require .NoError (t , err )
2700
+
2701
+ _ , err = parser .EvaluateAll (t .Context ())
2702
+ require .NoError (t , err )
2703
+
2704
+ require .NotEmpty (t , instance .String ())
2705
+ instance .Reset ()
2706
+ })
2707
+
2708
+ t .Run ("ModuleFetching" , func (t * testing.T ) {
2709
+ fsys := testutil .CreateFS (t , map [string ]string {
2710
+ "main.tf" : `
2711
+ module "invalid" {
2712
+ source = "totally.invalid"
2713
+ }
2714
+
2715
+ module "echo" {
2716
+ source = "./echo"
2717
+ input = "hello"
2718
+ }
2719
+
2720
+ locals {
2721
+ foo = module.echo.value
2722
+ }
2723
+ ` ,
2724
+ "echo/main.tf" : `
2725
+ variable "input" {
2726
+ type = string
2727
+ }
2728
+ output "value" {
2729
+ value = var.input
2730
+ }
2731
+ ` ,
2732
+ })
2733
+
2734
+ parser := New (fsys , "" , opts ... )
2735
+
2736
+ err := parser .ParseFS (t .Context (), "." )
2737
+ require .NoError (t , err )
2738
+
2739
+ modules , err := parser .EvaluateAll (t .Context ())
2740
+ require .NoError (t , err )
2741
+
2742
+ require .NotEmpty (t , instance .String ())
2743
+ require .Len (t , modules , 2 )
2744
+ instance .Reset ()
2745
+ })
2746
+
2747
+ //nolint:testifylint // linter wants `emptyf`, but the output is not legible
2748
+ if ! assert .Lenf (t , buf .Bytes (), 0 , "logs detected in global logger, all logs should be using the instanced logger" ) {
2749
+ t .Log (string (buf .Bytes ())) // Helpful for debugging
2750
+ }
2751
+ }
0 commit comments