github.com/deemoprobe/k8s-first-commit@v0.0.0-20230430165612-a541f1982be3/pkg/client/client_test.go (about)

     1  /*
     2  Copyright 2014 Google Inc. All rights reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  package client
    17  
    18  import (
    19  	"encoding/json"
    20  	"net/http/httptest"
    21  	"net/url"
    22  	"reflect"
    23  	"testing"
    24  
    25  	"github.com/GoogleCloudPlatform/kubernetes/pkg/api"
    26  	"github.com/GoogleCloudPlatform/kubernetes/pkg/util"
    27  )
    28  
    29  // TODO: This doesn't reduce typing enough to make it worth the less readable errors. Remove.
    30  func expectNoError(t *testing.T, err error) {
    31  	if err != nil {
    32  		t.Errorf("Unexpected error: %#v", err)
    33  	}
    34  }
    35  
    36  // TODO: Move this to a common place, it's needed in multiple tests.
    37  var apiPath = "/api/v1beta1"
    38  
    39  func makeUrl(suffix string) string {
    40  	return apiPath + suffix
    41  }
    42  
    43  func TestListEmptyTasks(t *testing.T) {
    44  	fakeHandler := util.FakeHandler{
    45  		StatusCode:   200,
    46  		ResponseBody: `{ "items": []}`,
    47  	}
    48  	testServer := httptest.NewTLSServer(&fakeHandler)
    49  	client := Client{
    50  		Host: testServer.URL,
    51  	}
    52  	taskList, err := client.ListTasks(nil)
    53  	fakeHandler.ValidateRequest(t, makeUrl("/tasks"), "GET", nil)
    54  	if err != nil {
    55  		t.Errorf("Unexpected error in listing tasks: %#v", err)
    56  	}
    57  	if len(taskList.Items) != 0 {
    58  		t.Errorf("Unexpected items in task list: %#v", taskList)
    59  	}
    60  	testServer.Close()
    61  }
    62  
    63  func TestListTasks(t *testing.T) {
    64  	expectedTaskList := api.TaskList{
    65  		Items: []api.Task{
    66  			api.Task{
    67  				CurrentState: api.TaskState{
    68  					Status: "Foobar",
    69  				},
    70  				Labels: map[string]string{
    71  					"foo":  "bar",
    72  					"name": "baz",
    73  				},
    74  			},
    75  		},
    76  	}
    77  	body, _ := json.Marshal(expectedTaskList)
    78  	fakeHandler := util.FakeHandler{
    79  		StatusCode:   200,
    80  		ResponseBody: string(body),
    81  	}
    82  	testServer := httptest.NewTLSServer(&fakeHandler)
    83  	client := Client{
    84  		Host: testServer.URL,
    85  	}
    86  	receivedTaskList, err := client.ListTasks(nil)
    87  	fakeHandler.ValidateRequest(t, makeUrl("/tasks"), "GET", nil)
    88  	if err != nil {
    89  		t.Errorf("Unexpected error in listing tasks: %#v", err)
    90  	}
    91  	if !reflect.DeepEqual(expectedTaskList, receivedTaskList) {
    92  		t.Errorf("Unexpected task list: %#v\nvs.\n%#v", receivedTaskList, expectedTaskList)
    93  	}
    94  	testServer.Close()
    95  }
    96  
    97  func TestListTasksLabels(t *testing.T) {
    98  	expectedTaskList := api.TaskList{
    99  		Items: []api.Task{
   100  			api.Task{
   101  				CurrentState: api.TaskState{
   102  					Status: "Foobar",
   103  				},
   104  				Labels: map[string]string{
   105  					"foo":  "bar",
   106  					"name": "baz",
   107  				},
   108  			},
   109  		},
   110  	}
   111  	body, _ := json.Marshal(expectedTaskList)
   112  	fakeHandler := util.FakeHandler{
   113  		StatusCode:   200,
   114  		ResponseBody: string(body),
   115  	}
   116  	testServer := httptest.NewTLSServer(&fakeHandler)
   117  	client := Client{
   118  		Host: testServer.URL,
   119  	}
   120  	query := map[string]string{"foo": "bar", "name": "baz"}
   121  	receivedTaskList, err := client.ListTasks(query)
   122  	fakeHandler.ValidateRequest(t, makeUrl("/tasks"), "GET", nil)
   123  	queryString := fakeHandler.RequestReceived.URL.Query().Get("labels")
   124  	queryString, _ = url.QueryUnescape(queryString)
   125  	// TODO(bburns) : This assumes some ordering in serialization that might not always
   126  	// be true, parse it into a map.
   127  	if queryString != "foo=bar,name=baz" {
   128  		t.Errorf("Unexpected label query: %s", queryString)
   129  	}
   130  	if err != nil {
   131  		t.Errorf("Unexpected error in listing tasks: %#v", err)
   132  	}
   133  	if !reflect.DeepEqual(expectedTaskList, receivedTaskList) {
   134  		t.Errorf("Unexpected task list: %#v\nvs.\n%#v", receivedTaskList, expectedTaskList)
   135  	}
   136  	testServer.Close()
   137  }
   138  
   139  func TestGetTask(t *testing.T) {
   140  	expectedTask := api.Task{
   141  		CurrentState: api.TaskState{
   142  			Status: "Foobar",
   143  		},
   144  		Labels: map[string]string{
   145  			"foo":  "bar",
   146  			"name": "baz",
   147  		},
   148  	}
   149  	body, _ := json.Marshal(expectedTask)
   150  	fakeHandler := util.FakeHandler{
   151  		StatusCode:   200,
   152  		ResponseBody: string(body),
   153  	}
   154  	testServer := httptest.NewTLSServer(&fakeHandler)
   155  	client := Client{
   156  		Host: testServer.URL,
   157  	}
   158  	receivedTask, err := client.GetTask("foo")
   159  	fakeHandler.ValidateRequest(t, makeUrl("/tasks/foo"), "GET", nil)
   160  	if err != nil {
   161  		t.Errorf("Unexpected error: %#v", err)
   162  	}
   163  	if !reflect.DeepEqual(expectedTask, receivedTask) {
   164  		t.Errorf("Received task: %#v\n doesn't match expected task: %#v", receivedTask, expectedTask)
   165  	}
   166  	testServer.Close()
   167  }
   168  
   169  func TestDeleteTask(t *testing.T) {
   170  	fakeHandler := util.FakeHandler{
   171  		StatusCode:   200,
   172  		ResponseBody: `{"success": true}`,
   173  	}
   174  	testServer := httptest.NewTLSServer(&fakeHandler)
   175  	client := Client{
   176  		Host: testServer.URL,
   177  	}
   178  	err := client.DeleteTask("foo")
   179  	fakeHandler.ValidateRequest(t, makeUrl("/tasks/foo"), "DELETE", nil)
   180  	if err != nil {
   181  		t.Errorf("Unexpected error: %#v", err)
   182  	}
   183  	testServer.Close()
   184  }
   185  
   186  func TestCreateTask(t *testing.T) {
   187  	requestTask := api.Task{
   188  		CurrentState: api.TaskState{
   189  			Status: "Foobar",
   190  		},
   191  		Labels: map[string]string{
   192  			"foo":  "bar",
   193  			"name": "baz",
   194  		},
   195  	}
   196  	body, _ := json.Marshal(requestTask)
   197  	fakeHandler := util.FakeHandler{
   198  		StatusCode:   200,
   199  		ResponseBody: string(body),
   200  	}
   201  	testServer := httptest.NewTLSServer(&fakeHandler)
   202  	client := Client{
   203  		Host: testServer.URL,
   204  	}
   205  	receivedTask, err := client.CreateTask(requestTask)
   206  	fakeHandler.ValidateRequest(t, makeUrl("/tasks"), "POST", nil)
   207  	if err != nil {
   208  		t.Errorf("Unexpected error: %#v", err)
   209  	}
   210  	if !reflect.DeepEqual(requestTask, receivedTask) {
   211  		t.Errorf("Received task: %#v\n doesn't match expected task: %#v", receivedTask, requestTask)
   212  	}
   213  	testServer.Close()
   214  }
   215  
   216  func TestUpdateTask(t *testing.T) {
   217  	requestTask := api.Task{
   218  		JSONBase: api.JSONBase{ID: "foo"},
   219  		CurrentState: api.TaskState{
   220  			Status: "Foobar",
   221  		},
   222  		Labels: map[string]string{
   223  			"foo":  "bar",
   224  			"name": "baz",
   225  		},
   226  	}
   227  	body, _ := json.Marshal(requestTask)
   228  	fakeHandler := util.FakeHandler{
   229  		StatusCode:   200,
   230  		ResponseBody: string(body),
   231  	}
   232  	testServer := httptest.NewTLSServer(&fakeHandler)
   233  	client := Client{
   234  		Host: testServer.URL,
   235  	}
   236  	receivedTask, err := client.UpdateTask(requestTask)
   237  	fakeHandler.ValidateRequest(t, makeUrl("/tasks/foo"), "PUT", nil)
   238  	if err != nil {
   239  		t.Errorf("Unexpected error: %#v", err)
   240  	}
   241  	expectEqual(t, requestTask, receivedTask)
   242  	testServer.Close()
   243  }
   244  
   245  func expectEqual(t *testing.T, expected, observed interface{}) {
   246  	if !reflect.DeepEqual(expected, observed) {
   247  		t.Errorf("Unexpected inequality.  Expected: %#v Observed: %#v", expected, observed)
   248  	}
   249  }
   250  
   251  func TestEncodeDecodeLabelQuery(t *testing.T) {
   252  	queryIn := map[string]string{
   253  		"foo": "bar",
   254  		"baz": "blah",
   255  	}
   256  	queryString, _ := url.QueryUnescape(EncodeLabelQuery(queryIn))
   257  	queryOut := DecodeLabelQuery(queryString)
   258  	expectEqual(t, queryIn, queryOut)
   259  }
   260  
   261  func TestDecodeEmpty(t *testing.T) {
   262  	query := DecodeLabelQuery("")
   263  	if len(query) != 0 {
   264  		t.Errorf("Unexpected query: %#v", query)
   265  	}
   266  }
   267  
   268  func TestDecodeBad(t *testing.T) {
   269  	query := DecodeLabelQuery("foo")
   270  	if len(query) != 0 {
   271  		t.Errorf("Unexpected query: %#v", query)
   272  	}
   273  }
   274  
   275  func TestGetController(t *testing.T) {
   276  	expectedController := api.ReplicationController{
   277  		JSONBase: api.JSONBase{
   278  			ID: "foo",
   279  		},
   280  		DesiredState: api.ReplicationControllerState{
   281  			Replicas: 2,
   282  		},
   283  		Labels: map[string]string{
   284  			"foo":  "bar",
   285  			"name": "baz",
   286  		},
   287  	}
   288  	body, _ := json.Marshal(expectedController)
   289  	fakeHandler := util.FakeHandler{
   290  		StatusCode:   200,
   291  		ResponseBody: string(body),
   292  	}
   293  	testServer := httptest.NewTLSServer(&fakeHandler)
   294  	client := Client{
   295  		Host: testServer.URL,
   296  	}
   297  	receivedController, err := client.GetReplicationController("foo")
   298  	expectNoError(t, err)
   299  	if !reflect.DeepEqual(expectedController, receivedController) {
   300  		t.Errorf("Unexpected controller, expected: %#v, received %#v", expectedController, receivedController)
   301  	}
   302  	fakeHandler.ValidateRequest(t, makeUrl("/replicationControllers/foo"), "GET", nil)
   303  	testServer.Close()
   304  }
   305  
   306  func TestUpdateController(t *testing.T) {
   307  	expectedController := api.ReplicationController{
   308  		JSONBase: api.JSONBase{
   309  			ID: "foo",
   310  		},
   311  		DesiredState: api.ReplicationControllerState{
   312  			Replicas: 2,
   313  		},
   314  		Labels: map[string]string{
   315  			"foo":  "bar",
   316  			"name": "baz",
   317  		},
   318  	}
   319  	body, _ := json.Marshal(expectedController)
   320  	fakeHandler := util.FakeHandler{
   321  		StatusCode:   200,
   322  		ResponseBody: string(body),
   323  	}
   324  	testServer := httptest.NewTLSServer(&fakeHandler)
   325  	client := Client{
   326  		Host: testServer.URL,
   327  	}
   328  	receivedController, err := client.UpdateReplicationController(api.ReplicationController{
   329  		JSONBase: api.JSONBase{
   330  			ID: "foo",
   331  		},
   332  	})
   333  	expectNoError(t, err)
   334  	if !reflect.DeepEqual(expectedController, receivedController) {
   335  		t.Errorf("Unexpected controller, expected: %#v, received %#v", expectedController, receivedController)
   336  	}
   337  	fakeHandler.ValidateRequest(t, makeUrl("/replicationControllers/foo"), "PUT", nil)
   338  	testServer.Close()
   339  }
   340  
   341  func TestDeleteController(t *testing.T) {
   342  	fakeHandler := util.FakeHandler{
   343  		StatusCode:   200,
   344  		ResponseBody: `{"success": true}`,
   345  	}
   346  	testServer := httptest.NewTLSServer(&fakeHandler)
   347  	client := Client{
   348  		Host: testServer.URL,
   349  	}
   350  	err := client.DeleteReplicationController("foo")
   351  	fakeHandler.ValidateRequest(t, makeUrl("/replicationControllers/foo"), "DELETE", nil)
   352  	if err != nil {
   353  		t.Errorf("Unexpected error: %#v", err)
   354  	}
   355  	testServer.Close()
   356  }
   357  
   358  func TestCreateController(t *testing.T) {
   359  	expectedController := api.ReplicationController{
   360  		JSONBase: api.JSONBase{
   361  			ID: "foo",
   362  		},
   363  		DesiredState: api.ReplicationControllerState{
   364  			Replicas: 2,
   365  		},
   366  		Labels: map[string]string{
   367  			"foo":  "bar",
   368  			"name": "baz",
   369  		},
   370  	}
   371  	body, _ := json.Marshal(expectedController)
   372  	fakeHandler := util.FakeHandler{
   373  		StatusCode:   200,
   374  		ResponseBody: string(body),
   375  	}
   376  	testServer := httptest.NewTLSServer(&fakeHandler)
   377  	client := Client{
   378  		Host: testServer.URL,
   379  	}
   380  	receivedController, err := client.CreateReplicationController(api.ReplicationController{
   381  		JSONBase: api.JSONBase{
   382  			ID: "foo",
   383  		},
   384  	})
   385  	expectNoError(t, err)
   386  	if !reflect.DeepEqual(expectedController, receivedController) {
   387  		t.Errorf("Unexpected controller, expected: %#v, received %#v", expectedController, receivedController)
   388  	}
   389  	fakeHandler.ValidateRequest(t, makeUrl("/replicationControllers"), "POST", nil)
   390  	testServer.Close()
   391  }