blob: a6ee9e46b2eeb488fdecad9077ae773371b4aafc [file] [log] [blame]
package server
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import (
"net/http"
"strings"
"testing"
"time"
"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/test"
"github.com/jmoiron/sqlx"
"github.com/lib/pq"
"gopkg.in/DATA-DOG/go-sqlmock.v1"
)
func getTestSSCs() []tc.ServerServerCapability {
sscs := []tc.ServerServerCapability{}
testSSC := tc.ServerServerCapability{
LastUpdated: &tc.TimeNoMod{Time: time.Now()},
Server: util.StrPtr("test"),
ServerID: util.IntPtr(1),
ServerCapability: util.StrPtr("test"),
}
sscs = append(sscs, testSSC)
testSSC1 := testSSC
testSSC1.ServerCapability = util.Ptr("blah")
sscs = append(sscs, testSSC1)
return sscs
}
func TestReadSCs(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()
testSCs := getTestSSCs()
rows := sqlmock.NewRows([]string{"server_capability", "server", "last_updated"})
for _, ts := range testSCs {
rows = rows.AddRow(
ts.ServerCapability,
ts.ServerID,
ts.LastUpdated)
}
mock.ExpectBegin()
mock.ExpectQuery("SELECT").WillReturnRows(rows)
mock.ExpectCommit()
reqInfo := api.APIInfo{Tx: db.MustBegin(), Params: map[string]string{"serverId": "1"}}
obj := TOServerServerCapability{
api.APIInfoImpl{ReqInfo: &reqInfo},
tc.ServerServerCapability{},
}
sscs, userErr, sysErr, _, _ := obj.Read(nil, false)
if userErr != nil || sysErr != nil {
t.Errorf("Read expected: no errors, actual: %v %v", userErr, sysErr)
}
if len(sscs) != 2 {
t.Errorf("ServerServerCapability.Read expected: len(scs) == 1, actual: %v", len(sscs))
}
}
func TestInterfaces(t *testing.T) {
var i interface{}
i = &TOServerServerCapability{}
if _, ok := i.(api.Creator); !ok {
t.Errorf("ServerServerCapability must be Creator")
}
if _, ok := i.(api.Reader); !ok {
t.Errorf("ServerServerCapability must be Reader")
}
if _, ok := i.(api.Deleter); !ok {
t.Errorf("ServerServerCapability must be Deleter")
}
if _, ok := i.(api.Identifier); !ok {
t.Errorf("ServerServerCapability must be Identifier")
}
}
func TestFuncs(t *testing.T) {
if strings.Index(scSelectQuery(), "SELECT") != 0 {
t.Errorf("expected selectQuery to start with SELECT")
}
if strings.Index(scInsertQuery(), "INSERT") != 0 {
t.Errorf("expected insertQuery to start with INSERT")
}
if strings.Index(scDeleteQuery(), "DELETE") != 0 {
t.Errorf("expected deleteQuery to start with DELETE")
}
}
func TestValidate(t *testing.T) {
testSSC := tc.ServerServerCapability{
LastUpdated: &tc.TimeNoMod{Time: time.Now()},
Server: util.StrPtr("test1"),
ServerID: util.IntPtr(1),
ServerCapability: util.StrPtr("abc"),
}
testTOSSC := TOServerServerCapability{
ServerServerCapability: testSSC,
}
err, _ := testTOSSC.Validate()
errs := test.SortErrors(test.SplitErrors(err))
if len(errs) > 0 {
t.Errorf(`expected no errors, got %v`, errs)
}
}
func TestCheckExistingServer(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)
}
defer mockDB.Close()
db := sqlx.NewDb(mockDB, "sqlmock")
defer db.Close()
mock.ExpectBegin()
rows := sqlmock.NewRows([]string{"host_name"})
rows.AddRow("test")
mock.ExpectQuery("SELECT host_name").WithArgs(1).WillReturnRows(rows)
rows1 := sqlmock.NewRows([]string{"name"})
rows1.AddRow("ALL")
mock.ExpectQuery("SELECT name").WithArgs(1).WillReturnRows(rows1)
rows2 := sqlmock.NewRows([]string{"username", "soft", "shared_usernames"})
rows2.AddRow("user1", false, []byte("{}"))
mock.ExpectQuery("SELECT c.username, c.soft").WithArgs("ALL").WillReturnRows(rows2)
mock.ExpectCommit()
testSCCs := getTestSSCs()
var sids []int64
sids = append(sids, int64(*testSCCs[0].ServerID))
code, usrErr, sysErr := checkExistingServer(db.MustBegin().Tx, sids, "user1")
if usrErr != nil {
t.Errorf("server not found, error:%v", usrErr)
}
if sysErr != nil {
t.Errorf("unable to check if server exists, error:%v", sysErr)
}
if code != http.StatusOK {
t.Errorf("existing server check failed, expected:%d, got:%d", http.StatusOK, code)
}
}
func TestCheckServerType(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)
}
defer mockDB.Close()
db := sqlx.NewDb(mockDB, "sqlmock")
defer db.Close()
testSCCs := getTestSSCs()
testSCCs[1].ServerID = util.Ptr(2)
testSCCs[1].Server = util.Ptr("foo")
mock.ExpectBegin()
rows := sqlmock.NewRows([]string{"array_agg"})
var sids []int64
for i, _ := range testSCCs {
sids = append(sids, int64(*testSCCs[i].ServerID))
}
rows.AddRow([]byte("{1,2}"))
mock.ExpectQuery("SELECT array_agg").WithArgs(pq.Array(sids)).WillReturnRows(rows)
mock.ExpectCommit()
code, usrErr, sysErr := checkServerType(db.MustBegin().Tx, sids)
if usrErr != nil {
t.Errorf("mismatch in server type, error:%v", usrErr)
}
if sysErr != nil {
t.Errorf("unable to check if server type exists, error:%v", sysErr)
}
if code != http.StatusOK {
t.Errorf("server type check failed, expected:%d, got:%d", http.StatusOK, code)
}
}