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 }