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
5318TEST (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}
0 commit comments