github.com/netdata/go.d.plugin@v0.58.1/agent/filestatus/manager_test.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package filestatus
     4  
     5  import (
     6  	"context"
     7  	"os"
     8  	"path"
     9  	"strings"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/netdata/go.d.plugin/agent/confgroup"
    14  
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  func TestNewManager(t *testing.T) {
    20  	mgr := NewManager("")
    21  	assert.NotNil(t, mgr.store)
    22  }
    23  
    24  func TestManager_Run(t *testing.T) {
    25  	type testAction struct {
    26  		name   string
    27  		cfg    confgroup.Config
    28  		status string
    29  	}
    30  	tests := map[string]struct {
    31  		actions  []testAction
    32  		wantFile string
    33  	}{
    34  		"save": {
    35  			actions: []testAction{
    36  				{
    37  					name: "save", status: "ok",
    38  					cfg: prepareConfig("module", "module1", "name", "name1"),
    39  				},
    40  				{
    41  					name: "save", status: "ok",
    42  					cfg: prepareConfig("module", "module2", "name", "name2"),
    43  				},
    44  			},
    45  			wantFile: `
    46  {
    47   "module1": {
    48    "name1:5956328514325012774": "ok"
    49   },
    50   "module2": {
    51    "name2:14684454322123948394": "ok"
    52   }
    53  }
    54  `,
    55  		},
    56  		"remove": {
    57  			actions: []testAction{
    58  				{
    59  					name: "save", status: "ok",
    60  					cfg: prepareConfig("module", "module1", "name", "name1"),
    61  				},
    62  				{
    63  					name: "save", status: "ok",
    64  					cfg: prepareConfig("module", "module2", "name", "name2"),
    65  				},
    66  				{
    67  					name: "remove",
    68  					cfg:  prepareConfig("module", "module2", "name", "name2"),
    69  				},
    70  			},
    71  			wantFile: `
    72  {
    73   "module1": {
    74    "name1:5956328514325012774": "ok"
    75   }
    76  }
    77  `,
    78  		},
    79  	}
    80  
    81  	for name, test := range tests {
    82  		t.Run(name, func(t *testing.T) {
    83  			dir, err := os.MkdirTemp(os.TempDir(), "netdata-go-test-filestatus-run")
    84  			require.NoError(t, err)
    85  			defer func() { assert.NoError(t, os.RemoveAll(dir)) }()
    86  
    87  			filename := path.Join(dir, "filestatus")
    88  
    89  			mgr := NewManager(filename)
    90  
    91  			ctx, cancel := context.WithCancel(context.Background())
    92  			done := make(chan struct{})
    93  			go func() { defer close(done); mgr.Run(ctx) }()
    94  
    95  			for _, v := range test.actions {
    96  				switch v.name {
    97  				case "save":
    98  					mgr.Save(v.cfg, v.status)
    99  				case "remove":
   100  					mgr.Remove(v.cfg)
   101  				}
   102  			}
   103  
   104  			cancel()
   105  
   106  			timeout := time.Second * 5
   107  			tk := time.NewTimer(timeout)
   108  			defer tk.Stop()
   109  
   110  			select {
   111  			case <-done:
   112  			case <-tk.C:
   113  				t.Errorf("timed out after %s", timeout)
   114  			}
   115  
   116  			bs, err := os.ReadFile(filename)
   117  			require.NoError(t, err)
   118  
   119  			assert.Equal(t, strings.TrimSpace(test.wantFile), string(bs))
   120  		})
   121  	}
   122  }