github.com/netdata/go.d.plugin@v0.58.1/agent/module/job_test.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package module
     4  
     5  import (
     6  	"fmt"
     7  	"io"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  )
    13  
    14  const (
    15  	pluginName = "plugin"
    16  	modName    = "module"
    17  	jobName    = "job"
    18  )
    19  
    20  func newTestJob() *Job {
    21  	return NewJob(
    22  		JobConfig{
    23  			PluginName:      pluginName,
    24  			Name:            jobName,
    25  			ModuleName:      modName,
    26  			FullName:        modName + "_" + jobName,
    27  			Module:          nil,
    28  			Out:             io.Discard,
    29  			UpdateEvery:     0,
    30  			AutoDetectEvery: 0,
    31  			Priority:        0,
    32  		},
    33  	)
    34  }
    35  
    36  func TestNewJob(t *testing.T) {
    37  	assert.IsType(t, (*Job)(nil), newTestJob())
    38  }
    39  
    40  func TestJob_FullName(t *testing.T) {
    41  	job := newTestJob()
    42  
    43  	assert.Equal(t, job.FullName(), fmt.Sprintf("%s_%s", modName, jobName))
    44  }
    45  
    46  func TestJob_ModuleName(t *testing.T) {
    47  	job := newTestJob()
    48  
    49  	assert.Equal(t, job.ModuleName(), modName)
    50  }
    51  
    52  func TestJob_Name(t *testing.T) {
    53  	job := newTestJob()
    54  
    55  	assert.Equal(t, job.Name(), jobName)
    56  }
    57  
    58  func TestJob_Panicked(t *testing.T) {
    59  	job := newTestJob()
    60  
    61  	assert.Equal(t, job.Panicked(), job.panicked)
    62  	job.panicked = true
    63  	assert.Equal(t, job.Panicked(), job.panicked)
    64  }
    65  
    66  func TestJob_AutoDetectionEvery(t *testing.T) {
    67  	job := newTestJob()
    68  
    69  	assert.Equal(t, job.AutoDetectionEvery(), job.AutoDetectEvery)
    70  }
    71  
    72  func TestJob_RetryAutoDetection(t *testing.T) {
    73  	job := newTestJob()
    74  	m := &MockModule{
    75  		InitFunc: func() bool {
    76  			return true
    77  		},
    78  		CheckFunc: func() bool { return false },
    79  		ChartsFunc: func() *Charts {
    80  			return &Charts{}
    81  		},
    82  	}
    83  	job.module = m
    84  	job.AutoDetectEvery = 1
    85  
    86  	assert.True(t, job.RetryAutoDetection())
    87  	assert.Equal(t, infTries, job.AutoDetectTries)
    88  	for i := 0; i < 1000; i++ {
    89  		job.check()
    90  	}
    91  	assert.True(t, job.RetryAutoDetection())
    92  	assert.Equal(t, infTries, job.AutoDetectTries)
    93  
    94  	job.AutoDetectTries = 10
    95  	for i := 0; i < 10; i++ {
    96  		job.check()
    97  	}
    98  	assert.False(t, job.RetryAutoDetection())
    99  	assert.Equal(t, 0, job.AutoDetectTries)
   100  }
   101  
   102  func TestJob_AutoDetection(t *testing.T) {
   103  	job := newTestJob()
   104  	var v int
   105  	m := &MockModule{
   106  		InitFunc: func() bool {
   107  			v++
   108  			return true
   109  		},
   110  		CheckFunc: func() bool {
   111  			v++
   112  			return true
   113  		},
   114  		ChartsFunc: func() *Charts {
   115  			v++
   116  			return &Charts{}
   117  		},
   118  	}
   119  	job.module = m
   120  
   121  	assert.True(t, job.AutoDetection())
   122  	assert.Equal(t, 3, v)
   123  }
   124  
   125  func TestJob_AutoDetection_FailInit(t *testing.T) {
   126  	job := newTestJob()
   127  	m := &MockModule{
   128  		InitFunc: func() bool {
   129  			return false
   130  		},
   131  	}
   132  	job.module = m
   133  
   134  	assert.False(t, job.AutoDetection())
   135  	assert.True(t, m.CleanupDone)
   136  }
   137  
   138  func TestJob_AutoDetection_FailCheck(t *testing.T) {
   139  	job := newTestJob()
   140  	m := &MockModule{
   141  		InitFunc: func() bool {
   142  			return true
   143  		},
   144  		CheckFunc: func() bool {
   145  			return false
   146  		},
   147  	}
   148  	job.module = m
   149  
   150  	assert.False(t, job.AutoDetection())
   151  	assert.True(t, m.CleanupDone)
   152  }
   153  
   154  func TestJob_AutoDetection_FailPostCheck(t *testing.T) {
   155  	job := newTestJob()
   156  	m := &MockModule{
   157  		InitFunc: func() bool {
   158  			return true
   159  		},
   160  		CheckFunc: func() bool {
   161  			return true
   162  		},
   163  		ChartsFunc: func() *Charts {
   164  			return nil
   165  		},
   166  	}
   167  	job.module = m
   168  
   169  	assert.False(t, job.AutoDetection())
   170  	assert.True(t, m.CleanupDone)
   171  }
   172  
   173  func TestJob_AutoDetection_PanicInit(t *testing.T) {
   174  	job := newTestJob()
   175  	m := &MockModule{
   176  		InitFunc: func() bool {
   177  			panic("panic in Init")
   178  		},
   179  	}
   180  	job.module = m
   181  
   182  	assert.False(t, job.AutoDetection())
   183  	assert.True(t, m.CleanupDone)
   184  }
   185  
   186  func TestJob_AutoDetection_PanicCheck(t *testing.T) {
   187  	job := newTestJob()
   188  	m := &MockModule{
   189  		InitFunc: func() bool {
   190  			return true
   191  		},
   192  		CheckFunc: func() bool {
   193  			panic("panic in Check")
   194  		},
   195  	}
   196  	job.module = m
   197  
   198  	assert.False(t, job.AutoDetection())
   199  	assert.True(t, m.CleanupDone)
   200  }
   201  
   202  func TestJob_AutoDetection_PanicPostCheck(t *testing.T) {
   203  	job := newTestJob()
   204  	m := &MockModule{
   205  		InitFunc: func() bool {
   206  			return true
   207  		},
   208  		CheckFunc: func() bool {
   209  			return true
   210  		},
   211  		ChartsFunc: func() *Charts {
   212  			panic("panic in PostCheck")
   213  		},
   214  	}
   215  	job.module = m
   216  
   217  	assert.False(t, job.AutoDetection())
   218  	assert.True(t, m.CleanupDone)
   219  }
   220  
   221  func TestJob_Start(t *testing.T) {
   222  	m := &MockModule{
   223  		ChartsFunc: func() *Charts {
   224  			return &Charts{
   225  				&Chart{
   226  					ID:    "id",
   227  					Title: "title",
   228  					Units: "units",
   229  					Dims: Dims{
   230  						{ID: "id1"},
   231  						{ID: "id2"},
   232  					},
   233  				},
   234  			}
   235  		},
   236  		CollectFunc: func() map[string]int64 {
   237  			return map[string]int64{
   238  				"id1": 1,
   239  				"id2": 2,
   240  			}
   241  		},
   242  	}
   243  	job := newTestJob()
   244  	job.module = m
   245  	job.charts = job.module.Charts()
   246  	job.updateEvery = 1
   247  
   248  	go func() {
   249  		for i := 1; i < 3; i++ {
   250  			job.Tick(i)
   251  			time.Sleep(time.Second)
   252  		}
   253  		job.Stop()
   254  	}()
   255  
   256  	job.Start()
   257  
   258  	assert.True(t, m.CleanupDone)
   259  }
   260  
   261  func TestJob_MainLoop_Panic(t *testing.T) {
   262  	m := &MockModule{
   263  		CollectFunc: func() map[string]int64 {
   264  			panic("panic in Collect")
   265  		},
   266  	}
   267  	job := newTestJob()
   268  	job.module = m
   269  	job.updateEvery = 1
   270  
   271  	go func() {
   272  		for i := 1; i < 3; i++ {
   273  			time.Sleep(time.Second)
   274  			job.Tick(i)
   275  		}
   276  		job.Stop()
   277  	}()
   278  
   279  	job.Start()
   280  
   281  	assert.True(t, job.Panicked())
   282  	assert.True(t, m.CleanupDone)
   283  }
   284  
   285  func TestJob_Tick(t *testing.T) {
   286  	job := newTestJob()
   287  	for i := 0; i < 3; i++ {
   288  		job.Tick(i)
   289  	}
   290  }