/*
* Copyright 2018-2023 Open Networking Foundation (ONF) and the ONF Contributors

* Licensed 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.
 */
package common

import (
	"github.com/stretchr/testify/assert"
	"strconv"
	sp "strings"
	"testing"
)

const sim = "0123456789abcdefABCDEF"
const rstr = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

func TestGetSerialNumber(t *testing.T) {

	serial := GetRandomSerialNumber()
	assert.NotNil(t, serial)

	sparsed := sp.Split(serial, ".")
	sparsed2 := sparsed[3]

	for i := 0; i <= 2; i++ {
		ioct, _ := strconv.ParseInt(sparsed[i], 10, 0)

		assert.True(t, ioct <= 255 && ioct >= 0, "Octect %d IP octect wrong!", i)
	}

	sp3 := sp.Split(sparsed2, ":")
	oct4, _ := strconv.ParseInt(sp3[0], 10, 0)

	assert.True(t, oct4 <= 255 && oct4 >= 0, "Fourth IP octect wrong!")

	port, _ := strconv.ParseInt(sp3[1], 10, 0)
	assert.True(t, port <= 65535 && port >= 0)
}
func TestGetString(t *testing.T) {
	str := GetRandomString(20)
	strslide := sp.Split(str, "")
	for i := 0; i < len(strslide); i++ {
		assert.True(t, sp.Contains(rstr, strslide[i]), "Error! The string doesn't appears correct --> %s Expected in --> %s", str, rstr)
	}
	assert.NotNil(t, str)
}
func TestGetMacAddress(t *testing.T) {
	mac := GetRandomMacAddress()
	assert.NotNil(t, mac, "Mac address null")
	smac := sp.Split(mac, ":")
	assert.True(t, len(smac) == 6, "mac address not correctly formatted")

	for i := 0; i < len(smac); i++ {
		oct := sp.Split(smac[i], "")
		assert.True(t, sp.Contains(sim, oct[0]))
		assert.True(t, sp.Contains(sim, oct[1]))
	}

}
