169 lines
4.3 KiB
Go
169 lines
4.3 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"sync"
|
|
"time"
|
|
"net"
|
|
)
|
|
|
|
type mysql_db struct {
|
|
Host string `json:"host"`
|
|
Port int `json:"port"`
|
|
User string `json:"user"`
|
|
Password string `json:"password"`
|
|
Db_name string `json:"db_name"`
|
|
}
|
|
|
|
type CameradarConfig struct {
|
|
Mysql_db mysql_db `json:"mysql_db"`
|
|
Subnets string `json:"subnets"`
|
|
Ports string `json:"ports"`
|
|
Rtsp_url_file string `json:"rtsp_url_file"`
|
|
Rtsp_ids_file string `json:"rtsp_ids_file"`
|
|
Thumbnail_storage_path string `json:"thumbnail_storage_path"`
|
|
}
|
|
|
|
type Result struct {
|
|
Address string `json:"address"`
|
|
Password string `json:"password"`
|
|
Port string `json:"port"`
|
|
Route string `json:"route"`
|
|
Username string `json:"username"`
|
|
Valid bool `json:"valid,omitempty"`
|
|
Thumb string `json:"thumbnail_path,omitempty"`
|
|
}
|
|
|
|
type TestCase struct {
|
|
expected []Result
|
|
result []Result
|
|
time time.Duration
|
|
ok bool
|
|
}
|
|
|
|
// Invoke the test
|
|
// Wrap results in a TestResult object
|
|
func (m *manager) invokeTestCase(testCase *TestCase, wg *sync.WaitGroup) {
|
|
startTime := time.Now()
|
|
if m.runTestCase(testCase) {
|
|
testCase.time = time.Since(startTime)
|
|
testCase.ok = true
|
|
fmt.Printf("Test OK in %.6fs\n", testCase.time.Seconds())
|
|
} else {
|
|
testCase.time = time.Since(startTime)
|
|
testCase.ok = false
|
|
fmt.Printf("Test failed in %.6fs\n", testCase.time.Seconds())
|
|
}
|
|
wg.Done()
|
|
}
|
|
|
|
func (m *manager) runTestCase(test *TestCase) bool {
|
|
fmt.Printf("Test triggered\n")
|
|
|
|
Cameradar := m.Config.Cameradar
|
|
startService(&Cameradar)
|
|
|
|
for Cameradar.Active {
|
|
time.Sleep(5 * time.Millisecond)
|
|
}
|
|
found := 0
|
|
toFind := len(test.expected)
|
|
var validResults []Result
|
|
if getResult(&test.result, "result.json") {
|
|
// Check all valid resutls that are supposed to match
|
|
// Add them to the valid results and leave the failed
|
|
// ones in the expected slice
|
|
for _, r := range test.result {
|
|
index := 0
|
|
r.Valid = true
|
|
for _, e := range test.expected {
|
|
e.Thumb = r.Thumb
|
|
var err error
|
|
var addr[] string
|
|
addr, err = net.LookupHost(e.Address)
|
|
e.Address = addr[0]
|
|
if e == r {
|
|
_, err = os.Stat(r.Thumb)
|
|
if err == nil {
|
|
fmt.Println("The result of ", r.Address, " is valid and the thumbnails were generated by Cameradar.")
|
|
found++
|
|
validResults = Extend(validResults, r)
|
|
test.expected = append(test.expected[:index], test.expected[index+1:]...)
|
|
break
|
|
} else {
|
|
fmt.Println("The result of ", r.Address, " seemed valid, but the thumbnails could not be generated by Cameradar.")
|
|
}
|
|
}
|
|
index++
|
|
}
|
|
}
|
|
index := 0
|
|
// If the result did not match the expected but it was supposed to fail
|
|
// Add it to the valid results and remove it from the expected slice
|
|
for _, e := range test.expected {
|
|
if !e.Valid {
|
|
found++
|
|
validResults = Extend(validResults, e)
|
|
test.expected = append(test.expected[:index], test.expected[index+1:]...)
|
|
break
|
|
}
|
|
index++
|
|
}
|
|
// If we found all the expected results, return true
|
|
if found == toFind {
|
|
return true
|
|
}
|
|
test.result = validResults
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (m *manager) generateConfig(test []Result, DataBase *mysql_db) bool {
|
|
var config CameradarConfig
|
|
var db mysql_db
|
|
|
|
db.Host = m.Config.Cameradar.DbHost
|
|
db.Port = m.Config.Cameradar.DbPort
|
|
db.User = m.Config.Cameradar.DbUser
|
|
db.Password = m.Config.Cameradar.DbPassword
|
|
db.Db_name = m.Config.Cameradar.DbName
|
|
|
|
for _, t := range test {
|
|
if len(config.Subnets) > 0 {
|
|
config.Subnets += ","
|
|
}
|
|
config.Subnets += t.Address
|
|
}
|
|
config.Mysql_db = db
|
|
config.Ports = m.Config.Cameradar.Ports
|
|
config.Rtsp_url_file = m.Config.Cameradar.RoutesPath
|
|
config.Rtsp_ids_file = m.Config.Cameradar.IdsPath
|
|
config.Thumbnail_storage_path = m.Config.Cameradar.ThumbPath
|
|
b, _ := json.Marshal(config)
|
|
fmt.Println(string(b))
|
|
err := ioutil.WriteFile("tmp_config", b, 0644)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return false
|
|
}
|
|
*DataBase = db
|
|
return true
|
|
}
|
|
|
|
func Extend(slice []Result, element Result) []Result {
|
|
n := len(slice)
|
|
if n == cap(slice) {
|
|
// Slice is full; must grow.
|
|
// We double its size and add 1, so if the size is zero we still grow.
|
|
newSlice := make([]Result, len(slice), 2*len(slice)+1)
|
|
copy(newSlice, slice)
|
|
slice = newSlice
|
|
}
|
|
slice = slice[0 : n+1]
|
|
slice[n] = element
|
|
return slice
|
|
}
|