github.com/netdata/go.d.plugin@v0.58.1/modules/dockerhub/dockerhub_test.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package dockerhub
     4  
     5  import (
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"os"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  var (
    17  	repo1Data, _ = os.ReadFile("testdata/repo1.txt")
    18  	repo2Data, _ = os.ReadFile("testdata/repo2.txt")
    19  	repo3Data, _ = os.ReadFile("testdata/repo3.txt")
    20  )
    21  
    22  func TestNew(t *testing.T) {
    23  	job := New()
    24  
    25  	assert.IsType(t, (*DockerHub)(nil), job)
    26  	assert.Equal(t, defaultURL, job.URL)
    27  	assert.Equal(t, defaultHTTPTimeout, job.Timeout.Duration)
    28  	assert.Len(t, job.Repositories, 0)
    29  	assert.Nil(t, job.client)
    30  }
    31  
    32  func TestDockerHub_Charts(t *testing.T) { assert.NotNil(t, New().Charts()) }
    33  
    34  func TestDockerHub_Cleanup(t *testing.T) { New().Cleanup() }
    35  
    36  func TestDockerHub_Init(t *testing.T) {
    37  	job := New()
    38  	job.Repositories = []string{"name/repo"}
    39  	assert.True(t, job.Init())
    40  	assert.NotNil(t, job.client)
    41  }
    42  
    43  func TestDockerHub_InitNG(t *testing.T) { assert.False(t, New().Init()) }
    44  
    45  func TestDockerHub_Check(t *testing.T) {
    46  	ts := httptest.NewServer(
    47  		http.HandlerFunc(
    48  			func(w http.ResponseWriter, r *http.Request) {
    49  				switch {
    50  				case strings.HasSuffix(r.URL.Path, "name1/repo1"):
    51  					_, _ = w.Write(repo1Data)
    52  				case strings.HasSuffix(r.URL.Path, "name2/repo2"):
    53  					_, _ = w.Write(repo2Data)
    54  				case strings.HasSuffix(r.URL.Path, "name3/repo3"):
    55  					_, _ = w.Write(repo3Data)
    56  				}
    57  			}))
    58  	defer ts.Close()
    59  
    60  	job := New()
    61  	job.URL = ts.URL
    62  	job.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
    63  	require.True(t, job.Init())
    64  	assert.True(t, job.Check())
    65  }
    66  
    67  func TestDockerHub_CheckNG(t *testing.T) {
    68  	job := New()
    69  	job.URL = "http://127.0.0.1:38001/metrics"
    70  	job.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
    71  	require.True(t, job.Init())
    72  	assert.False(t, job.Check())
    73  }
    74  
    75  func TestDockerHub_Collect(t *testing.T) {
    76  	ts := httptest.NewServer(
    77  		http.HandlerFunc(
    78  			func(w http.ResponseWriter, r *http.Request) {
    79  				switch {
    80  				case strings.HasSuffix(r.URL.Path, "name1/repo1"):
    81  					_, _ = w.Write(repo1Data)
    82  				case strings.HasSuffix(r.URL.Path, "name2/repo2"):
    83  					_, _ = w.Write(repo2Data)
    84  				case strings.HasSuffix(r.URL.Path, "name3/repo3"):
    85  					_, _ = w.Write(repo3Data)
    86  				}
    87  			}))
    88  	defer ts.Close()
    89  
    90  	job := New()
    91  	job.URL = ts.URL
    92  	job.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
    93  	require.True(t, job.Init())
    94  	require.True(t, job.Check())
    95  
    96  	expected := map[string]int64{
    97  		"star_count_user1/name1": 45,
    98  		"pull_count_user1/name1": 18540191,
    99  		"status_user1/name1":     1,
   100  		"star_count_user2/name2": 45,
   101  		"pull_count_user2/name2": 18540192,
   102  		"status_user2/name2":     1,
   103  		"star_count_user3/name3": 45,
   104  		"pull_count_user3/name3": 18540193,
   105  		"status_user3/name3":     1,
   106  		"pull_sum":               55620576,
   107  	}
   108  
   109  	collected := job.Collect()
   110  
   111  	for k := range collected {
   112  		if strings.HasPrefix(k, "last") {
   113  			delete(collected, k)
   114  		}
   115  	}
   116  	assert.Equal(t, expected, collected)
   117  }
   118  
   119  func TestDockerHub_InvalidData(t *testing.T) {
   120  	ts := httptest.NewServer(
   121  		http.HandlerFunc(
   122  			func(w http.ResponseWriter, r *http.Request) {
   123  				_, _ = w.Write([]byte("hello and goodbye"))
   124  			}))
   125  	defer ts.Close()
   126  
   127  	job := New()
   128  	job.URL = ts.URL
   129  	job.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
   130  	require.True(t, job.Init())
   131  	assert.False(t, job.Check())
   132  }
   133  
   134  func TestDockerHub_404(t *testing.T) {
   135  	ts := httptest.NewServer(
   136  		http.HandlerFunc(
   137  			func(w http.ResponseWriter, r *http.Request) {
   138  				w.WriteHeader(http.StatusNotFound)
   139  			}))
   140  	defer ts.Close()
   141  
   142  	job := New()
   143  	job.Repositories = []string{"name1/repo1", "name2/repo2", "name3/repo3"}
   144  	require.True(t, job.Init())
   145  	assert.False(t, job.Check())
   146  }