File: init.go

package info (click to toggle)
ospd-openvas 22.9.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,648 kB
  • sloc: python: 14,197; xml: 1,913; makefile: 45; sh: 29
file content (176 lines) | stat: -rw-r--r-- 4,329 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
// SPDX-FileCopyrightText: 2023 Greenbone AG
//
// SPDX-License-Identifier: AGPL-3.0-or-later

package usecases

import (
	"fmt"

	"github.com/greenbone/ospd-openvas/smoketest/connection"
	"github.com/greenbone/ospd-openvas/smoketest/scan"
)

type Runner func(connection.OSPDSender) Response

type Test struct {
	Title string
	Run   Runner
}

type Response struct {
	Success     bool
	Description string
}

type Tests struct {
	Title    string
	UseCases []Test
}

func (ouc Tests) Run(co connection.OSPDSender) []Response {
	result := make([]Response, len(ouc.UseCases))
	fmt.Printf("Testing %s\n", ouc.Title)
	for i, t := range ouc.UseCases {
		fmt.Printf("\t%s\t", t.Title)
		result[i] = t.Run(co)
		if !result[i].Success {
			fmt.Printf("\x1B[31mX\x1B[0m\n")
		} else {
			fmt.Printf("\x1B[32m✓\x1B[0m\n")
		}
	}
	return result
}
func WrongStatusCodeResponse(response scan.StatusCodeResponse) *Response {
	return &Response{
		Success:     false,
		Description: fmt.Sprintf("Wrong status code(%s): %s", response.Code, response.Text),
	}
}

func WrongScanStatus(expected, got string) *Response {
	return &Response{
		Success:     false,
		Description: fmt.Sprintf("Expected %s but got %s as a Scan.Status", expected, got),
	}

}

func ScanStatusFinished(status string) bool {
	switch status {
	case "interrupted", "finished", "stopped", "failed":
		return true
	default:
		return false
	}
}

type GetScanResponseFailure struct {
	Resp    scan.GetScansResponse
	Failure *Response
}

func VerifyGet(get scan.GetScans, co connection.OSPDSender, status string) GetScanResponseFailure {
	var result GetScanResponseFailure
	if err := co.SendCommand(get, &result.Resp); err != nil {
		panic(err)
	}
	if result.Resp.Code != "200" {
		result.Failure = WrongStatusCodeResponse(result.Resp.StatusCodeResponse)
		return result
	}
	if result.Resp.Scan.Status != status {
		result.Failure = WrongScanStatus(status, result.Resp.Scan.Status)
	}
	return result
}

func VerifyTillNextState(get scan.GetScans, co connection.OSPDSender, status string) GetScanResponseFailure {
	if r := VerifyGet(get, co, status); r.Failure != nil {
		return r
	}

	return TillNextState(get, co, status)

}

func TillNextState(get scan.GetScans, co connection.OSPDSender, status string) GetScanResponseFailure {
	var result GetScanResponseFailure
	result.Resp.Scan.Status = status
	for result.Resp.Scan.Status == status {
		result.Resp = scan.GetScansResponse{}
		if err := co.SendCommand(get, &result.Resp); err != nil {
			panic(err)
		}
		if result.Resp.Code != "200" {
			result.Failure = WrongStatusCodeResponse(result.Resp.StatusCodeResponse)
			break
		}
	}

	return result
}

func TillState(get scan.GetScans, co connection.OSPDSender, status string) GetScanResponseFailure {
	var result GetScanResponseFailure
	result.Resp.Scan.Status = status
	for !ScanStatusFinished(result.Resp.Scan.Status) && result.Resp.Scan.Status != status {
		result.Resp = scan.GetScansResponse{}
		if err := co.SendCommand(get, &result.Resp); err != nil {
			panic(err)
		}
		if result.Resp.Code != "200" {
			result.Failure = WrongStatusCodeResponse(result.Resp.StatusCodeResponse)
			break
		}
	}
	if result.Failure == nil && result.Resp.Scan.Status != status {
		result.Failure = WrongScanStatus(status, result.Resp.Scan.Status)
	}

	return result
}

type MessageHandler interface {
	Each(scan.GetScansResponse)
	Last(scan.GetScansResponse)
}

func StartScanGetLastStatus(start scan.Start, co connection.OSPDSender, mhs ...MessageHandler) GetScanResponseFailure {
	var result GetScanResponseFailure
	var startR scan.StartResponse

	if err := co.SendCommand(start, &startR); err != nil {
		panic(err)
	}
	if startR.Code != "200" {
		result.Failure = WrongStatusCodeResponse(startR.StatusCodeResponse)
		return result
	}
	get := scan.GetScans{ID: startR.ID}

	for !ScanStatusFinished(result.Resp.Scan.Status) {
		// reset to not contain previous results
		result.Resp = scan.GetScansResponse{}
		if err := co.SendCommand(get, &result.Resp); err != nil {
			panic(err)
		}
		for _, mh := range mhs {
			if mh != nil {
				mh.Each(result.Resp)
			}
		}
		if result.Resp.Code != "200" {
			result.Failure = WrongStatusCodeResponse(result.Resp.StatusCodeResponse)
			return result
		}
	}
	for _, mh := range mhs {
		if mh != nil {
			mh.Last(result.Resp)
		}
	}
	return result

}