This is an automated email from the ASF dual-hosted git repository.
srijeet0406 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git
The following commit(s) were added to refs/heads/master by this push:
new f7765ff008 [TO] Added unit tests for server folder (#7406)
f7765ff008 is described below
commit f7765ff00824d53db283321af91199dbd597c0b2
Author: Rima Shah <[email protected]>
AuthorDate: Wed Mar 22 23:23:04 2023 -0600
[TO] Added unit tests for server folder (#7406)
* Added unit tests for server folder.
* Fix go vet issue.
* updated test case(insertProfile).
* updated test case(updateServer).
* Arranged import and checking the correct error.
---
.../traffic_ops_golang/server/put_status_test.go | 20 ++
.../server/servers_assignment.go | 2 +-
.../server/servers_assignment_test.go | 33 ++
.../traffic_ops_golang/server/servers_test.go | 389 ++++++++++++++++++++-
4 files changed, 441 insertions(+), 3 deletions(-)
diff --git a/traffic_ops/traffic_ops_golang/server/put_status_test.go
b/traffic_ops/traffic_ops_golang/server/put_status_test.go
index 82b81e72a8..def35a57bf 100644
--- a/traffic_ops/traffic_ops_golang/server/put_status_test.go
+++ b/traffic_ops/traffic_ops_golang/server/put_status_test.go
@@ -29,6 +29,26 @@ import (
"gopkg.in/DATA-DOG/go-sqlmock.v1"
)
+func TestInvalidStatusForDeliveryServicesAlertText(t *testing.T) {
+ type testStruct struct {
+ dsId []int
+ expected string
+ }
+
+ var testData = []testStruct{
+ {[]int{0}, " #0 with no 'ONLINE' or 'REPORTED' EDGE servers"},
+ {[]int{0, 1}, "s #0 and #1 with no 'ONLINE' or 'REPORTED' EDGE
servers"},
+ {[]int{0, 1, 2}, "s #0, #1, and #2 with no 'ONLINE' or
'REPORTED' EDGE servers"},
+ }
+
+ for i, _ := range testData {
+ desc := InvalidStatusForDeliveryServicesAlertText("", "EDGE",
testData[i].dsId)
+ if testData[i].expected != desc {
+ t.Errorf("strings don't't match, got:%s; expected:%s",
desc, testData[i].expected)
+ }
+ }
+}
+
func TestCheckExistingStatusInfo(t *testing.T) {
mockDB, mock, err := sqlmock.New()
if err != nil {
diff --git a/traffic_ops/traffic_ops_golang/server/servers_assignment.go
b/traffic_ops/traffic_ops_golang/server/servers_assignment.go
index fe11af3f65..27fa04cafa 100644
--- a/traffic_ops/traffic_ops_golang/server/servers_assignment.go
+++ b/traffic_ops/traffic_ops_golang/server/servers_assignment.go
@@ -310,7 +310,7 @@ func ValidateDSCapabilities(dsIDs []int, serverName string,
tx *sql.Tx) (error,
}
}
- return nil, nil, 0
+ return nil, nil, http.StatusOK
}
func assignDeliveryServicesToServer(server int, dses []int, replace bool, tx
*sql.Tx) ([]int, error) {
diff --git a/traffic_ops/traffic_ops_golang/server/servers_assignment_test.go
b/traffic_ops/traffic_ops_golang/server/servers_assignment_test.go
index 09027be538..5c387479da 100644
--- a/traffic_ops/traffic_ops_golang/server/servers_assignment_test.go
+++ b/traffic_ops/traffic_ops_golang/server/servers_assignment_test.go
@@ -183,3 +183,36 @@ func TestCheckTenancyAndCDN(t *testing.T) {
t.Errorf("tenancy and cdn check for a given user failed with
status code:%d", code)
}
}
+
+func TestValidateDSCapabilities(t *testing.T) {
+ mockDB, mock, err := sqlmock.New()
+ if err != nil {
+ t.Fatalf("an error '%v' was not expected when opening a stub
database connection", err)
+ }
+ defer mockDB.Close()
+
+ db := sqlx.NewDb(mockDB, "sqlmock")
+ defer db.Close()
+
+ mock.ExpectBegin()
+ rows := sqlmock.NewRows([]string{"server_capability"})
+ rows.AddRow([]byte("{eas}"))
+ mock.ExpectQuery("SELECT").WithArgs("eas").WillReturnRows(rows)
+
+ dsIDs := []int64{1}
+ rows1 := sqlmock.NewRows([]string{"id", "required_capabilities"})
+ rows1.AddRow(1, []byte("{eas}"))
+ mock.ExpectQuery("SELECT
").WithArgs(pq.Array(dsIDs)).WillReturnRows(rows1)
+ mock.ExpectCommit()
+
+ usrErr, sysErr, code := ValidateDSCapabilities([]int{1}, "eas",
db.MustBegin().Tx)
+ if usrErr != nil {
+ t.Errorf("unable to validate DS capability, most likely cache
doesn't have the DS capability, error: %v", usrErr)
+ }
+ if sysErr != nil {
+ t.Errorf("unable to validate DS Capability, system error: %v",
sysErr)
+ }
+ if code != http.StatusOK {
+ t.Errorf("DS validation failed with status code:%d", code)
+ }
+}
diff --git a/traffic_ops/traffic_ops_golang/server/servers_test.go
b/traffic_ops/traffic_ops_golang/server/servers_test.go
index 25e4f5dda7..bc15429d9c 100644
--- a/traffic_ops/traffic_ops_golang/server/servers_test.go
+++ b/traffic_ops/traffic_ops_golang/server/servers_test.go
@@ -28,10 +28,11 @@ import (
"github.com/apache/trafficcontrol/lib/go-tc"
"github.com/apache/trafficcontrol/lib/go-util"
-
"github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/api"
"github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang/auth"
+
"github.com/jmoiron/sqlx"
+ "github.com/lib/pq"
"gopkg.in/DATA-DOG/go-sqlmock.v1"
)
@@ -119,7 +120,7 @@ func getTestServers() []ServerAndInterfaces {
}
// Test to make sure that updating the "cdn" of a server already assigned to a
DS fails
-func TestUpdateServer(t *testing.T) {
+func TestCheckTypeChangeSafety(t *testing.T) {
mockDB, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub
database connection", err)
@@ -722,3 +723,387 @@ func (s SortableServers) Swap(i, j int) {
func (s SortableServers) Less(i, j int) bool {
return s[i].HostName < s[j].HostName
}
+
+func TestUpdateStatusLastUpdatedTime(t *testing.T) {
+ mockDB, mock, err := sqlmock.New()
+ if err != nil {
+ t.Fatalf("an error '%v' was not expected when opening a stub
database connection", err)
+ }
+ defer mockDB.Close()
+
+ db := sqlx.NewDb(mockDB, "sqlmock")
+ defer db.Close()
+
+ lastUpdated := time.Now()
+ mock.ExpectBegin()
+ mock.ExpectExec("UPDATE").WithArgs(lastUpdated,
1).WillReturnResult(sqlmock.NewResult(1, 1))
+ mock.ExpectCommit()
+
+ sysErr, _, code := updateStatusLastUpdatedTime(1, &lastUpdated,
db.MustBegin().Tx)
+ if sysErr != nil {
+ t.Errorf("unable to update time, system error: %v", sysErr)
+ }
+ if code != http.StatusOK {
+ t.Errorf("updated time failed with status code:%d", code)
+ }
+}
+
+func TestCreateInterfaces(t *testing.T) {
+ mockDB, mock, err := sqlmock.New()
+ if err != nil {
+ t.Fatalf("an error '%v' was not expected when opening a stub
database connection", err)
+ }
+ defer mockDB.Close()
+
+ db := sqlx.NewDb(mockDB, "sqlmock")
+ defer db.Close()
+
+ testInterface := getTestServers()[0].Interface
+ var iface []tc.ServerInterfaceInfoV40
+ iface = append(iface, testInterface)
+
+ mock.ExpectBegin()
+ mock.ExpectExec("INSERT INTO interface").
+ WithArgs(iface[0].MaxBandwidth, iface[0].Monitor, iface[0].MTU,
iface[0].Name, 1, iface[0].RouterHostName, iface[0].RouterPortName).
+ WillReturnResult(sqlmock.NewResult(1, 1))
+
+ mock.ExpectExec("INSERT INTO ip_address").
+ WithArgs(iface[0].IPAddresses[0].Address,
iface[0].IPAddresses[0].Gateway, iface[0].Name, 1,
iface[0].IPAddresses[0].ServiceAddress).
+ WillReturnResult(sqlmock.NewResult(1, 1))
+ mock.ExpectCommit()
+
+ usrErr, sysErr, code := createInterfaces(1, iface, db.MustBegin().Tx)
+ if usrErr != nil {
+ t.Errorf("unable to create interface, user error: %v", usrErr)
+ }
+ if sysErr != nil {
+ t.Errorf("unable to create interface, system error: %v", sysErr)
+ }
+ if code != http.StatusOK {
+ t.Errorf("unable to create interface, failed with status
code:%d", code)
+ }
+}
+
+func TestDeleteInterfaces(t *testing.T) {
+ mockDB, mock, err := sqlmock.New()
+ if err != nil {
+ t.Fatalf("an error '%v' was not expected when opening a stub
database connection", err)
+ }
+ defer mockDB.Close()
+
+ db := sqlx.NewDb(mockDB, "sqlmock")
+ defer db.Close()
+
+ mock.ExpectBegin()
+ mock.ExpectExec("DELETE FROM
ip_address").WithArgs(1).WillReturnResult(sqlmock.NewResult(1, 1))
+
+ mock.ExpectExec("DELETE FROM
interface").WithArgs(1).WillReturnResult(sqlmock.NewResult(1, 1))
+ mock.ExpectCommit()
+
+ usrErr, sysErr, code := deleteInterfaces(1, db.MustBegin().Tx)
+ if usrErr != nil {
+ t.Errorf("unable to delete interface, user error: %v", usrErr)
+ }
+ if sysErr != nil {
+ t.Errorf("unable to delete interface, system error: %v", sysErr)
+ }
+ if code != http.StatusOK {
+ t.Errorf("unable to delete interface, failed with status
code:%d", code)
+ }
+}
+
+func TestInsertServerProfile(t *testing.T) {
+ mockDB, mock, err := sqlmock.New()
+ if err != nil {
+ t.Fatalf("an error '%v' was not expected when opening a stub
database connection", err)
+ }
+ defer mockDB.Close()
+
+ db := sqlx.NewDb(mockDB, "sqlmock")
+ defer db.Close()
+
+ profileName := []string{"traffic_ops", "global"}
+ priority := []int{0, 1}
+ mock.ExpectBegin()
+ mock.ExpectExec("INSERT INTO").WithArgs(1, pq.Array(profileName),
pq.Array(priority)).WillReturnResult(sqlmock.NewResult(2, 2))
+ mock.ExpectCommit()
+
+ usrErr, sysErr, code := insertServerProfile(1, profileName,
db.MustBegin().Tx)
+ if usrErr != nil {
+ t.Errorf("unable to insert profile, user error: %v", usrErr)
+ }
+ if sysErr != nil {
+ t.Errorf("unable to insert profile, system error: %v", sysErr)
+ }
+ if code != http.StatusOK {
+ t.Errorf("unable to insert profile, failed with status
code:%d", code)
+ }
+}
+
+func TestCreateServerV4(t *testing.T) {
+ mockDB, mock, err := sqlmock.New()
+ if err != nil {
+ t.Fatalf("an error '%v' was not expected when opening a stub
database connection", err)
+ }
+ defer mockDB.Close()
+
+ db := sqlx.NewDb(mockDB, "sqlmock")
+ defer db.Close()
+
+ s4 := getTestServers()[0].Server
+
+ mock.ExpectBegin()
+ rows0 := sqlmock.NewRows([]string{"id"})
+ rows0.AddRow(1)
+
mock.ExpectQuery("SELECT").WithArgs(s4.ProfileNames[0]).WillReturnRows(rows0)
+
+ rows := sqlmock.NewRows([]string{
+ "cachegroup",
+ "cachegroup_id",
+ "cdn_id",
+ "cdn_name",
+ "domain_name",
+ "guid",
+ "host_name",
+ "https_port",
+ "id",
+ "ilo_ip_address",
+ "ilo_ip_gateway",
+ "ilo_ip_netmask",
+ "ilo_password",
+ "ilo_username",
+ "last_updated",
+ "mgmt_ip_address",
+ "mgmt_ip_gateway",
+ "mgmt_ip_netmask",
+ "offline_reason",
+ "phys_location",
+ "phys_location_id",
+ "profile_name",
+ "rack",
+ "status",
+ "status_id",
+ "tcp_port",
+ "server_type",
+ "server_type_id",
+ })
+ rows.AddRow(
+ *s4.Cachegroup,
+ *s4.CachegroupID,
+ *s4.CDNID,
+ *s4.CDNName,
+ *s4.DomainName,
+ *s4.GUID,
+ *s4.HostName,
+ *s4.HTTPSPort,
+ *s4.ID,
+ *s4.ILOIPAddress,
+ *s4.ILOIPGateway,
+ *s4.ILOIPNetmask,
+ *s4.ILOPassword,
+ *s4.ILOUsername,
+ *s4.LastUpdated,
+ *s4.MgmtIPAddress,
+ *s4.MgmtIPGateway,
+ *s4.MgmtIPNetmask,
+ *s4.OfflineReason,
+ *s4.PhysLocation,
+ *s4.PhysLocationID,
+ fmt.Sprintf("{%s}", strings.Join(s4.ProfileNames, ",")),
+ *s4.Rack,
+ *s4.Status,
+ *s4.StatusID,
+ *s4.TCPPort,
+ s4.Type,
+ *s4.TypeID,
+ )
+ mock.ExpectQuery("INSERT INTO server").
+ WithArgs(*s4.CachegroupID, *s4.CDNID, *s4.DomainName,
*s4.HostName, *s4.HTTPSPort, *s4.ILOIPAddress,
+ *s4.ILOIPNetmask, *s4.ILOIPGateway, *s4.ILOUsername,
*s4.ILOPassword, *s4.MgmtIPAddress,
+ *s4.MgmtIPNetmask, *s4.MgmtIPGateway,
*s4.OfflineReason, *s4.PhysLocationID, 1, *s4.Rack,
+ *s4.StatusID, *s4.TCPPort, *s4.TypeID, *s4.XMPPID,
*s4.XMPPPasswd).
+ WillReturnRows(rows)
+ mock.ExpectCommit()
+
+ sid, err := createServerV4(db.MustBegin(), s4)
+ if err != nil {
+ t.Errorf("unable to create v4 server, error: %v", err)
+ }
+ if sid != int64(*s4.ID) {
+ t.Errorf("mismatched server ID, expected: %d, got: %d", *s4.ID,
sid)
+ }
+}
+
+func TestCreateServerV3(t *testing.T) {
+ mockDB, mock, err := sqlmock.New()
+ if err != nil {
+ t.Fatalf("an error '%v' was not expected when opening a stub
database connection", err)
+ }
+ defer mockDB.Close()
+
+ db := sqlx.NewDb(mockDB, "sqlmock")
+ defer db.Close()
+
+ s3 := tc.ServerV30{
+ CommonServerProperties: tc.CommonServerProperties{
+ Cachegroup: util.Ptr("mb"),
+ CachegroupID: util.Ptr(1),
+ CDNID: util.Ptr(1),
+ CDNName: util.Ptr("ALL"),
+ DeliveryServices: nil,
+ DomainName: util.Ptr(""),
+ FQDN: nil,
+ FqdnTime: time.Time{},
+ GUID: util.Ptr(""),
+ HostName: util.Ptr("test"),
+ HTTPSPort: util.Ptr(8443),
+ ID: util.Ptr(1),
+ ILOIPAddress: util.Ptr(""),
+ ILOIPGateway: util.Ptr(""),
+ ILOIPNetmask: util.Ptr(""),
+ ILOPassword: util.Ptr(""),
+ ILOUsername: util.Ptr(""),
+ LastUpdated: util.Ptr(tc.TimeNoMod{}),
+ MgmtIPAddress: util.Ptr(""),
+ MgmtIPGateway: util.Ptr(""),
+ MgmtIPNetmask: util.Ptr(""),
+ OfflineReason: util.Ptr(""),
+ PhysLocation: util.Ptr("boulder"),
+ PhysLocationID: util.Ptr(1),
+ Profile: util.Ptr("GLOBAL"),
+ ProfileDesc: nil,
+ ProfileID: util.Ptr(1),
+ Rack: util.Ptr(""),
+ RevalPending: util.Ptr(false),
+ Status: util.Ptr("ACTIVE"),
+ StatusID: util.Ptr(1),
+ TCPPort: util.Ptr(8080),
+ Type: "EDGE",
+ TypeID: util.Ptr(2),
+ UpdPending: util.Ptr(false),
+ XMPPID: util.Ptr(""),
+ XMPPPasswd: util.Ptr(""),
+ },
+ RouterHostName: util.Ptr(""),
+ RouterPortName: util.Ptr(""),
+ Interfaces: []tc.ServerInterfaceInfo{},
+ StatusLastUpdated: util.Ptr(time.Time{}),
+ }
+
+ mock.ExpectBegin()
+ rows := sqlmock.NewRows([]string{"id"})
+ rows.AddRow(1)
+ mock.ExpectQuery("INSERT INTO server").
+ WithArgs(*s3.CachegroupID, *s3.CDNID, *s3.DomainName,
*s3.HostName, *s3.HTTPSPort, *s3.ILOIPAddress,
+ *s3.ILOIPNetmask, *s3.ILOIPGateway, *s3.ILOUsername,
*s3.ILOPassword, *s3.MgmtIPAddress,
+ *s3.MgmtIPNetmask, *s3.MgmtIPGateway,
*s3.OfflineReason, *s3.PhysLocationID, *s3.ProfileID,
+ *s3.Rack, *s3.StatusID, *s3.TCPPort, *s3.TypeID,
*s3.XMPPID, *s3.XMPPPasswd, *s3.StatusLastUpdated).
+ WillReturnRows(rows)
+ mock.ExpectCommit()
+
+ sid, err := createServerV3(db.MustBegin(), s3)
+ if err != nil {
+ t.Errorf("unable to create v3 server, error: %v", err)
+ }
+ if sid != int64(*s3.ID) {
+ t.Errorf("mismatched server ID, expected: %d, got: %d", *s3.ID,
sid)
+ }
+}
+
+func TestUpdateServer(t *testing.T) {
+ mockDB, mock, err := sqlmock.New()
+ if err != nil {
+ t.Fatalf("an error '%v' was not expected when opening a stub
database connection", err)
+ }
+ defer mockDB.Close()
+
+ db := sqlx.NewDb(mockDB, "sqlmock")
+ defer db.Close()
+
+ s4 := getTestServers()[0].Server
+
+ mock.ExpectBegin()
+ rows := sqlmock.NewRows([]string{
+ "cachegroup",
+ "cachegroup_id",
+ "cdn_id",
+ "cdn_name",
+ "domain_name",
+ "guid",
+ "host_name",
+ "https_port",
+ "id",
+ "ilo_ip_address",
+ "ilo_ip_gateway",
+ "ilo_ip_netmask",
+ "ilo_password",
+ "ilo_username",
+ "last_updated",
+ "mgmt_ip_address",
+ "mgmt_ip_gateway",
+ "mgmt_ip_netmask",
+ "offline_reason",
+ "phys_location",
+ "phys_location_id",
+ "profile_name",
+ "rack",
+ "status",
+ "status_id",
+ "tcp_port",
+ "server_type",
+ "server_type_id",
+ "status_last_updated",
+ })
+ rows.AddRow(
+ *s4.Cachegroup,
+ *s4.CachegroupID,
+ *s4.CDNID,
+ *s4.CDNName,
+ *s4.DomainName,
+ *s4.GUID,
+ *s4.HostName,
+ *s4.HTTPSPort,
+ *s4.ID,
+ *s4.ILOIPAddress,
+ *s4.ILOIPGateway,
+ *s4.ILOIPNetmask,
+ *s4.ILOPassword,
+ *s4.ILOUsername,
+ *s4.LastUpdated,
+ *s4.MgmtIPAddress,
+ *s4.MgmtIPGateway,
+ *s4.MgmtIPNetmask,
+ *s4.OfflineReason,
+ *s4.PhysLocation,
+ *s4.PhysLocationID,
+ fmt.Sprintf("{%s}", strings.Join(s4.ProfileNames, ",")),
+ *s4.Rack,
+ *s4.Status,
+ *s4.StatusID,
+ *s4.TCPPort,
+ s4.Type,
+ *s4.TypeID,
+ *s4.StatusLastUpdated,
+ )
+ mock.ExpectQuery("UPDATE server SET").
+ WithArgs(*s4.CachegroupID, *s4.CDNID, *s4.DomainName,
*s4.HostName, *s4.HTTPSPort, *s4.ILOIPAddress,
+ *s4.ILOIPNetmask, *s4.ILOIPGateway, *s4.ILOUsername,
*s4.ILOPassword, *s4.MgmtIPAddress,
+ *s4.MgmtIPNetmask, *s4.MgmtIPGateway,
*s4.OfflineReason, *s4.PhysLocationID, 1, *s4.Rack,
+ *s4.StatusID, *s4.TCPPort, *s4.TypeID, *s4.XMPPPasswd,
*s4.StatusLastUpdated, *s4.ID).
+ WillReturnRows(rows)
+ mock.ExpectCommit()
+
+ sid, code, usrErr, sysErr := updateServer(db.MustBegin(), s4)
+ if usrErr != nil {
+ t.Errorf("unable to update v4 server, user error: %v", usrErr)
+ }
+ if sysErr != nil {
+ t.Errorf("unable to update v4 server, system error: %v", sysErr)
+ }
+ if sid != int64(*s4.ID) {
+ t.Errorf("updated incorrect server, expected:%d, got:%d",
*s4.ID, sid)
+ }
+ if code != http.StatusOK {
+ t.Errorf("failed to update server with id:%d, expected: %d,
got: %d", *s4.ID, http.StatusOK, code)
+ }
+}