PageRenderTime 26ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/flash/video/gnash-bzr/src/gnash-build/plugin/npapi/test.cpp

https://github.com/o1iver/Code-Backup
C++ | 409 lines | 326 code | 52 blank | 31 comment | 85 complexity | c5da88738d5a092fc99ac799a1d2c07f MD5 | raw file
  1. //
  2. // Copyright (C) 2010 Free Software Foundation, Inc
  3. //
  4. // This program is free software; you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation; either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with this program; if not, write to the Free Software
  16. // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  17. //
  18. #include <iostream>
  19. #include <string>
  20. #include <cstdlib>
  21. #include <vector>
  22. #include <map>
  23. #include <cassert>
  24. #include "npapi.h"
  25. #include "npruntime.h"
  26. #include "pluginbase.h"
  27. #include "npfunctions.h"
  28. #include "dejagnu.h"
  29. #include <regex.h>
  30. #include "external.h"
  31. TestState runtest;
  32. std::map<NPIdentifier, NPVariant *> _properties;
  33. std::map<NPIdentifier, NPInvokeFunctionPtr> _methods;
  34. int
  35. main(int argc, char *argv[])
  36. {
  37. using namespace gnash;
  38. NPVariant *value = (NPVariant *)NPN_MemAlloc(sizeof(NPVariant));
  39. BOOLEAN_TO_NPVARIANT(true, *value);
  40. std::string str = ExternalInterface::convertNPVariant(value);
  41. if (str == "<true/>") {
  42. runtest.pass("convertNPVariant(true)");
  43. } else {
  44. runtest.fail("convertNPVariant(true)");
  45. }
  46. BOOLEAN_TO_NPVARIANT(false, *value);
  47. str = ExternalInterface::convertNPVariant(value);
  48. if (str == "<false/>") {
  49. runtest.pass("convertNPVariant(false)");
  50. } else {
  51. runtest.fail("convertNPVariant(false)");
  52. }
  53. NULL_TO_NPVARIANT(*value);
  54. str = ExternalInterface::convertNPVariant(value);
  55. if (str == "<null/>") {
  56. runtest.pass("convertNPVariant(null)");
  57. } else {
  58. runtest.fail("convertNPVariant(null)");
  59. }
  60. VOID_TO_NPVARIANT(*value);
  61. str = ExternalInterface::convertNPVariant(value);
  62. if (str == "<void/>") {
  63. runtest.pass("convertNPVariant(void)");
  64. } else {
  65. runtest.fail("convertNPVariant(void)");
  66. }
  67. DOUBLE_TO_NPVARIANT(123.456, *value);
  68. str = ExternalInterface::convertNPVariant(value);
  69. if (str == "<number>123.456</number>") {
  70. runtest.pass("convertNPVariant(double)");
  71. } else {
  72. runtest.fail("convertNPVariant(double)");
  73. }
  74. INT32_TO_NPVARIANT(78, *value);
  75. str = ExternalInterface::convertNPVariant(value);
  76. if (str == "<number>78</number>") {
  77. runtest.pass("convertNPVariant(int32)");
  78. } else {
  79. runtest.fail("convertNPVariant(int32)");
  80. }
  81. STRINGZ_TO_NPVARIANT("Hello World!", *value);
  82. str = ExternalInterface::convertNPVariant(value);
  83. if (str == "<string>Hello World!</string>") {
  84. runtest.pass("convertNPVariant(string)");
  85. } else {
  86. runtest.fail("convertNPVariant(string)");
  87. }
  88. str = ExternalInterface::makeProperty("hi", "Hello World!");
  89. if (str == "<property id=\"hi\">Hello World!</property>") {
  90. runtest.pass("ExternalInterface::makeProperty()");
  91. } else {
  92. runtest.fail("ExternalInterface::makeProperty()");
  93. }
  94. #if 0
  95. ARRAY_TO_NPVARIANT(*value);
  96. str = ExternalInterface::convertNPVariant(value);
  97. if (str == "<array></array>") {
  98. runtest.pass("convertNPVariant(array)");
  99. } else {
  100. runtest.fail("convertNPVariant(array)");
  101. }
  102. #endif
  103. NPObject *obj = (NPObject *)NPN_MemAlloc(sizeof(NPObject));
  104. std::string prop1 = ExternalInterface::makeString("foobar");
  105. std::string prop2 = ExternalInterface::makeNumber(12.34);
  106. std::string prop3 = ExternalInterface::makeNumber(56);
  107. std::vector<std::string> aargs;
  108. aargs.push_back(prop1);
  109. aargs.push_back(prop2);
  110. aargs.push_back(prop3);
  111. regex_t regex_pat;
  112. regcomp (&regex_pat, "<array><property id=\"0\"><string>foobar</string></property><property id=\"1\"><number>12.34</number></property><property id=\"2\"><number>56</number></property></array>", REG_NOSUB|REG_NEWLINE);
  113. str = ExternalInterface::makeArray(aargs);
  114. if (regexec (&regex_pat, reinterpret_cast<const char*>(str.c_str()), 0, (regmatch_t *)0, 0)) {
  115. runtest.fail("ExternalInterface::makeArray()");
  116. } else {
  117. runtest.pass("ExternalInterface::makeArray()");
  118. }
  119. std::map<std::string, std::string> margs;
  120. margs["test1"] = prop1;
  121. margs["test2"] = prop2;
  122. margs["test3"] = prop3;
  123. str = ExternalInterface::makeObject(margs);
  124. std::string xml = "<object><property id=\"test1\"><string>foobar</string></property><property id=\"test2\"><number>12.34</number></property><property id=\"test3\"><number>56</number></property></object>";
  125. regcomp (&regex_pat, xml.c_str(), REG_NOSUB|REG_NEWLINE);
  126. // std::cout << str << std::endl;
  127. if (regexec (&regex_pat, reinterpret_cast<const char*>(str.c_str()), 0, (regmatch_t *)0, 0)) {
  128. runtest.fail("ExternalInterface::makeObject()");
  129. } else {
  130. runtest.pass("ExternalInterface::makeObject()");
  131. }
  132. //
  133. // Parsing tests
  134. //
  135. xml = "<string>Hello World!</string>";
  136. GnashNPVariant np = ExternalInterface::parseXML(xml);
  137. std::string data = NPStringToString(NPVARIANT_TO_STRING(np.get()));
  138. if (NPVARIANT_IS_STRING(np.get()) &&
  139. (data == "Hello World!")) {
  140. runtest.pass("ExternalInterface::parseXML(string)");
  141. } else {
  142. runtest.fail("ExternalInterface::parseXML(string)");
  143. }
  144. xml = "<number>123.456</number>";
  145. np = ExternalInterface::parseXML(xml);
  146. double num = NPVARIANT_TO_DOUBLE(np.get());
  147. if (NPVARIANT_IS_DOUBLE(np.get()) &&
  148. (num == 123.456)) {
  149. runtest.pass("ExternalInterface::parseXML(double)");
  150. } else {
  151. runtest.fail("ExternalInterface::parseXML(double)");
  152. }
  153. xml = "<number>78</number>";
  154. np = ExternalInterface::parseXML(xml);
  155. int inum = NPVARIANT_TO_INT32(np.get());
  156. if (NPVARIANT_IS_INT32(np.get()) &&
  157. (inum == 78)) {
  158. runtest.pass("ExternalInterface::parseXML(int32)");
  159. } else {
  160. runtest.fail("ExternalInterface::parseXML(int32)");
  161. }
  162. xml = "<true/>";
  163. np = ExternalInterface::parseXML(xml);
  164. bool flag = NPVARIANT_TO_BOOLEAN(np.get());
  165. if (NPVARIANT_IS_BOOLEAN(np.get()) &&
  166. (flag == true)) {
  167. runtest.pass("ExternalInterface::parseXML(true)");
  168. } else {
  169. runtest.fail("ExternalInterface::parseXML(true)");
  170. }
  171. xml = "<false/>";
  172. np = ExternalInterface::parseXML(xml);
  173. flag = NPVARIANT_TO_BOOLEAN(np.get());
  174. if (NPVARIANT_IS_BOOLEAN(np.get()) &&
  175. (flag == false)) {
  176. runtest.pass("ExternalInterface::parseXML(false)");
  177. } else {
  178. runtest.fail("ExternalInterface::parseXML(false)");
  179. }
  180. xml = "<null/>";
  181. np = ExternalInterface::parseXML(xml);
  182. if (NPVARIANT_IS_NULL(np.get())) {
  183. runtest.pass("ExternalInterface::parseXML(null)");
  184. } else {
  185. runtest.fail("ExternalInterface::parseXML(null)");
  186. }
  187. xml = "<void/>";
  188. np = ExternalInterface::parseXML(xml);
  189. if (NPVARIANT_IS_VOID(np.get())) {
  190. runtest.pass("ExternalInterface::parseXML(void)");
  191. } else {
  192. runtest.fail("ExternalInterface::parseXML(void)");
  193. }
  194. xml = "<property id=\"0\"><string>foobar</string></property><property id=\"1\"><number>12.34</number></property><property id=\"2\"><number>56</number></property>";
  195. std::map<std::string, GnashNPVariant> props = ExternalInterface::parseProperties(xml);
  196. np = props["0"];
  197. data = NPStringToString(NPVARIANT_TO_STRING(np.get()));
  198. if ((props.size() == 3) && (data == "foobar")) {
  199. runtest.pass("ExternalInterface::parseProperties()");
  200. } else {
  201. runtest.fail("ExternalInterface::parseProperties()");
  202. }
  203. xml = "<object><property id=\"test1\"><string>foobar</string></property><property id=\"test2\"><number>12.34</number></property><property id=\"test3\"><number>56</number></property></object>";
  204. np = ExternalInterface::parseXML(xml);
  205. if (NPVARIANT_IS_OBJECT(np.get())) {
  206. runtest.pass("ExternalInterface::parseXML(object)");
  207. } else {
  208. runtest.fail("ExternalInterface::parseXML(object)");
  209. }
  210. std::vector<std::string> iargs;
  211. str = ExternalInterface::makeString("barfoo");
  212. iargs.push_back(str);
  213. str = ExternalInterface::makeNumber(135.78);
  214. iargs.push_back(str);
  215. str = ExternalInterface::makeInvoke("barbyfoo", iargs);
  216. xml = "<invoke name=\"barbyfoo\" returntype=\"xml\"><arguments><string>barfoo</string><number>135.78</number></arguments></invoke>";
  217. // std::cout << str << std::endl;
  218. regcomp (&regex_pat, xml.c_str(), REG_NOSUB|REG_NEWLINE);
  219. if (regexec (&regex_pat, reinterpret_cast<const char*>(str.c_str()), 0, (regmatch_t *)0, 0) == 0) {
  220. runtest.pass("ExternalInterface::makeInvoke()");
  221. } else {
  222. runtest.fail("ExternalInterface::makeInvoke()");
  223. }
  224. xml = "<arguments><string>barfoo</string><number>135.78</number><number>89</number></arguments>";
  225. std::vector<GnashNPVariant> arguments = ExternalInterface::parseArguments(xml);
  226. np = arguments[0];
  227. str = NPStringToString(NPVARIANT_TO_STRING(np.get()));
  228. double dub = NPVARIANT_TO_DOUBLE(arguments[1].get());
  229. int val = NPVARIANT_TO_INT32(arguments[2].get());
  230. if ((arguments.size() == 3) && (str == "barfoo")
  231. && (dub == 135.78) && (val == 89)) {
  232. runtest.pass("ExternalInterface::parseArguments()");
  233. } else {
  234. runtest.fail("ExternalInterface::parseArguments()");
  235. }
  236. // Parse an invoke message
  237. xml = "<invoke name=\"barbyfoo\" returntype=\"xml\"><arguments><string>barfoo</string><number>135.78</number></arguments></invoke>";
  238. ExternalInterface::invoke_t *invoke = ExternalInterface::parseInvoke(xml);
  239. str = NPStringToString(NPVARIANT_TO_STRING(invoke->args[0].get()));
  240. if ((invoke->name == "barbyfoo") && (invoke->type == "xml")
  241. && (NPVARIANT_IS_STRING(invoke->args[0].get()))
  242. && (str == "barfoo")
  243. && (NPVARIANT_IS_DOUBLE(invoke->args[1].get()))
  244. && (NPVARIANT_TO_DOUBLE(invoke->args[1].get()) == 135.78)
  245. ) {
  246. runtest.pass("ExternalInterface::parseInvoke()");
  247. } else {
  248. runtest.fail("ExternalInterface::parseInvoke()");
  249. }
  250. }
  251. // We have to implement these two memory allocation functions as
  252. // they're used in the code we're testing.
  253. void *
  254. NPN_MemAlloc(uint32_t size)
  255. {
  256. void * rv = NULL;
  257. rv = malloc(size);
  258. return rv;
  259. }
  260. void
  261. NPN_MemFree(void* ptr)
  262. {
  263. assert(ptr);
  264. free(ptr);
  265. }
  266. // These are just stubs to get the test case to link standalone.
  267. NPIdentifier
  268. NPN_GetStringIdentifier(const NPUTF8 *name)
  269. {
  270. }
  271. nsPluginInstanceBase *
  272. NS_NewPluginInstance(nsPluginCreateData * aCreateDataStruct)
  273. {
  274. }
  275. NPError
  276. NS_PluginGetValue(NPPVariable aVariable, void *aValue)
  277. {
  278. }
  279. NPError
  280. NS_PluginInitialize()
  281. {
  282. }
  283. void
  284. NS_PluginShutdown()
  285. {
  286. }
  287. char*
  288. NPP_GetMIMEDescription(void)
  289. {
  290. char *x = 0;
  291. return x;
  292. }
  293. void
  294. NS_DestroyPluginInstance(nsPluginInstanceBase *aPlugin)
  295. {
  296. }
  297. // Implement minimal properties handling
  298. bool
  299. NPN_SetProperty(NPP npp, NPObject* obj, NPIdentifier name,
  300. const NPVariant *value)
  301. {
  302. _properties[name] = const_cast<NPVariant *>(value);
  303. }
  304. bool
  305. NPN_GetProperty(NPP npp, NPObject* obj, NPIdentifier name,
  306. const NPVariant *value)
  307. {
  308. return _properties[name];
  309. }
  310. bool
  311. NPN_HasProperty(NPP npp, NPObject* obj, NPIdentifier name,
  312. const NPVariant *value)
  313. {
  314. std::map<NPIdentifier, NPVariant *>::iterator it;
  315. it = _properties.find(name);
  316. if (it != _properties.end()) {
  317. return true;
  318. }
  319. }
  320. void
  321. NPN_ReleaseVariantValue(NPVariant *variant)
  322. {
  323. switch(variant->type) {
  324. case NPVariantType_String:
  325. {
  326. NPN_MemFree(const_cast<NPUTF8*>(NPVARIANT_TO_STRING(*variant).UTF8Characters));
  327. break;
  328. }
  329. case NPVariantType_Object:
  330. {
  331. NPObject* obj = NPVARIANT_TO_OBJECT(*variant);
  332. if (obj) {
  333. NPN_ReleaseObject(obj);
  334. }
  335. break;
  336. }
  337. default:
  338. {}
  339. }
  340. NULL_TO_NPVARIANT(*variant);
  341. }
  342. NPObject*
  343. NPN_RetainObject(NPObject *obj)
  344. { assert(obj); ++obj->referenceCount; return obj; }
  345. void
  346. NPN_ReleaseObject(NPObject *npobj)
  347. {
  348. assert(npobj);
  349. --npobj->referenceCount;
  350. if (npobj->referenceCount == 0) {
  351. NPN_MemFree(npobj);
  352. }
  353. }
  354. // Local Variables:
  355. // mode: C++
  356. // indent-tabs-mode: nil
  357. // End: