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  }