Skip to content

Commit 4fe5fd2

Browse files
committed
[http] move actual tests to test_suite.cxx
Let reuse same tests with different engine
1 parent 6e9d145 commit 4fe5fd2

2 files changed

Lines changed: 130 additions & 120 deletions

File tree

net/http/test/test_server.cxx

Lines changed: 5 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -12,42 +12,7 @@
1212

1313
#include "ROOT/TestSupport.hxx"
1414

15-
Int_t httpport = 0;
16-
TString server_url;
17-
18-
19-
// main http server
20-
std::string execute_request(const char *url, const char *post = nullptr)
21-
{
22-
TString fname = TString::Format("http_server_%d.output", httpport),
23-
pname, exec;
24-
25-
if (post) {
26-
pname = TString::Format("http_server_%d.post", httpport);
27-
std::ofstream f(pname.Data());
28-
f << post;
29-
}
30-
31-
if (post)
32-
exec = TString::Format("curl -sS -X POST '%s%s' --data-binary @%s -o %s", server_url.Data(), url, pname.Data(), fname.Data());
33-
else
34-
exec = TString::Format("curl -sS '%s%s' -o %s", server_url.Data(), url, fname.Data());
35-
36-
printf("Execute %s\n", exec.Data());
37-
38-
std::string res;
39-
40-
if (gSystem->Exec(exec) != 0)
41-
res = "<fail>";
42-
else
43-
res = THttpServer::ReadFileContent(fname.Data());
44-
45-
gSystem->Unlink(fname);
46-
if (!pname.IsNull())
47-
gSystem->Unlink(pname);
48-
49-
return res;
50-
}
15+
#include "./test_suite.cxx"
5116

5217
// main http server
5318
TEST(THttpServer, main)
@@ -56,6 +21,8 @@ TEST(THttpServer, main)
5621

5722
gRandom->SetSeed(0);
5823

24+
Int_t httpport = 0;
25+
5926
for(int ntry = 0; ntry < 100; ++ntry) {
6027
Int_t port = (Int_t) (25000 + gRandom->Rndm() * 1000);
6128
// only two threads, bind to loopback address only
@@ -71,90 +38,8 @@ TEST(THttpServer, main)
7138
if (!httpport)
7239
return;
7340

41+
server_hash = httpport;
7442
server_url = TString::Format("http:/localhost:%d", httpport);
7543

76-
TNamed obj1("obj1", "title1");
77-
TNamed obj2("obj2", "title2");
78-
79-
serv.Register("/", &obj1);
80-
serv.Register("/", &obj2);
81-
82-
// let process requests in separate thread
83-
serv.CreateServerThread();
84-
85-
// check JSON representation for the object
86-
std::string res = execute_request("/obj1/root.json");
87-
EXPECT_EQ(res, "{\n"
88-
" \"_typename\" : \"TNamed\",\n"
89-
" \"fUniqueID\" : 0,\n"
90-
" \"fBits\" : 8,\n"
91-
" \"fName\" : \"obj1\",\n"
92-
" \"fTitle\" : \"title1\"\n"
93-
"}") << "result of root.json request";
94-
95-
// check XML representation for the object
96-
res = execute_request("/obj1/root.xml");
97-
EXPECT_EQ(res, "<Object class=\"TNamed\">\n"
98-
" <TNamed version=\"1\">\n"
99-
" <TObject fUniqueID=\"0\" fBits=\"8\"/>\n"
100-
" <fName str=\"obj1\"/>\n"
101-
" <fTitle str=\"title1\"/>\n"
102-
" </TNamed>\n"
103-
"</Object>\n") << "result of root.xml request";
104-
105-
106-
// check BINARY representation for the object
107-
res = execute_request("/obj1/root.bin");
108-
// keep minimal margin for binary format change
109-
EXPECT_NEAR(res.length(), 28, 4) << "size of root.bin request";
110-
111-
// check ROOT file creation
112-
res = execute_request("/obj1/file.root");
113-
// TODO: anlyze why so big size for small object
114-
EXPECT_NEAR(res.length(), 1024, 100) << "size of file.root request";
115-
116-
// check item request hierarchy request
117-
res = execute_request("/obj1/item.json");
118-
119-
EXPECT_EQ(res, "{\n"
120-
" \"_name\" : \"obj1\",\n"
121-
" \"_root_version\" : " + std::to_string(gROOT->GetVersionCode()) + ",\n"
122-
" \"_kind\" : \"ROOT.TNamed\",\n"
123-
" \"_title\" : \"title1\"\n"
124-
"}") << "result of item.json request";
125-
126-
127-
// check multi request to several objects
128-
res = execute_request("/multi.json?number=2", "/obj1/root.json\n/obj2/root.json\n");
129-
EXPECT_EQ(res, "[{\n"
130-
" \"_typename\" : \"TNamed\",\n"
131-
" \"fUniqueID\" : 0,\n"
132-
" \"fBits\" : 8,\n"
133-
" \"fName\" : \"obj1\",\n"
134-
" \"fTitle\" : \"title1\"\n"
135-
"}, {\n"
136-
" \"_typename\" : \"TNamed\",\n"
137-
" \"fUniqueID\" : 0,\n"
138-
" \"fBits\" : 8,\n"
139-
" \"fName\" : \"obj2\",\n"
140-
" \"fTitle\" : \"title2\"\n"
141-
"}]") << "result of multi.json request";
142-
143-
144-
// by default methods execution is not allowed
145-
res = execute_request("/obj1/exe.json?method=GetTitle");
146-
EXPECT_EQ(res, "") << "exe.json should be empty in readonly";
147-
148-
149-
// disable readonly to get extra functionality
150-
serv.SetReadOnly(kFALSE);
151-
152-
// only now one can execute method
153-
res = execute_request("/obj1/exe.json?method=GetTitle");
154-
EXPECT_EQ(res, "\"title1\"") << "result of exe.json with object title";
155-
156-
res = execute_request("/obj1/exe.json?method=SetTitle&title=NewTitle");
157-
EXPECT_EQ(res, "null") << "returns null when executes void method";
158-
EXPECT_EQ(std::string("NewTitle"), obj1.GetTitle()) << "title must match with submitted value";
159-
obj1.SetTitle("title1");
44+
test_suite(serv);
16045
}

net/http/test/test_suite.cxx

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
Int_t server_hash = 0;
2+
TString server_url;
3+
TString unix_socket;
4+
5+
// submit requests to server
6+
std::string execute_request(const char *url, const char *post = nullptr)
7+
{
8+
TString fname = TString::Format("http_server_%d.output", server_hash),
9+
pname, exec;
10+
11+
if (post) {
12+
pname = TString::Format("http_server_%d.post", server_hash);
13+
std::ofstream f(pname.Data());
14+
f << post;
15+
}
16+
17+
if (post)
18+
exec = TString::Format("curl -sS -X POST %s '%s%s' --data-binary @%s -o %s", unix_socket.Data(), server_url.Data(), url, pname.Data(), fname.Data());
19+
else
20+
exec = TString::Format("curl -sS %s '%s%s' -o %s", unix_socket.Data(), server_url.Data(), url, fname.Data());
21+
22+
printf("Execute %s\n", exec.Data());
23+
24+
std::string res;
25+
26+
if (gSystem->Exec(exec) != 0)
27+
res = "<fail>";
28+
else
29+
res = THttpServer::ReadFileContent(fname.Data());
30+
31+
gSystem->Unlink(fname);
32+
if (!pname.IsNull())
33+
gSystem->Unlink(pname);
34+
35+
return res;
36+
}
37+
38+
39+
void test_suite(THttpServer &serv)
40+
{
41+
// let process requests in separate thread
42+
serv.CreateServerThread();
43+
44+
TNamed obj1("obj1", "title1");
45+
TNamed obj2("obj2", "title2");
46+
47+
serv.Register("/", &obj1);
48+
serv.Register("/", &obj2);
49+
50+
// check JSON representation for the object
51+
std::string res = execute_request("/obj1/root.json");
52+
EXPECT_EQ(res, "{\n"
53+
" \"_typename\" : \"TNamed\",\n"
54+
" \"fUniqueID\" : 0,\n"
55+
" \"fBits\" : 8,\n"
56+
" \"fName\" : \"obj1\",\n"
57+
" \"fTitle\" : \"title1\"\n"
58+
"}") << "result of root.json request";
59+
60+
// check XML representation for the object
61+
res = execute_request("/obj1/root.xml");
62+
EXPECT_EQ(res, "<Object class=\"TNamed\">\n"
63+
" <TNamed version=\"1\">\n"
64+
" <TObject fUniqueID=\"0\" fBits=\"8\"/>\n"
65+
" <fName str=\"obj1\"/>\n"
66+
" <fTitle str=\"title1\"/>\n"
67+
" </TNamed>\n"
68+
"</Object>\n") << "result of root.xml request";
69+
70+
71+
// check BINARY representation for the object
72+
res = execute_request("/obj1/root.bin");
73+
// keep minimal margin for binary format change
74+
EXPECT_NEAR(res.length(), 28, 4) << "size of root.bin request";
75+
76+
// check ROOT file creation
77+
res = execute_request("/obj1/file.root");
78+
// TODO: anlyze why so big size for small object
79+
EXPECT_NEAR(res.length(), 1024, 100) << "size of file.root request";
80+
81+
// check item request hierarchy request
82+
res = execute_request("/obj1/item.json");
83+
84+
EXPECT_EQ(res, "{\n"
85+
" \"_name\" : \"obj1\",\n"
86+
" \"_root_version\" : " + std::to_string(gROOT->GetVersionCode()) + ",\n"
87+
" \"_kind\" : \"ROOT.TNamed\",\n"
88+
" \"_title\" : \"title1\"\n"
89+
"}") << "result of item.json request";
90+
91+
92+
// check multi request to several objects
93+
res = execute_request("/multi.json?number=2", "/obj1/root.json\n/obj2/root.json\n");
94+
EXPECT_EQ(res, "[{\n"
95+
" \"_typename\" : \"TNamed\",\n"
96+
" \"fUniqueID\" : 0,\n"
97+
" \"fBits\" : 8,\n"
98+
" \"fName\" : \"obj1\",\n"
99+
" \"fTitle\" : \"title1\"\n"
100+
"}, {\n"
101+
" \"_typename\" : \"TNamed\",\n"
102+
" \"fUniqueID\" : 0,\n"
103+
" \"fBits\" : 8,\n"
104+
" \"fName\" : \"obj2\",\n"
105+
" \"fTitle\" : \"title2\"\n"
106+
"}]") << "result of multi.json request";
107+
108+
109+
// by default methods execution is not allowed
110+
res = execute_request("/obj1/exe.json?method=GetTitle");
111+
EXPECT_EQ(res, "") << "exe.json should be empty in readonly";
112+
113+
114+
// disable readonly to get extra functionality
115+
serv.SetReadOnly(kFALSE);
116+
117+
// only now one can execute method
118+
res = execute_request("/obj1/exe.json?method=GetTitle");
119+
EXPECT_EQ(res, "\"title1\"") << "result of exe.json with object title";
120+
121+
res = execute_request("/obj1/exe.json?method=SetTitle&title=NewTitle");
122+
EXPECT_EQ(res, "null") << "returns null when executes void method";
123+
EXPECT_EQ(std::string("NewTitle"), obj1.GetTitle()) << "title must match with submitted value";
124+
obj1.SetTitle("title1");
125+
}

0 commit comments

Comments
 (0)