/// testconsoleapilib.cpp : Defines the entry point for the console application.
//
#include <windows.h>
#include <iostream>
#include <string>
#include <boost/property_tree/json_parser.hpp>
#include <boost/property_tree/ptree.hpp>
#include <sstream>
#include <boost/foreach.hpp>
#include <boost/scope_exit.hpp>
typedef int (*era_process_request)(const char* request, char** response);
typedef void (*era_free)(char* s);
typedef int (*era_init_lib)();
typedef void (*era_deinit_lib)();
int main(int argc, char** argv)
{
HMODULE hMod = LoadLibrary(L"ServerApi.dll");
BOOST_SCOPE_EXIT(&hMod) {
if(hMod)
{
FreeLibrary(hMod);
}
} BOOST_SCOPE_EXIT_END
if (!hMod)
{
std::cout<< "Cannot load library error. Last error is:" << GetLastError() << std::endl;
return 1;
}
era_init_lib init_lib = (era_init_lib)GetProcAddress(hMod,"era_init_lib");
era_deinit_lib deinit_lib = (era_deinit_lib)GetProcAddress(hMod,"era_deinit_lib");
if (!init_lib )
{
std::cout<<"Cannot init library" << std::endl;
return 1;
}
if (!deinit_lib )
{
std::cout<<"Cannot deinit libraries" << std::endl;
return 1;
}
int res = init_lib();
BOOST_SCOPE_EXIT(&deinit_lib,&res) {
if(!res)
{
if(deinit_lib)
{
deinit_lib();
}
}
} BOOST_SCOPE_EXIT_END
if(res)
{
std::cout<<"Init lib result:" << res << std::endl;
return 1;
}
era_process_request send_request = (era_process_request)GetProcAddress(hMod,"era_process_request");
if (!send_request)
{
std::cout<<"Cannot load era_process_request" << std::endl;
return 1;
}
era_free free_response = (era_free)GetProcAddress(hMod,"era_free");
if (!free_response)
{
std::cout<<"Cannot load era_free" << std::endl;
return 1;
}
//Start ServerApi 1
std::string request("{\"Era.ServerApi.StartRequest\":{}}");
std::cout<<"Executing json " << request << " ..." << std::endl;
char* szRes = NULL;
res = send_request(request.c_str(),&szRes);
if (!res)
{
std::string response(szRes);
std::cout<<"Response is: " << response << std::endl;
boost::property_tree::ptree pt2;
std::istringstream is (response);
read_json (is, pt2);
bool resultMessageHasTrueResult = pt2.get (boost::property_tree::ptree::path_type("Era.ServerApi.SimpleResponse/result", '/'),false);
if(!resultMessageHasTrueResult)
{
std::cout << "ServerApi was not started properly." << std::endl;
return 1;
}
}
else
{
std::cout << "Error in ServerApi: " << res << std::endl;
free_response(szRes);
return 1;
}
BOOST_SCOPE_EXIT(&send_request,&free_response){
//Stop ServerApi 7
std::string request="{\"Era.ServerApi.StopRequest\":{}}";
std::cout<<"Executing json " << request << " ..." << std::endl;
char* szRes = NULL;
int res = send_request(request.c_str(),&szRes);
if (!res)
{
std::string response(szRes);
std::cout<<"Response is: " << response << std::endl;
boost::property_tree::ptree pt2;
std::istringstream is (response);
read_json (is, pt2);
bool resultMessageHasTrueResult = pt2.get (boost::property_tree::ptree::path_type("Era.ServerApi.SimpleResponse/result", '/'),false);
if(!resultMessageHasTrueResult)
{
std::cout << "Stop request failed." << std::endl;
free_response(szRes);
}
}
else
{
std::cout << "Error in ServerApi: " << res << std::endl;
free_response(szRes);
}
free_response(szRes);
} BOOST_SCOPE_EXIT_END
free_response(szRes);
//CreateConfiguration 2
request = "{\"Era.ServerApi.CreateConnectionRequest\":{\"host\":\"127.0.0.1\",\"port\":2223}}";
std::cout<<"Executing json " << request << " ..." << std::endl;
szRes = NULL;
res = send_request(request.c_str(),&szRes);
if (!res)
{
std::string response(szRes);
std::cout<<"Response is: " << response << std::endl;
boost::property_tree::ptree pt2;
std::istringstream is (response);
read_json (is, pt2);
try{
std::string resultMessageHasTrueResult = pt2.get<std::string> (boost::property_tree::ptree::path_type("Era.ServerApi.VerifyUserRequest/result", '/'));
}
catch(const std::exception& e)
{
std::cout << "ServerApi cannot connect." << std::endl;
free_response(szRes);
return 1;
}
}
else
{
std::cout << "Error in ServerApi: " << res << std::endl;
free_response(szRes);
return 1;
}
BOOST_SCOPE_EXIT(&send_request,&free_response){
//CloseConnection 6
std::string request="{\"Era.ServerApi.CloseConnectionRequest\":{}}";
std::cout<<"Executing json " << request << " ..." << std::endl;
char* szRes = NULL;
int res = send_request(request.c_str(),&szRes);
if (!res)
{
std::string response(szRes);
std::cout<<"Response is: " << response << std::endl;
boost::property_tree::ptree pt2;
std::istringstream is (response);
read_json (is, pt2);
bool resultMessageHasTrueResult = pt2.get (boost::property_tree::ptree::path_type("Era.ServerApi.SimpleResponse/result", '/'),false);
if(!resultMessageHasTrueResult)
{
std::cout << "Connection was not closed properly." << std::endl;
free_response(szRes);
}
}
else
{
std::cout << "Error in ServerApi: " << res << std::endl;
free_response(szRes);
}
free_response(szRes);
} BOOST_SCOPE_EXIT_END
free_response(szRes);
//VerifyUserResponse 3
request="{\"Era.ServerApi.VerifyUserResponse\":{\"VerifyResult\":true}}";
std::cout<<"Executing json " << request << " ..." << std::endl;
szRes = NULL;
res = send_request(request.c_str(),&szRes);
if (!res)
{
std::string response(szRes);
std::cout<<"Response is: " << response << std::endl;
boost::property_tree::ptree pt2;
std::istringstream is (response);
read_json (is, pt2);
bool resultMessageHasTrueResult = pt2.get (boost::property_tree::ptree::path_type("Era.ServerApi.SimpleResponse/result", '/'),false);
if(!resultMessageHasTrueResult)
{
std::cout << "ServerApi was not started properly." << std::endl;
free_response(szRes);
return 1;
}
}
else
{
std::cout << "Error in ServerApi: " << res << std::endl;
free_response(szRes);
return 1;
}
free_response(szRes);
//Authenticate 4
request="{\"Era.Common.NetworkMessage.ConsoleApi.SessionManagement.RpcAuthLoginRequest\" : {\"username\":\"Administrator\", \"password\":\"secret\", \"isDomainUser\":false, \"locale\":\"en-US\"}}";
std::cout<<"Executing json " << request << " ..." << std::endl;
szRes = NULL;
res = send_request(request.c_str(),&szRes);
if (!res)
{
std::string response(szRes);
std::cout<<"Response is: " << response << std::endl;
boost::property_tree::ptree pt2;
std::istringstream is (response);
read_json (is, pt2);
try{
std::string resultMessageHasTrueResult = pt2.get<std::string> (boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.SessionManagement.RpcAuthLoginResponse/userUuid/uuid", '/'));
}
catch(const std::exception& e)
{
std::cout << "ServerApi cannot authenticate. Error is: " << e.what() << std::endl;
free_response(szRes);
return 1;
}
}
else
{
std::cout << "Error in ServerApi: " << res << std::endl;
free_response(szRes);
return 1;
}
free_response(szRes);
//CreateStaticGroup 5
request="{\"Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateStaticGroupRequest\":{\"staticObjectData\":{\"name\":\"group1\",\"description\":\"description\"},\"parentGroupUuid\":{\"uuid\":\"00000000-0000-0000-7001-000000000001\"}}}";
std::cout<<"Executing json " << request << " ..." << std::endl;
szRes = NULL;
res = send_request(request.c_str(),&szRes);
std::string uuidOfGroup = "";
if (!res)
{
std::string response(szRes);
std::cout<<"Response is: " << response << std::endl;
boost::property_tree::ptree pt2;
std::istringstream is (response);
read_json (is, pt2);
try{
uuidOfGroup = pt2.get<std::string> (boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateStaticGroupResponse/staticObjectIdentification/uuid/uuid", '/'));
int version = pt2.get<int> (boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateStaticGroupResponse/staticObjectIdentification/versionGuard", '/'));
std::string name = pt2.get<std::string> (boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateStaticGroupResponse/staticObjectData/name", '/'));
std::string description = pt2.get<std::string> (boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateStaticGroupResponse/staticObjectData/description", '/'));
std::string parentuuid = pt2.get<std::string> (boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateStaticGroupResponse/staticGroupRelations/parentGroup/uuid", '/'));
if(parentuuid != "00000000-0000-0000-7001-000000000001" || name !="group1" || description!="description")
{
throw std::runtime_error("Result is not expected");
}
}
catch(const std::exception& e)
{
std::cout << "ServerApi cannot create group. Error is: " << e.what() << std::endl;
free_response(szRes);
return 1;
}
}
else
{
std::cout << "Error in ServerApi: " << res << std::endl;
free_response(szRes);
return 1;
}
free_response(szRes);
//CreateComputer 5
request="{\"Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateComputerRequest\":{\"parentGroupUuid\":{\"uuid\":\"" + uuidOfGroup + "\"},\"computerNames\":[\"computer1\"],\"commonDescription\":\"first\",\"collisionsHandling\":1}}";
std::cout<<"Executing json " << request << " ..." << std::endl;
szRes = NULL;
res = send_request(request.c_str(),&szRes);
if (!res)
{
std::string response(szRes);
std::cout<<"Response is: " << response << std::endl;
boost::property_tree::ptree pt2;
std::istringstream is (response);
read_json (is, pt2);
try{
boost::property_tree::ptree& pos = pt2.get_child(boost::property_tree::ptree::path_type("Era.Common.NetworkMessage.ConsoleApi.Groups.RpcCreateComputerResponse/results", '/'));
int size = 0 ;
BOOST_FOREACH (const boost::property_tree::ptree::value_type& resultCreateComputer, pos) {
if(size == 1)
{
throw std::runtime_error("Result in create compures has to have one result");
}
size++;
int resultCreateComp = resultCreateComputer.second.get<int> (boost::property_tree::ptree::path_type("result", '/'));
int requestIndex = resultCreateComputer.second.get<int> (boost::property_tree::ptree::path_type("requestIndex", '/'));
std::string uuid = resultCreateComputer.second.get<std::string>(boost::property_tree::ptree::path_type("staticObjectIdentification/uuid/uuid", '/'));
std::string version = resultCreateComputer.second.get<std::string>(boost::property_tree::ptree::path_type("staticObjectIdentification/versionGuard", '/'));
std::string name = resultCreateComputer.second.get<std::string>(boost::property_tree::ptree::path_type("staticObjectData/name", '/'));
std::string description = resultCreateComputer.second.get<std::string>(boost::property_tree::ptree::path_type("staticObjectData/description", '/'));
if(resultCreateComp!=1 || requestIndex != 0 || name !="computer1" || description!="first")
{
throw std::runtime_error("Result is not expected");
}
}
}
catch(const std::exception& e)
{
std::cout << "ServerApi cannot create computer. Error is: " << e.what() << std::endl;
free_response(szRes);
return 1;
}
}
else
{
std::cout << "Error in ServerApi: " << res << std::endl;
free_response(szRes);
return 1;
}
free_response(szRes);
return 0;
}
|