github.com/opentofu/opentofu@v1.7.1/internal/tfdiags/rpc_friendly_test.go (about)

     1  // Copyright (c) The OpenTofu Authors
     2  // SPDX-License-Identifier: MPL-2.0
     3  // Copyright (c) 2023 HashiCorp, Inc.
     4  // SPDX-License-Identifier: MPL-2.0
     5  
     6  package tfdiags
     7  
     8  import (
     9  	"bytes"
    10  	"encoding/gob"
    11  	"fmt"
    12  	"reflect"
    13  	"testing"
    14  
    15  	"github.com/davecgh/go-spew/spew"
    16  
    17  	"github.com/hashicorp/hcl/v2"
    18  )
    19  
    20  func TestDiagnosticsForRPC(t *testing.T) {
    21  	var diags Diagnostics
    22  	diags = diags.Append(fmt.Errorf("bad"))
    23  	diags = diags.Append(SimpleWarning("less bad"))
    24  	diags = diags.Append(&hcl.Diagnostic{
    25  		Severity: hcl.DiagError,
    26  		Summary:  "bad bad bad",
    27  		Detail:   "badily bad bad",
    28  		Subject: &hcl.Range{
    29  			Filename: "foo",
    30  		},
    31  		Context: &hcl.Range{
    32  			Filename: "bar",
    33  		},
    34  	})
    35  
    36  	buf := bytes.Buffer{}
    37  	enc := gob.NewEncoder(&buf)
    38  	dec := gob.NewDecoder(&buf)
    39  
    40  	rpcDiags := diags.ForRPC()
    41  	err := enc.Encode(rpcDiags)
    42  	if err != nil {
    43  		t.Fatalf("error on Encode: %s", err)
    44  	}
    45  
    46  	var got Diagnostics
    47  	err = dec.Decode(&got)
    48  	if err != nil {
    49  		t.Fatalf("error on Decode: %s", err)
    50  	}
    51  
    52  	want := Diagnostics{
    53  		&rpcFriendlyDiag{
    54  			Severity_: Error,
    55  			Summary_:  "bad",
    56  		},
    57  		&rpcFriendlyDiag{
    58  			Severity_: Warning,
    59  			Summary_:  "less bad",
    60  		},
    61  		&rpcFriendlyDiag{
    62  			Severity_: Error,
    63  			Summary_:  "bad bad bad",
    64  			Detail_:   "badily bad bad",
    65  			Subject_: &SourceRange{
    66  				Filename: "foo",
    67  			},
    68  			Context_: &SourceRange{
    69  				Filename: "bar",
    70  			},
    71  		},
    72  	}
    73  
    74  	if !reflect.DeepEqual(got, want) {
    75  		t.Errorf("wrong result\ngot: %swant: %s", spew.Sdump(got), spew.Sdump(want))
    76  	}
    77  }