github.com/iter8-tools/iter8@v1.1.2/driver/kubedriver_test.go (about)

     1  package driver
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io"
     8  	"net/http"
     9  	"os"
    10  	"testing"
    11  
    12  	"fortio.org/fortio/fhttp"
    13  	"github.com/iter8-tools/iter8/base"
    14  	"github.com/stretchr/testify/assert"
    15  	"helm.sh/helm/v3/pkg/cli"
    16  	corev1 "k8s.io/api/core/v1"
    17  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    18  )
    19  
    20  const (
    21  	myName      = "myName"
    22  	myNamespace = "myNamespace"
    23  )
    24  
    25  func TestKubeRun(t *testing.T) {
    26  	// define METRICS_SERVER_URL
    27  	metricsServerURL := "http://iter8.default:8080"
    28  	err := os.Setenv(base.MetricsServerURL, metricsServerURL)
    29  	assert.NoError(t, err)
    30  
    31  	// create and configure HTTP endpoint for testing
    32  	mux, addr := fhttp.DynamicHTTPServer(false)
    33  	url := fmt.Sprintf("http://127.0.0.1:%d/get", addr.Port)
    34  	var verifyHandlerCalled bool
    35  	mux.HandleFunc("/get", base.GetTrackingHandler(&verifyHandlerCalled))
    36  
    37  	// mock metrics server
    38  	base.StartHTTPMock(t)
    39  	metricsServerCalled := false
    40  	base.MockMetricsServer(base.MockMetricsServerInput{
    41  		MetricsServerURL: metricsServerURL,
    42  		ExperimentResultCallback: func(req *http.Request) {
    43  			metricsServerCalled = true
    44  
    45  			// check query parameters
    46  			assert.Equal(t, myName, req.URL.Query().Get("test"))
    47  			assert.Equal(t, myNamespace, req.URL.Query().Get("namespace"))
    48  
    49  			// check payload
    50  			body, err := io.ReadAll(req.Body)
    51  			assert.NoError(t, err)
    52  			assert.NotNil(t, body)
    53  
    54  			// check payload content
    55  			bodyExperimentResult := base.ExperimentResult{}
    56  			err = json.Unmarshal(body, &bodyExperimentResult)
    57  			assert.NoError(t, err)
    58  			assert.NotNil(t, body)
    59  
    60  			// no experiment failure
    61  			assert.False(t, bodyExperimentResult.Failure)
    62  		},
    63  	})
    64  
    65  	_ = os.Chdir(t.TempDir())
    66  
    67  	// create experiment.yaml
    68  	base.CreateExperimentYaml(t, base.CompletePath("../testdata/drivertests", "experiment.tpl"), url, base.ExperimentFile)
    69  
    70  	kd := NewFakeKubeDriver(cli.New())
    71  	kd.revision = 1
    72  
    73  	byteArray, _ := os.ReadFile(base.ExperimentFile)
    74  	_, _ = kd.Clientset.CoreV1().Secrets("default").Create(context.TODO(), &corev1.Secret{
    75  		ObjectMeta: metav1.ObjectMeta{
    76  			Name:      "default",
    77  			Namespace: "default",
    78  		},
    79  		StringData: map[string]string{base.ExperimentFile: string(byteArray)},
    80  	}, metav1.CreateOptions{})
    81  
    82  	err = base.RunExperiment(kd)
    83  	assert.NoError(t, err)
    84  	// sanity check -- handler was called
    85  	assert.True(t, verifyHandlerCalled)
    86  	assert.True(t, metricsServerCalled)
    87  }