1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * Vulkan CTS Framework
3e5c31af7Sopenharmony_ci * --------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright (c) 2021 The Khronos Group Inc.
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci *
11e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci * limitations under the License.
18e5c31af7Sopenharmony_ci *
19e5c31af7Sopenharmony_ci *-------------------------------------------------------------------------*/
20e5c31af7Sopenharmony_ci
21e5c31af7Sopenharmony_ci#include "vksNetwork.hpp"
22e5c31af7Sopenharmony_ci#include "vksProtocol.hpp"
23e5c31af7Sopenharmony_ci#include "vksClient.hpp"
24e5c31af7Sopenharmony_ci
25e5c31af7Sopenharmony_ci#include <iostream>
26e5c31af7Sopenharmony_ci
27e5c31af7Sopenharmony_ci#include "deSocket.hpp"
28e5c31af7Sopenharmony_ci#include "deCommandLine.hpp"
29e5c31af7Sopenharmony_ci
30e5c31af7Sopenharmony_ciusing namespace vksc_server;
31e5c31af7Sopenharmony_ci
32e5c31af7Sopenharmony_cinamespace opt
33e5c31af7Sopenharmony_ci{
34e5c31af7Sopenharmony_ci
35e5c31af7Sopenharmony_ciDE_DECLARE_COMMAND_LINE_OPT(Address,		string);
36e5c31af7Sopenharmony_ci
37e5c31af7Sopenharmony_ciconst string DefaultAddress = "localhost:" + std::to_string(DefaultPort);
38e5c31af7Sopenharmony_ci
39e5c31af7Sopenharmony_civoid registerOptions (de::cmdline::Parser& parser)
40e5c31af7Sopenharmony_ci{
41e5c31af7Sopenharmony_ci	using de::cmdline::Option;
42e5c31af7Sopenharmony_ci	using de::cmdline::NamedValue;
43e5c31af7Sopenharmony_ci
44e5c31af7Sopenharmony_ci	parser << Option<Address>		("a", "address",	"Address", DefaultAddress.c_str());
45e5c31af7Sopenharmony_ci}
46e5c31af7Sopenharmony_ci
47e5c31af7Sopenharmony_ci}
48e5c31af7Sopenharmony_ci
49e5c31af7Sopenharmony_civoid RunTests (Server& server);
50e5c31af7Sopenharmony_ci
51e5c31af7Sopenharmony_ciint main (int argc, char** argv)
52e5c31af7Sopenharmony_ci{
53e5c31af7Sopenharmony_ci	de::cmdline::CommandLine	cmdLine;
54e5c31af7Sopenharmony_ci
55e5c31af7Sopenharmony_ci	// Parse command line.
56e5c31af7Sopenharmony_ci	{
57e5c31af7Sopenharmony_ci		de::cmdline::Parser	parser;
58e5c31af7Sopenharmony_ci		opt::registerOptions(parser);
59e5c31af7Sopenharmony_ci
60e5c31af7Sopenharmony_ci		if (!parser.parse(argc, argv, &cmdLine, std::cerr))
61e5c31af7Sopenharmony_ci		{
62e5c31af7Sopenharmony_ci			parser.help(std::cout);
63e5c31af7Sopenharmony_ci			return EXIT_FAILURE;
64e5c31af7Sopenharmony_ci		}
65e5c31af7Sopenharmony_ci	}
66e5c31af7Sopenharmony_ci
67e5c31af7Sopenharmony_ci	try
68e5c31af7Sopenharmony_ci	{
69e5c31af7Sopenharmony_ci		string address = cmdLine.getOption<opt::Address>();
70e5c31af7Sopenharmony_ci		std::cout << "connecting to " << address << "..." << std::endl;
71e5c31af7Sopenharmony_ci		Server server(address);
72e5c31af7Sopenharmony_ci		RunTests(server);
73e5c31af7Sopenharmony_ci	}
74e5c31af7Sopenharmony_ci	catch (const std::exception& e) { std::cout << e.what() << std::endl; }
75e5c31af7Sopenharmony_ci
76e5c31af7Sopenharmony_ci	return EXIT_SUCCESS;
77e5c31af7Sopenharmony_ci}
78e5c31af7Sopenharmony_ci
79e5c31af7Sopenharmony_cistd::ostream& operator<<(std::ostream& os, const vector<u8>& data)
80e5c31af7Sopenharmony_ci{
81e5c31af7Sopenharmony_ci	os << '{';
82e5c31af7Sopenharmony_ci	for (msize i{}; i < data.size(); ++i) os << (int)data[i] << ((i+1) < data.size() ? ", " : "");
83e5c31af7Sopenharmony_ci	os << '}';
84e5c31af7Sopenharmony_ci    return os;
85e5c31af7Sopenharmony_ci}
86e5c31af7Sopenharmony_ci
87e5c31af7Sopenharmony_citemplate <typename T>
88e5c31af7Sopenharmony_civoid Except (const string& name, const T& value, T excepted, const string& message)
89e5c31af7Sopenharmony_ci{
90e5c31af7Sopenharmony_ci	std::cout << message << std::endl;
91e5c31af7Sopenharmony_ci	if (value != excepted)
92e5c31af7Sopenharmony_ci	{
93e5c31af7Sopenharmony_ci		std::cout << name << " -> expected: " << excepted << " but got " << value << std::endl;
94e5c31af7Sopenharmony_ci		throw std::runtime_error("Test failed: " + message);
95e5c31af7Sopenharmony_ci	}
96e5c31af7Sopenharmony_ci	std::cout << "ok" << std::endl;
97e5c31af7Sopenharmony_ci}
98e5c31af7Sopenharmony_ci
99e5c31af7Sopenharmony_civoid RunStoreContentTests (Server& server)
100e5c31af7Sopenharmony_ci{
101e5c31af7Sopenharmony_ci	{
102e5c31af7Sopenharmony_ci		StoreContentRequest request;
103e5c31af7Sopenharmony_ci		request.data = {1, 2, 3, 4};
104e5c31af7Sopenharmony_ci		request.name = "@test1";
105e5c31af7Sopenharmony_ci		StoreContentResponse response;
106e5c31af7Sopenharmony_ci		server.SendRequest(request, response);
107e5c31af7Sopenharmony_ci
108e5c31af7Sopenharmony_ci		Except("StoreContentResponse::status", response.status, true, "After requesting to store data on a server we should received true");
109e5c31af7Sopenharmony_ci	}
110e5c31af7Sopenharmony_ci
111e5c31af7Sopenharmony_ci	{
112e5c31af7Sopenharmony_ci		StoreContentRequest request;
113e5c31af7Sopenharmony_ci		request.data = {5,6,7,8,9};
114e5c31af7Sopenharmony_ci		request.name = "@test1";
115e5c31af7Sopenharmony_ci		StoreContentResponse response;
116e5c31af7Sopenharmony_ci		server.SendRequest(request, response);
117e5c31af7Sopenharmony_ci
118e5c31af7Sopenharmony_ci		Except("StoreContentResponse::status", response.status, true, "After requesting to store data with a name that is already in use we should received false");
119e5c31af7Sopenharmony_ci	}
120e5c31af7Sopenharmony_ci}
121e5c31af7Sopenharmony_ci
122e5c31af7Sopenharmony_civoid RunGetContentTests (Server& server)
123e5c31af7Sopenharmony_ci{
124e5c31af7Sopenharmony_ci	{
125e5c31af7Sopenharmony_ci		GetContentRequest request;
126e5c31af7Sopenharmony_ci		request.path = "@test1";
127e5c31af7Sopenharmony_ci		request.removeAfter = true;
128e5c31af7Sopenharmony_ci		GetContentResponse response;
129e5c31af7Sopenharmony_ci		server.SendRequest(request, response);
130e5c31af7Sopenharmony_ci
131e5c31af7Sopenharmony_ci		Except("StoreContentResponse::status", response.status, true, "After requesting to get data from server store we should received true");
132e5c31af7Sopenharmony_ci		Except("StoreContentResponse::data", response.data, {5,6,7,8,9}, "Received data must be correct");
133e5c31af7Sopenharmony_ci	}
134e5c31af7Sopenharmony_ci
135e5c31af7Sopenharmony_ci	{
136e5c31af7Sopenharmony_ci		GetContentRequest request;
137e5c31af7Sopenharmony_ci		request.path = "@test1";
138e5c31af7Sopenharmony_ci		request.removeAfter = true;
139e5c31af7Sopenharmony_ci		GetContentResponse response;
140e5c31af7Sopenharmony_ci		server.SendRequest(request, response);
141e5c31af7Sopenharmony_ci
142e5c31af7Sopenharmony_ci		Except("StoreContentResponse::status", response.status, false, "Requesting to get data from server memory that no longer exist should result in false");
143e5c31af7Sopenharmony_ci	}
144e5c31af7Sopenharmony_ci}
145e5c31af7Sopenharmony_ci
146e5c31af7Sopenharmony_civoid RunCompileShaderTests (Server& server)
147e5c31af7Sopenharmony_ci{
148e5c31af7Sopenharmony_ci	{
149e5c31af7Sopenharmony_ci		CompileShaderRequest request;
150e5c31af7Sopenharmony_ci		request.source.active = "glsl";
151e5c31af7Sopenharmony_ci		request.source.glsl = {};
152e5c31af7Sopenharmony_ci		request.source.glsl.sources[glu::SHADERTYPE_VERTEX].push_back(
153e5c31af7Sopenharmony_ci		R"glsl(#version 450
154e5c31af7Sopenharmony_ci
155e5c31af7Sopenharmony_ci			vec2 positions[3] = vec2[](
156e5c31af7Sopenharmony_ci				vec2(0.0, -0.5),
157e5c31af7Sopenharmony_ci				vec2(0.5, 0.5),
158e5c31af7Sopenharmony_ci				vec2(-0.5, 0.5)
159e5c31af7Sopenharmony_ci			);
160e5c31af7Sopenharmony_ci
161e5c31af7Sopenharmony_ci			void main() {
162e5c31af7Sopenharmony_ci				gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0);
163e5c31af7Sopenharmony_ci			}
164e5c31af7Sopenharmony_ci		)glsl");
165e5c31af7Sopenharmony_ci		request.commandLine = {};
166e5c31af7Sopenharmony_ci
167e5c31af7Sopenharmony_ci		CompileShaderResponse response;
168e5c31af7Sopenharmony_ci		server.SendRequest(request, response);
169e5c31af7Sopenharmony_ci
170e5c31af7Sopenharmony_ci		Except("StoreContentResponse::status", response.status, true, "After requesting server to compile glsl shader we should get true as a result");
171e5c31af7Sopenharmony_ci		Except("StoreContentResponse::binary.empty()", response.binary.empty(), false, "Received data must be not empty");
172e5c31af7Sopenharmony_ci	}
173e5c31af7Sopenharmony_ci}
174e5c31af7Sopenharmony_ci
175e5c31af7Sopenharmony_civoid RunTests (Server& server)
176e5c31af7Sopenharmony_ci{
177e5c31af7Sopenharmony_ci	RunStoreContentTests(server);
178e5c31af7Sopenharmony_ci	RunGetContentTests(server);
179e5c31af7Sopenharmony_ci	RunCompileShaderTests(server);
180e5c31af7Sopenharmony_ci
181e5c31af7Sopenharmony_ci	std::cout << "All tests passed" << std::endl;
182e5c31af7Sopenharmony_ci}
183