github.com/jfrog/jfrog-cli-core/v2@v2.51.0/utils/usage/usage_test.go (about) 1 package usage 2 3 import ( 4 "bytes" 5 "fmt" 6 "net/http" 7 "net/http/httptest" 8 "testing" 9 10 "github.com/jfrog/jfrog-cli-core/v2/utils/config" 11 "github.com/jfrog/jfrog-client-go/artifactory/usage" 12 ecosysusage "github.com/jfrog/jfrog-client-go/utils/usage" 13 xrayusage "github.com/jfrog/jfrog-client-go/xray/usage" 14 15 "github.com/stretchr/testify/assert" 16 ) 17 18 const ( 19 productName = "test-product" 20 serverUrl = "server-url" 21 ) 22 23 var ( 24 features = []ReportFeature{ 25 { 26 FeatureId: "featureId2", 27 ClientId: "clientId", 28 Attributes: []ReportUsageAttribute{ 29 {AttributeName: "attribute", AttributeValue: "value"}, 30 }, 31 }, 32 {FeatureId: "featureId", ClientId: "clientId2"}, 33 {FeatureId: "featureId"}, 34 } 35 artifactoryFeatures = []usage.Feature{ 36 { 37 FeatureId: "featureId2", 38 ClientId: "clientId", 39 Attributes: map[string]string{"attribute": "value"}, 40 }, 41 {FeatureId: "featureId", ClientId: "clientId2"}, 42 {FeatureId: "featureId"}, 43 } 44 ecosystemData = []ecosysusage.ReportEcosystemUsageData{ 45 { 46 ProductId: productName, 47 AccountId: serverUrl, 48 ClientId: "clientId", 49 Features: []string{"featureId2"}, 50 }, 51 { 52 ProductId: productName, 53 AccountId: serverUrl, 54 ClientId: "clientId2", 55 Features: []string{"featureId"}, 56 }, 57 { 58 ProductId: productName, 59 AccountId: serverUrl, 60 Features: []string{"featureId"}, 61 }, 62 } 63 ) 64 65 func TestConvertToArtifactoryUsage(t *testing.T) { 66 reporter := NewUsageReporter(productName, &config.ServerDetails{ArtifactoryUrl: serverUrl + "/"}) 67 for i := 0; i < len(features); i++ { 68 assert.Equal(t, artifactoryFeatures[i], reporter.convertAttributesToArtifactoryFeatures(features[i])[0]) 69 } 70 } 71 72 func TestConvertToEcosystemUsage(t *testing.T) { 73 reporter := NewUsageReporter(productName, &config.ServerDetails{Url: serverUrl}) 74 for i := 0; i < len(features); i++ { 75 report, err := reporter.convertAttributesToEcosystemReports(features[i]) 76 assert.NoError(t, err) 77 assert.Equal(t, ecosystemData[i], report[0]) 78 } 79 } 80 81 func TestReportArtifactoryUsage(t *testing.T) { 82 const commandName = "test-command" 83 server := httptest.NewServer(createArtifactoryUsageHandler(t, productName, commandName)) 84 defer server.Close() 85 serverDetails := &config.ServerDetails{ArtifactoryUrl: server.URL + "/"} 86 87 reporter := NewUsageReporter(productName, serverDetails).SetSendToEcosystem(false).SetSendToXray(false) 88 89 reporter.Report(ReportFeature{ 90 FeatureId: commandName, 91 }) 92 assert.NoError(t, reporter.WaitForResponses()) 93 } 94 95 func TestReportArtifactoryUsageError(t *testing.T) { 96 reporter := NewUsageReporter("", &config.ServerDetails{}).SetSendToEcosystem(false).SetSendToXray(false) 97 reporter.Report(ReportFeature{ 98 FeatureId: "", 99 }) 100 assert.Error(t, reporter.WaitForResponses()) 101 102 server := httptest.NewServer(create404UsageHandler(t)) 103 defer server.Close() 104 reporter = NewUsageReporter("", &config.ServerDetails{ArtifactoryUrl: server.URL + "/"}).SetSendToEcosystem(false).SetSendToXray(false) 105 reporter.Report(ReportFeature{ 106 FeatureId: "", 107 }) 108 assert.Error(t, reporter.WaitForResponses()) 109 } 110 111 func createArtifactoryUsageHandler(t *testing.T, productName, commandName string) http.HandlerFunc { 112 return func(w http.ResponseWriter, r *http.Request) { 113 if r.RequestURI == "/api/system/version" { 114 w.WriteHeader(http.StatusOK) 115 _, err := w.Write([]byte(`{"version":"6.9.0"}`)) 116 assert.NoError(t, err) 117 return 118 } 119 if r.RequestURI == "/api/system/usage" { 120 // Check request 121 buf := new(bytes.Buffer) 122 _, err := buf.ReadFrom(r.Body) 123 assert.NoError(t, err) 124 assert.Equal(t, fmt.Sprintf(`{"productId":"%s","features":[{"featureId":"%s"}]}`, productName, commandName), buf.String()) 125 126 // Send response OK 127 w.WriteHeader(http.StatusOK) 128 _, err = w.Write([]byte("{}")) 129 assert.NoError(t, err) 130 } 131 } 132 } 133 134 func TestReportXrayUsage(t *testing.T) { 135 const productName = "test-product" 136 const commandName = "test-command" 137 const clientName = "test-client" 138 139 server := httptest.NewServer(createXrayUsageHandler(t, productName, commandName, clientName)) 140 defer server.Close() 141 serverDetails := &config.ServerDetails{XrayUrl: server.URL + "/"} 142 143 reporter := NewUsageReporter(productName, serverDetails).SetSendToEcosystem(false).SetSendToArtifactory(false) 144 145 reporter.Report(ReportFeature{ 146 FeatureId: commandName, 147 ClientId: clientName, 148 }) 149 assert.NoError(t, reporter.WaitForResponses()) 150 } 151 152 func TestReportXrayError(t *testing.T) { 153 reporter := NewUsageReporter("", &config.ServerDetails{}).SetSendToEcosystem(false).SetSendToArtifactory(false) 154 reporter.Report(ReportFeature{}) 155 assert.Error(t, reporter.WaitForResponses()) 156 157 server := httptest.NewServer(create404UsageHandler(t)) 158 defer server.Close() 159 reporter = NewUsageReporter("", &config.ServerDetails{ArtifactoryUrl: server.URL + "/"}).SetSendToEcosystem(false).SetSendToArtifactory(false) 160 reporter.Report(ReportFeature{}) 161 assert.Error(t, reporter.WaitForResponses()) 162 } 163 164 func createXrayUsageHandler(t *testing.T, productId, commandName, clientId string) http.HandlerFunc { 165 return func(w http.ResponseWriter, r *http.Request) { 166 if r.RequestURI == "/api/v1/system/version" { 167 w.WriteHeader(http.StatusOK) 168 _, err := w.Write([]byte(`{"xray_version":"6.9.0"}`)) 169 assert.NoError(t, err) 170 return 171 } 172 if r.RequestURI == "/api/v1/usage/events/send" { 173 // Check request 174 buf := new(bytes.Buffer) 175 _, err := buf.ReadFrom(r.Body) 176 assert.NoError(t, err) 177 featureId := xrayusage.GetExpectedXrayEventName(productId, commandName) 178 assert.Equal(t, fmt.Sprintf(`[{"data":{"clientId":"%s"},"product_name":"%s","event_name":"%s","origin":"API_CLI"}]`, clientId, productId, featureId), buf.String()) 179 180 // Send response OK 181 w.WriteHeader(http.StatusOK) 182 _, err = w.Write([]byte("{}")) 183 assert.NoError(t, err) 184 return 185 } 186 assert.Fail(t, "Unexpected request URI", r.RequestURI) 187 } 188 } 189 190 func TestReportEcosystemUsageError(t *testing.T) { 191 // No features 192 reporter := NewUsageReporter("", &config.ServerDetails{}).SetSendToArtifactory(false).SetSendToXray(false) 193 reporter.Report() 194 assert.NoError(t, reporter.WaitForResponses()) 195 // Empty features 196 reporter.Report(ReportFeature{ 197 FeatureId: "", 198 ClientId: "client", 199 }) 200 assert.Error(t, reporter.WaitForResponses()) 201 } 202 203 func create404UsageHandler(t *testing.T) http.HandlerFunc { 204 return func(w http.ResponseWriter, _ *http.Request) { 205 w.WriteHeader(http.StatusNotFound) 206 } 207 }