github.com/netdata/go.d.plugin@v0.58.1/modules/solr/solr_test.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package solr
     4  
     5  import (
     6  	"fmt"
     7  	"net/http"
     8  	"net/http/httptest"
     9  	"os"
    10  	"testing"
    11  
    12  	"github.com/netdata/go.d.plugin/agent/module"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  var (
    18  	coreMetricsV6, _ = os.ReadFile("testdata/core-metrics-v6.txt")
    19  	coreMetricsV7, _ = os.ReadFile("testdata/core-metrics-v7.txt")
    20  )
    21  
    22  func version(v string) string {
    23  	return format(`{ "lucene":{ "solr-spec-version":"%s"}}`, v)
    24  }
    25  
    26  func TestNew(t *testing.T) {
    27  	job := New()
    28  
    29  	assert.Implements(t, (*module.Module)(nil), job)
    30  	assert.Equal(t, defaultURL, job.URL)
    31  	assert.Equal(t, defaultHTTPTimeout, job.Client.Timeout.Duration)
    32  }
    33  
    34  func TestSolr_Init(t *testing.T) {
    35  	job := New()
    36  
    37  	assert.True(t, job.Init())
    38  	assert.NotNil(t, job.client)
    39  }
    40  
    41  func TestSolr_Check(t *testing.T) {
    42  	job := New()
    43  
    44  	ts := httptest.NewServer(
    45  		http.HandlerFunc(
    46  			func(w http.ResponseWriter, r *http.Request) {
    47  				if r.URL.Path == "/solr/admin/info/system" {
    48  					_, _ = w.Write([]byte(version(fmt.Sprintf("%.1f.0", minSupportedVersion))))
    49  					return
    50  				}
    51  			}))
    52  
    53  	job.URL = ts.URL
    54  	require.True(t, job.Init())
    55  	assert.True(t, job.Check())
    56  }
    57  
    58  func TestSolr_Check_UnsupportedVersion(t *testing.T) {
    59  	job := New()
    60  
    61  	ts := httptest.NewServer(
    62  		http.HandlerFunc(
    63  			func(w http.ResponseWriter, r *http.Request) {
    64  				if r.URL.Path == "/solr/admin/info/system" {
    65  					_, _ = w.Write([]byte(version(fmt.Sprintf("%.1f.0", minSupportedVersion-1))))
    66  					return
    67  				}
    68  			}))
    69  
    70  	job.URL = ts.URL
    71  
    72  	require.True(t, job.Init())
    73  
    74  	assert.False(t, job.Check())
    75  }
    76  
    77  func TestSolr_Charts(t *testing.T) {
    78  	assert.NotNil(t, New().Charts())
    79  }
    80  
    81  func TestSolr_Cleanup(t *testing.T) {
    82  	New().Cleanup()
    83  }
    84  
    85  func TestSolr_CollectV6(t *testing.T) {
    86  	job := New()
    87  
    88  	ts := httptest.NewServer(
    89  		http.HandlerFunc(
    90  			func(w http.ResponseWriter, r *http.Request) {
    91  				if r.URL.Path == "/solr/admin/info/system" {
    92  					_, _ = w.Write([]byte(version(fmt.Sprintf("%.1f.0", minSupportedVersion))))
    93  					return
    94  				}
    95  				if r.URL.Path == "/solr/admin/metrics" {
    96  					_, _ = w.Write(coreMetricsV6)
    97  					return
    98  				}
    99  			}))
   100  
   101  	job.URL = ts.URL
   102  
   103  	require.True(t, job.Init())
   104  	require.True(t, job.Check())
   105  	require.NotNil(t, job.Charts())
   106  
   107  	expected := map[string]int64{
   108  		"core2_query_requestTimes_min_ms":     0,
   109  		"core1_query_serverErrors_count":      3,
   110  		"core2_update_requestTimes_mean_ms":   0,
   111  		"core2_query_requestTimes_p99_ms":     297000000,
   112  		"core2_query_requestTimes_p999_ms":    2997000000,
   113  		"core1_update_requestTimes_p99_ms":    297000000,
   114  		"core2_update_requestTimes_p75_ms":    225000000,
   115  		"core2_update_requests_count":         3,
   116  		"core2_query_requestTimes_p75_ms":     225000000,
   117  		"core2_update_requestTimes_min_ms":    0,
   118  		"core2_query_clientErrors_count":      3,
   119  		"core2_query_requestTimes_count":      3,
   120  		"core2_query_requestTimes_median_ms":  0,
   121  		"core2_query_requestTimes_p95_ms":     285000000,
   122  		"core2_update_serverErrors_count":     3,
   123  		"core1_query_requestTimes_mean_ms":    0,
   124  		"core1_update_totalTime_count":        3,
   125  		"core1_update_errors_count":           3,
   126  		"core1_query_errors_count":            3,
   127  		"core1_query_timeouts_count":          3,
   128  		"core1_update_requestTimes_p95_ms":    285000000,
   129  		"core1_query_clientErrors_count":      3,
   130  		"core2_query_serverErrors_count":      3,
   131  		"core1_update_requestTimes_p75_ms":    225000000,
   132  		"core2_update_requestTimes_p99_ms":    297000000,
   133  		"core2_query_requests_count":          3,
   134  		"core2_update_clientErrors_count":     3,
   135  		"core1_update_requestTimes_min_ms":    0,
   136  		"core1_update_requestTimes_mean_ms":   0,
   137  		"core1_query_requestTimes_p95_ms":     285000000,
   138  		"core1_query_requestTimes_p999_ms":    2997000000,
   139  		"core1_update_serverErrors_count":     3,
   140  		"core1_query_requests_count":          3,
   141  		"core1_update_requestTimes_p999_ms":   2997000000,
   142  		"core1_query_requestTimes_p75_ms":     225000000,
   143  		"core1_update_requestTimes_count":     3,
   144  		"core2_update_requestTimes_p95_ms":    285000000,
   145  		"core1_query_requestTimes_count":      3,
   146  		"core1_query_requestTimes_p99_ms":     297000000,
   147  		"core1_update_requestTimes_median_ms": 0,
   148  		"core1_update_requestTimes_max_ms":    0,
   149  		"core2_update_requestTimes_count":     3,
   150  		"core1_query_requestTimes_min_ms":     0,
   151  		"core1_update_timeouts_count":         3,
   152  		"core2_update_timeouts_count":         3,
   153  		"core2_update_errors_count":           3,
   154  		"core1_update_requests_count":         3,
   155  		"core2_query_errors_count":            3,
   156  		"core1_query_requestTimes_median_ms":  0,
   157  		"core1_query_requestTimes_max_ms":     0,
   158  		"core1_update_clientErrors_count":     3,
   159  		"core2_update_requestTimes_median_ms": 0,
   160  		"core2_query_requestTimes_mean_ms":    0,
   161  		"core2_update_totalTime_count":        3,
   162  		"core2_update_requestTimes_max_ms":    0,
   163  		"core2_update_requestTimes_p999_ms":   2997000000,
   164  		"core2_query_timeouts_count":          3,
   165  		"core2_query_requestTimes_max_ms":     0,
   166  		"core1_query_totalTime_count":         3,
   167  		"core2_query_totalTime_count":         3,
   168  	}
   169  
   170  	assert.Equal(t, expected, job.Collect())
   171  	assert.Equal(t, expected, job.Collect())
   172  }
   173  
   174  func TestSolr_CollectV7(t *testing.T) {
   175  	job := New()
   176  
   177  	ts := httptest.NewServer(
   178  		http.HandlerFunc(
   179  			func(w http.ResponseWriter, r *http.Request) {
   180  				if r.URL.Path == "/solr/admin/info/system" {
   181  					_, _ = w.Write([]byte(version(fmt.Sprintf("%.1f.0", minSupportedVersion+1))))
   182  					return
   183  				}
   184  				if r.URL.Path == "/solr/admin/metrics" {
   185  					_, _ = w.Write(coreMetricsV7)
   186  					return
   187  				}
   188  			}))
   189  
   190  	job.URL = ts.URL
   191  
   192  	require.True(t, job.Init())
   193  	require.True(t, job.Check())
   194  	require.NotNil(t, job.Charts())
   195  
   196  	expected := map[string]int64{
   197  		"core1_query_requestTimes_p95_ms":     285000000,
   198  		"core1_query_timeouts_count":          3,
   199  		"core1_update_requestTimes_p999_ms":   2997000000,
   200  		"core2_query_requestTimes_mean_ms":    0,
   201  		"core2_query_timeouts_count":          3,
   202  		"core1_update_timeouts_count":         3,
   203  		"core1_update_requestTimes_mean_ms":   0,
   204  		"core2_update_serverErrors_count":     3,
   205  		"core2_query_requestTimes_min_ms":     0,
   206  		"core2_query_requestTimes_p75_ms":     225000000,
   207  		"core2_update_clientErrors_count":     3,
   208  		"core2_update_requestTimes_count":     3,
   209  		"core2_query_requestTimes_max_ms":     0,
   210  		"core1_query_requestTimes_mean_ms":    0,
   211  		"core1_update_totalTime_count":        3,
   212  		"core1_query_serverErrors_count":      3,
   213  		"core1_update_requestTimes_p99_ms":    297000000,
   214  		"core2_query_totalTime_count":         3,
   215  		"core2_update_requestTimes_max_ms":    0,
   216  		"core2_query_requestTimes_p99_ms":     297000000,
   217  		"core1_query_requestTimes_count":      3,
   218  		"core1_query_requestTimes_median_ms":  0,
   219  		"core1_query_clientErrors_count":      3,
   220  		"core2_update_requestTimes_mean_ms":   0,
   221  		"core2_update_requestTimes_median_ms": 0,
   222  		"core2_update_requestTimes_p95_ms":    285000000,
   223  		"core2_update_requestTimes_p999_ms":   2997000000,
   224  		"core2_update_totalTime_count":        3,
   225  		"core1_update_clientErrors_count":     3,
   226  		"core2_query_serverErrors_count":      3,
   227  		"core2_query_requests_count":          3,
   228  		"core1_update_serverErrors_count":     3,
   229  		"core1_update_requestTimes_p75_ms":    225000000,
   230  		"core2_update_requestTimes_min_ms":    0,
   231  		"core2_query_errors_count":            3,
   232  		"core1_update_errors_count":           3,
   233  		"core1_query_totalTime_count":         3,
   234  		"core1_update_requestTimes_p95_ms":    285000000,
   235  		"core2_query_requestTimes_p95_ms":     285000000,
   236  		"core2_query_requestTimes_p999_ms":    2997000000,
   237  		"core1_query_requestTimes_min_ms":     0,
   238  		"core2_update_errors_count":           3,
   239  		"core2_query_clientErrors_count":      3,
   240  		"core1_update_requestTimes_min_ms":    0,
   241  		"core1_query_requestTimes_max_ms":     0,
   242  		"core1_query_requestTimes_p75_ms":     225000000,
   243  		"core1_query_requestTimes_p999_ms":    2997000000,
   244  		"core2_update_requestTimes_p75_ms":    225000000,
   245  		"core2_update_timeouts_count":         3,
   246  		"core1_query_requestTimes_p99_ms":     297000000,
   247  		"core1_update_requests_count":         3,
   248  		"core1_update_requestTimes_median_ms": 0,
   249  		"core1_update_requestTimes_max_ms":    0,
   250  		"core2_update_requestTimes_p99_ms":    297000000,
   251  		"core2_query_requestTimes_count":      3,
   252  		"core1_query_errors_count":            3,
   253  		"core1_query_requests_count":          3,
   254  		"core1_update_requestTimes_count":     3,
   255  		"core2_update_requests_count":         3,
   256  		"core2_query_requestTimes_median_ms":  0,
   257  	}
   258  
   259  	assert.Equal(t, expected, job.Collect())
   260  	assert.Equal(t, expected, job.Collect())
   261  }
   262  
   263  func TestSolr_Collect_404(t *testing.T) {
   264  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   265  		w.WriteHeader(404)
   266  	}))
   267  	defer ts.Close()
   268  
   269  	job := New()
   270  	job.URL = ts.URL
   271  
   272  	require.True(t, job.Init())
   273  	assert.False(t, job.Check())
   274  }