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