// Make sure we can read and write binary AMF strings void test_String(void) { AMF amf_obj; int fd, ret; char buf[AMF_VIDEO_PACKET_SIZE+1]; // First see if we can read strings. This file is produced by // using a network packet sniffer, and should be binary correct. memset(buf, 0, AMF_VIDEO_PACKET_SIZE+1); fd = open("string1.amf", O_RDONLY); ret = read(fd, buf, AMF_VIDEO_PACKET_SIZE); close(fd); char *str = amf_obj.extractString(buf); if (strcmp(str, "connect") == 0) { runtest.pass("Extracted \"connect\" string"); } else { runtest.fail("Extracted \"connect\" string"); } // Now make sure we can also create strings. We'll create the same // string we just read, and make sure they match. char *connect = "connect"; void *out = amf_obj.encodeElement(AMF::STRING, connect, strlen(connect)); if (memcmp(out, buf, 10) == 0) { runtest.pass("Encoded \"connect\" string"); } else { runtest.fail("Encoded \"connect\" string"); } delete str; }
// make sure when we delete a Buffer, *all* the allocated // memory goes away. As the only way to do this is to examine // the malloc buffers in the kernel, this will only work on // POSIX conforming systems, and probabably only Linux & BSD. void test_destruct() { // these tests are bogus unless you have both mallinfo() // and also have memory statistics gathering turned on. #if defined(HAVE_MALLINFO) && defined(USE_STATS_MEMORY) Memory mem(5); mem.addStats(__LINE__); // take a sample Buffer *buf1, *buf2; mem.startCheckpoint(); buf1 = new Buffer(NETBUFSIZE); delete buf1; if (mem.endCheckpoint()) { runtest.pass ("Buffer::~Buffer()"); } else { runtest.fail ("Buffer::~Buffer()"); } mem.startCheckpoint(); buf2 = new Buffer(124); delete buf2; if (mem.endCheckpoint()) { runtest.pass ("Buffer::~Buffer(size_t)"); } else { runtest.fail ("Buffer::~Buffer(size_t)"); } #endif }
void test_Boolean(void) { AMF amf_obj; bool bo = false; // Write a number element void *out = amf_obj.encodeElement(AMF::BOOLEAN, &bo, 0); if (amf_obj.extractElementHeader(out) == AMF::BOOLEAN) { runtest.pass("Boolean header correct"); } else { runtest.fail("Boolean header not correct"); } if (amf_obj.extractElementLength(out) == 1) { runtest.pass("Boolean length returned correct"); } else { runtest.fail("Boolean length returned not correct"); } if (*((char *)out + 1) == 0) { pass("Boolean false returned correct"); } else { runtest.fail("Boolean false returned not correct"); } bo = true; out = amf_obj.encodeElement(AMF::BOOLEAN, &bo, 0); if (*((char *)out + 1) == 1) { runtest.pass("Boolean true returned correct"); } else { runtest.fail("Boolean true returned not correct"); } }
// // Machinery for delayed images rendering (e.g. Xv with YV12 or VAAPI) // void test_iterators(Renderer *renderer, const std::string &type) { cout << "\t"<< type << " iterator tests" << endl; if (!renderer) { runtest.unresolved("No renderer to test!"); return; } Renderer::RenderImages::iterator fit = renderer->getFirstRenderImage(); Renderer::RenderImages::iterator lit = renderer->getLastRenderImage(); // When there are no images, the first and last are the same obviously if (fit == lit) { runtest.pass("getFirstRenderImage()"); } else { runtest.fail("getFirstRenderImage()"); } #if 0 geometry::Point2d a(1, 2); geometry::Point2d c(3, 4); Renderer::RenderImage image; image::GnashImage *frame = new image::ImageRGBA(10, 10); // gnash::GnashVaapiImage *foo = static_cast<gnash::GnashVaapiImage *>(frame); // gnash::GnashVaapiImageProxy *bar = new gnash::GnashVaapiImageProxy(foo, a.x, a.y, c.x - a.x, c.y - a.y); std::auto_ptr<image::GnashImage> rgba(frame); // image.reset(new gnash::GnashVaapiImageProxy(foo, a.x, a.y, c.x - a.x, c.y - a.y)); renderer->addRenderImage(image); // image.reset(new gnash::GnashVaapiImageProxy(foo, a.x, a.y, c.x - a.x, c.y - a.y)); renderer->addRenderImage(image); #endif fit = renderer->getFirstRenderImage(); lit = renderer->getLastRenderImage(); // When there are no images, the first and last are the same obviously if (fit != lit) { runtest.pass("addRenderImage()"); } else { runtest.fail("addRenderImage()"); } #if 0 typedef boost::shared_ptr<GnashVaapiImageProxy> RenderImage; typedef std::vector<RenderImage> RenderImages; // Get first render image virtual RenderImages::iterator getFirstRenderImage() { return _render_images.begin(); } virtual RenderImages::const_iterator getFirstRenderImage() const { return _render_images.begin(); } // Get last render image virtual RenderImages::iterator getLastRenderImage() { return _render_images.end(); } virtual RenderImages::const_iterator getLastRenderImage() const { return _render_images.end(); } #endif }
// Each Renderer has an associated display device, currently EGL // for OpenVG, OpenGLES1, and OpenGLES2. The DirectFB device is // also available for these three renderers. The EGL device can // also be run under X11 using the Mesa libraries. Both EGL and // DirectFB are primarily for framebuffers. While all of the methods // of each device class are available to the Renderer, most aren't // exposed with more accesors beyond these for manipulating the // device setting itself. void test_device(Renderer *renderer, const std::string &type) { cout << endl << "Testing " << type << " Device" << endl; #if 0 boost::shared_array<renderer::GnashDevice::dtype_t> devs = renderer->probeDevices(); if (devs) { runtest.pass("Renderer::probeDevices()"); } else { runtest.fail("Renderer::probeDevices()"); } // Be default, there should be no device associated with this // renderer yet. if (renderer->getDevice() == GnashDevice::NODEV) { runtest.pass("Renderer::getDevice()"); } else { runtest.fail("Renderer::getDevice()"); } // Set to a device and see if it's axctually set renderer->setDevice(GnashDevice::X11); if (renderer->getDevice() == GnashDevice::X11) { runtest.pass("Renderer::setDevice()"); } else { runtest.fail("Renderer::setDevice()"); } // reset to the original value so we don't screw up future tests renderer->resetDevice(); #endif }
void test_remove() { Network::byte_t *data1 = new Network::byte_t[20]; memset(data1, 0, 20); Network::byte_t *data2 = new Network::byte_t[20]; memset(data2, 0, 20); Network::byte_t *data3 = new Network::byte_t[20]; memset(data3, 0, 20); // populate a buffer with some data for (size_t i=0; i< 19; i++) { data1[i] = i + 'a'; } // Build identical buffer nissing one character memcpy(data2, data1, 6); memcpy(data2 + 6, data1 + 7, 20-7); // Remove a single byte Network::byte_t byte = 'g'; Buffer buf1(20); buf1.clear(); buf1.copy(data1, 20); buf1.remove(byte); if (memcmp(data2, buf1.reference(), 19) == 0) { runtest.pass ("Buffer::remove(Network::byte_t)"); } else { runtest.fail ("Buffer::remove(Network::byte_t)"); } Buffer buf2(20); buf2.clear(); buf2.copy(data1, 20); buf2.remove(6); if (memcmp(data2, buf2.reference(), 18) == 0) { runtest.pass ("Buffer::remove(int)"); } else { runtest.fail ("Buffer::remove(int)"); } // Remove a range of bytes memcpy(data3, data1, 6); memcpy(data3 + 6, data1 + 9, 1); Buffer buf3(20); buf3.clear(); buf3.copy(data1, 20); buf3.remove(6, 8); if (memcmp(data3, buf3.reference(), 6) == 0) { runtest.pass ("Buffer::remove(int, int)"); } else { runtest.fail ("Buffer::remove(int, int)"); } delete[] data1; delete[] data2; delete[] data3; }
void test_read(std::string &filespec) { GNASH_REPORT_FUNCTION; struct stat st; boost::shared_ptr<Buffer> hex1(new Buffer("00 bf 00 00 01 28 54 43 53 4f 00 04 00 00 00 00 00 08 73 65 74 74 69 6e 67 73 00 00 00 00 00 04 67 61 69 6e 00 40 49 00 00 00 00 00 00 00 00 0f 65 63 68 6f 73 75 70 70 72 65 73 73 69 6f 6e 01 00 00 00 11 64 65 66 61 75 6c 74 6d 69 63 72 6f 70 68 6f 6e 65 02 00 0e 2f 64 65 76 2f 69 6e 70 75 74 2f 6d 69 63 00 00 0d 64 65 66 61 75 6c 74 63 61 6d 65 72 61 02 00 00 00 00 0d 64 65 66 61 75 6c 74 6b 6c 69 6d 69 74 00 40 59 00 00 00 00 00 00 00 00 0d 64 65 66 61 75 6c 74 61 6c 77 61 79 73 01 00 00 00 10 63 72 6f 73 73 64 6f 6d 61 69 6e 41 6c 6c 6f 77 01 01 00 00 11 63 72 6f 73 73 64 6f 6d 61 69 6e 41 6c 77 61 79 73 01 01 00 00 18 61 6c 6c 6f 77 54 68 69 72 64 50 61 72 74 79 4c 53 4f 41 63 63 65 73 73 01 01 00 00 0c 74 72 75 73 74 65 64 50 61 74 68 73 03 00 00 09 00 00 0c 6c 6f 63 61 6c 53 65 63 50 61 74 68 02 00 00 00 00 10 6c 6f 63 61 6c 53 65 63 50 61 74 68 54 69 6d 65 00 42 71 6d 14 10 22 e0 00 00")); if (stat(filespec.c_str(), &st) == 0) { SOL sol; sol.readFile(filespec); vector<boost::shared_ptr<cygnal::Element> > els = sol.getElements(); if (els.size() > 1) { string str = els[2]->to_string(); // Make sure multiple elements of varying datatypes are checked for. if ((strcmp(els[0]->getName(), "gain") == 0) && (strcmp(els[2]->getName(), "defaultmicrophone") == 0) && (str == "/dev/input/mic") && (strcmp(els[5]->getName(), "defaultalways") == 0) && (strcmp(els[9]->getName(), "trustedPaths") == 0)) { runtest.pass("Read SOL File"); } else { runtest.fail("Read SOL file"); } } else { runtest.fail("Read SOL file"); } // sol.dump(); } }
void test_construct() { // these tests are bogus unless you have both mallinfo() // and also have memory statistics gathering turned on. #if defined(HAVE_MALLINFO) && defined(USE_STATS_MEMORY) bool valgrind = false; size_t fudge = sizeof(long *)*5; Memory mem(5); mem.addStats(__LINE__); // take a sample Buffer buf1; mem.addStats(__LINE__); // take a sample size_t diff = mem.diffStats() - sizeof(buf1); if (diff > NETBUFSIZE) { valgrind = true; log_debug("Running this test case under valgrind screws up mallinfo(), so the results get skewed"); } // Different systems allocate memory slightly differently, so about all we can do to see // if it worked is check to make sure it's within a tight range of possible values. if ((buf1.size() == NETBUFSIZE) && (diff >= (NETBUFSIZE - fudge)) && diff <= (NETBUFSIZE + fudge)) { runtest.pass ("Buffer::Buffer()"); } else { if (valgrind) { runtest.unresolved("Buffer::Buffer()) under valgrind"); } else { runtest.fail("Buffer::Buffer()"); } } mem.addStats(__LINE__); // take a sample Buffer buf2(124); mem.addStats(__LINE__); // take a sample diff = mem.diffStats() - sizeof(long *); if ((buf2.size() == 124) && (124 - fudge) && diff <= (124 + fudge)) { runtest.pass ("Buffer::Buffer(size_t)"); } else { if (valgrind) { runtest.unresolved("Buffer::Buffer(size_t) under valgrind"); } else { runtest.fail("Buffer::Buffer(size_t)"); } } #endif }
void test_resize() { Buffer buf; #ifdef HAVE_MALLINFO if (memdebug) { mem->addStats(__LINE__); // take a sample } #endif if (buf.size() == cygnal::NETBUFSIZE) { runtest.pass ("Buffer::size(NETBUFSIZE)"); } else { runtest.fail ("Buffer::size(NETBUFSIZE)"); } #ifdef HAVE_MALLINFO if (memdebug) { mem->addStats(__LINE__); // take a sample } #endif buf.resize(112); #ifdef HAVE_MALLINFO if (memdebug) { mem->addStats(__LINE__); // take a sample } #endif if (buf.size() == 112) { runtest.pass ("Buffer::resize(112)"); } else { runtest.fail ("Buffer::resize(112)"); } #ifdef HAVE_MALLINFO if (memdebug) { mem->addStats(__LINE__); // take a sample } #endif string str = "Hello World"; buf = str; buf.resize(5); if (memcmp(buf.begin(), str.c_str(), 5) == 0) { runtest.pass ("Buffer resize(5)"); } else { runtest.fail ("Buffer resize(5)"); } }
void test_int(as_value val) { if (val.is_number()) { runtest.pass("as_value(int)"); } else { runtest.fail("as_value(int)"); } }
void test_string(as_value val) { if (val.is_string()) { runtest.pass("as_value(string)"); } else { runtest.fail("as_value(string)"); } }
void test_bool(as_value boolval) { if (boolval.is_bool()) { runtest.pass("as_value(bool)"); } else { runtest.fail("as_value(bool)"); } }
void test_data() { LcShm lcs; // LcShm lcs=LcShm(); char *shmaddr; const string con1 = "localhost:WeBuildTheseOOOOOOOOOOOOOOOOO"; if (lcs.connect(con1)) { runtest.pass("LcShm::connect(localhost:lc_reply)"); } else { runtest.fail("LcShm::connect(localhost:lc_reply)"); } shmaddr = reinterpret_cast<char*>(lcs.begin()); // for gdb Element *el; vector<amf::Element *> els; #if 0 // Apparently this constructor no longer exists. el = new Element(true, 123.456, 987.654, "IAmReplyingNow"); // el->dump(); els.push_back(el); delete el; #endif #if 0 // el = new Element(true); els.push_back(el); el = new Element(12.34); els.push_back(el); el = new Element(12.34); els.push_back(el); string str = "IAmReplyingNow"; el = new Element(str); els.push_back(el); #endif string str = "Volume Level 10 "; el = new Element(str); els.push_back(el); // Send the AMF objects const std::string localS="localhost"; lcs.send(con1, localS, els); // system("ipcs"); // system("dumpshm -i"); sleep(3); delete el; }
// Each header consists of the following: // // * UTF string (including length bytes) - name // * Boolean - specifies if understanding the header is `required' // * Long - Length in bytes of header // * Variable - Actual data (including a type code) void test_Header(void){ AMF amf_obj; amfutf8_t name, headname; amfnum_t num; void *element; amfhead_t *head; note("Test the Header"); num = 123456789; char *test = "NumberTest"; name.length = strlen(test); name.data = test; element = amf_obj.encodeElement(AMF::NUMBER, &num, 0); head = amf_obj.encodeHeader(&name, true, sizeof(amfnum_t), &num); char *ptr = ((char *)head) + 2; if ((strncmp(ptr, test, name.length) == 0) && (ntohs(*(short *)head) == name.length)) { runtest.pass("Header name correct"); } else { runtest.fail("Header name not correct"); } ptr = ((char *)head) + 2 + name.length + 1; if (*ptr == AMF::NUMBER) { runtest.pass("Header Object type correct"); } else { runtest.fail("Header Object type not correct"); } ptr++; if (*ptr == htonl(num)) { runtest.pass("Header Object data correct"); } else { runtest.fail("Header Object data not correct"); } }
void test_find() { // Make some data for the buffers Network::byte_t *data = new Network::byte_t[10]; for (size_t i=0; i<10; i++) { data[i] = i + 'a'; } Buffer buf1, buf2, buf3; Network::byte_t *ptr1 = buf1.reference(); // populate the buffer buf1.copy(data, 10); delete[] data; // See if we can find a character Network::byte_t *fptr = std::find(buf1.begin(), buf1.end(), 'c'); if (fptr == (ptr1 + 2)) { runtest.pass ("Buffer::find(Network::byte_t)"); } else { runtest.fail ("Buffer::find(Network::byte_t)"); } const char *sub = "fgh"; #if 0 Network::byte_t *ptr2 = const_cast<Network::byte_t *>(reinterpret_cast<const Network::byte_t *>(sub)); #endif fptr = std::search(buf1.begin(), buf1.end(), sub, sub+3); if (fptr == (ptr1 + 5)) { runtest.pass ("Buffer::find(Network::byte_t *, size_t)"); } else { runtest.fail ("Buffer::find(Network::byte_t *, size_t)"); } // cygnal::Buffer::init(unsigned int) }
int main(int /*argc*/, char** /*argv*/) { const char* input = INPUT; // Should be the path to this file const char* cachename = "NoSeekFileTestCache"; int fd = open(input, O_RDONLY); int raw = open(input, O_RDONLY); dup2(fd, 0); gnash::IOChannel* reader = gnash::noseek_fd_adapter::make_stream(0, cachename); assert(reader); compare_reads(reader, raw, "wrapped", "raw"); lseek(raw, 0, SEEK_SET); reader->seek(0); compare_reads(reader, raw, "wrapped-rewind", "raw-rewind"); FILE* f = std::fopen(cachename, "r"); std::auto_ptr<gnash::IOChannel> orig = gnash::makeFileChannel(f, false); lseek(raw, 0, SEEK_SET); compare_reads(orig.get(), raw, "cache", "raw"); if (sizeof(size_t) != sizeof(std::streamoff)) { std::streampos pos = std::numeric_limits<size_t>::max(); pos += orig->size() / 2; // Check that seek() handles integer overflow situations gracefully. if (orig->seek(pos)) { runtest.fail("Successfully sought to an invalid position."); } else { runtest.pass("Gracefully handled invalid seek."); } } return 0; }
void test_mem() { boost::shared_ptr<cygnal::Buffer> buf1(new cygnal::Buffer(12)); *buf1 = "Hello World"; // drop the null terminator byte we inherit when using a simnple // string for testing buf1->resize(buf1->size() - 1); DiskStream ds("fooBar1", *buf1); ds.writeToDisk(); ds.close(); struct stat st; memset(&st, 0, sizeof(struct stat)); if (stat("fooBar1", &st) == 0) { runtest.pass("DiskStream::writeToDisk()"); } else { runtest.fail("DiskStream::writeToDisk()"); } }
int main (int /*argc*/, char** /*argv*/) { CRcInitFile& crc = CRcInitFile::getDefaultInstance(); gnash::LogFile& dbglogfile = gnash::LogFile::getDefaultInstance(); dbglogfile.setVerbosity(); // Parse the test config file if (crc.parseFile("cygnalrc")) { runtest.pass ("crc.parseFile()"); } else { runtest.fail ("crc.parseFile()"); } if (crc.useActionDump()) { runtest.fail ("useActionDump"); } else { runtest.pass ("useActionDump"); } if (crc.useParserDump()) { runtest.fail ("useParserDump"); } else { runtest.pass ("useParserDump"); } if (crc.verbosityLevel() == 11) { runtest.pass ("verbosityLevel"); } else { runtest.fail ("verbosityLevel"); } if (crc.getDebugLog() == "/tmp/cygnal-dbg.log") { runtest.pass ("getDebugLog"); } else { runtest.fail ("getDebugLog"); } if (crc.getPortOffset() == 4000) { runtest.pass ("getPortOffset"); } else { runtest.fail ("getPortOffset"); } crc.dump(); }
void test_listen() { LcShm lc; char *shmaddr; string con1 = "localhost:lc_reply"; if (lc.connect("lc_reply")) { runtest.pass("LcShm::connect()"); } else { runtest.fail("LcShm::connect()"); } // shmaddr = reinterpret_cast<char*>(lc.begin()); if (shmaddr == 0) { runtest.unresolved("LcShm::begin()"); return; } else { runtest.pass("LcShm::begin()"); } char *addr = shmaddr + LC_LISTENERS_START; memset(addr, 0, 1024); lc.close(); // Now reconnect to the memory segment, and see if our name // is set. if (lc.connect(con1)) { runtest.pass("LcShm::connect()"); } else { runtest.fail("LcShm::connect()"); } if (strcmp(addr, "localhost:lc_reply") == 0) { runtest.pass("LcShm::addListener(lc_reply)"); } else { runtest.fail("LcShm::addListener(lc_reply)"); } string con2 = "localhost:lc_name1"; if (lc.connect(con2)) { runtest.pass("LcShm::connect(lc_name1)"); } else { runtest.fail("LcShm::connect(lc_name1)"); } if (strcmp(addr, "localhost:lc_reply") == 0) { runtest.pass("LcShm::addListener(lc_reply)"); } else { runtest.fail("LcShm::addListener(lc_reply)"); } // Aftyer removing a listener, everything gets moved up // in the table. The last element gets zero'd out, so // we don't have duplicate entries. lc.removeListener(con1); if ((strcmp(addr, "localhost:lc_name1") == 0) && (addr[con1.size() + 1] == 0) && (addr[con1.size() + 2] == 0) && (addr[con1.size() + 3] == 0)) { runtest.pass("LcShm::removeListener(lc_reply)"); } else { runtest.fail("LcShm::removeListener(lc_reply)"); } Listener list(reinterpret_cast<uint8_t *>(shmaddr)); vector<string>::const_iterator it; auto_ptr< vector<string> > listeners ( list.listListeners() ); if (listeners->size() == 0) { cout << "Nobody is listening" << endl; } else { for (it=listeners->begin(); it!=listeners->end(); it++) { string str = *it; if ((str[0] != ':') || (dbglogfile.getVerbosity() > 0)) { cout << " Listeners: " << str << endl; } } } }
static bool compare_reads(gnash::IOChannel* reader, int fd, const char* first, const char* second) { char buf[CHUNK_SIZE]; char buf2[CHUNK_SIZE]; stringstream ss; size_t consumed = 0; for(;;) { size_t sz1 = reader->read(buf, CHUNK_SIZE); size_t sz2 = read(fd, buf2, CHUNK_SIZE); if ( sz1 != sz2 ) { ss << "Different read size from " << first << " (" << sz1 << ") and " << second << " (" << sz2 << ") file"; runtest.fail(ss.str()); dump_buffer("wrapped", buf, sz1, cout); dump_buffer("raw", buf2, sz2, cout); return false; } if ( sz1 == 0 ) { break; } if ( memcmp(buf, buf2, sz1) ) { ss << "Different read content from " << first << " and " << second << " file"; runtest.fail(ss.str()); dump_buffer("wrapped", buf, sz1, cout); dump_buffer("raw", buf2, sz2, cout); return false; } consumed+=sz1; } if ( consumed == 0 ) { runtest.fail("No bytes read from either " + string(first) + " or " + string(second) + " file"); return false; } if ( ! reader->eof() ) { ss << "tu_file not at EOF at end of read"; runtest.fail(ss.str()); return false; } ss << "compared " << consumed << " bytes from " << first << " and " << second; runtest.pass(ss.str()); return true; return true; }
void test_write(std::string &filespec) { GNASH_REPORT_FUNCTION; SOL sol; AMF amf_obj; // char *data = const_cast<char *>("/dev/input/mic"); // el.getData() = reinterpret_cast<uint8_t *>(data); amf::Element newel; double dub = 50.0; // amf::Element *el = new amf::Element("gain", dub); amf::Element *el = new amf::Element("gain", dub); // amf_obj.createElement(&el, "gain", dub); sol.addObj(el); if ((strcmp(el->getName(), "gain") == 0) && (el->getType() == Element::NUMBER_AMF0) && (el->to_number() == dub) && (el->getLength() == AMF0_NUMBER_SIZE)) { runtest.pass("gain set"); } else { runtest.fail("gain set"); } el = new amf::Element("echosuppression", false); sol.addObj(el); if ((strcmp(el->getName(), "echosuppression") == 0) && (el->getType() == Element::BOOLEAN_AMF0) && (*el->getData() == 0) && (el->getLength() == 1)) { runtest.pass("echosupression set"); } else { runtest.fail("echosupression set"); } string name = "defaultmicrophone"; string data = "/dev/input/mic"; el = new amf::Element("defaultmicrophone", data); sol.addObj(el); if ((el->getName() == name) && (el->getType() == Element::STRING_AMF0) && (memcmp(el->getData(), data.c_str(), el->getLength()) == 0) && (el->getLength() == data.size())) { runtest.pass("defaultmicrophone set"); } else { runtest.fail("defaultmicrophone set"); } data = ""; el = new amf::Element("defaultcamera", data); sol.addObj(el); if ((strcmp(el->getName(), "defaultcamera") == 0) && (el->getType() == Element::STRING_AMF0) && (el->getLength() == 0)) { runtest.pass("defaultcamera set"); } else { runtest.fail("defaultcamera set"); } dub = 100.0; el = new amf::Element("defaultklimit", dub); // el = new amf::Element("defaultklimit", dub); sol.addObj(el); if ((strcmp(el->getName(), "defaultklimit") == 0) && (el->getType() == Element::NUMBER_AMF0) && (el->to_number() == dub) && (el->getLength() == AMF0_NUMBER_SIZE)) { runtest.pass("defaultklimit set"); } else { runtest.fail("defaultklimit set"); } el = new amf::Element("defaultalways", false); sol.addObj(el); if ((strcmp(el->getName(), "defaultalways") == 0) && (el->getType() == Element::BOOLEAN_AMF0) && (el->to_bool() == false) && (el->getLength() == 1)) { runtest.pass("defaultalways set"); } else { runtest.fail("defaultalways set"); } el = new amf::Element("crossdomainAllow", true); sol.addObj(el); if ((strcmp(el->getName(), "crossdomainAllow") == 0) && (el->getType() == Element::BOOLEAN_AMF0) && (el->to_bool() == true) && (el->getLength() == 1)) { runtest.pass("crossdomainAllow set"); } else { runtest.fail("crossdomainAllow set"); } el = new amf::Element("crossdomainAlways", true); sol.addObj(el); if ((strcmp(el->getName(), "crossdomainAlways") == 0) && (el->getType() == Element::BOOLEAN_AMF0) && (*el->getData() == 1) && (el->getLength() == 1)) { runtest.pass("crossdomainAlways set"); } else { runtest.fail("crossdomainAlways set"); } el = new amf::Element("allowThirdPartyLSOAccess", true); sol.addObj(el); if ((strcmp(el->getName(), "allowThirdPartyLSOAccess") ==0) && (el->getType() == Element::BOOLEAN_AMF0) && (*el->getData() == 1) && (el->getLength() == 1)) { runtest.pass("allowThirdPartyLSOAccess set"); } else { runtest.fail("allowThirdPartyLSOAccess set"); } el = new amf::Element("localSecPath", data); sol.addObj(el); if ((strcmp(el->getName(), "localSecPath") == 0) && (el->getType() == Element::STRING_AMF0) && (el->getLength() == 0)) { runtest.pass("localSecPath set"); } else { runtest.fail("localSecPath set"); } // Grabbed from GDB when reading this huge value dub = 1.8379389592608646e-304; swapBytes(&dub, 8); el = new amf::Element("localSecPathTime", dub); sol.addObj(el); if ((strcmp(el->getName(), "localSecPathTime") ==0) && (el->getType() == Element::NUMBER_AMF0) && (memcmp(el->getData(), &dub, AMF0_NUMBER_SIZE) == 0) && (*((double *)el->getData()) == dub) && (el->getLength() == AMF0_NUMBER_SIZE)) { runtest.pass("localSecPathTime set"); } else { runtest.fail("localSecPathTime set"); } sol.dump(); // now write the data to disk sol.writeFile(filespec, "settings"); }
void test_isnan() { float num = 0; if(!isNaN(num)) { runtest.pass("isNaN(0)"); } else { runtest.fail("isNaN(0)"); } num /= 9999999; if(!isNaN(num)) { runtest.pass("isNaN(9999999)"); } else { runtest.fail("isNaN(9999999)"); } if(isFinite(num)) { runtest.pass("isFinite(9999999)"); } else { runtest.fail("isFinite(9999999)"); } num = std::numeric_limits<float>::quiet_NaN(); if(isNaN(num)) { runtest.pass("isNaN(quiet_NaN)"); } else { runtest.fail("isNaN(quiet_NaN)"); } if(!isFinite(num)) { runtest.pass("isFinite(quiet_NaN)"); } else { runtest.fail("isFinite(quiet_NaN)"); } num = std::numeric_limits<float>::infinity(); if(!isNaN(num)) { runtest.pass("isNaN(infinity)"); } else { runtest.fail("isNaN(infinity)"); } if(!isFinite(num)) { runtest.pass("isFinite(infinity)"); } else { runtest.fail("isFinite(infinity)"); } num = 1.0 / 0.0; if(!isNaN(num)) { runtest.pass("isNaN(1.0/0.0)"); } else { runtest.fail("isNaN(1.0/0.0)"); } if(!isFinite(num)) { runtest.pass("isFinite(1.0/0.0)"); } else { runtest.fail("isFinite(1.0/0.0)"); } int intgr = num; num = intgr; if(!isNaN(num)) { runtest.pass("isNaN(int)"); } else { runtest.fail("isNaN(int)"); } if(isFinite(num)) { runtest.pass("isFinite(int)"); } else { runtest.fail("isFinite(int)"); } }
int main (int /*argc*/, char** /*argv*/) { RcInitFile& rc = RcInitFile::getDefaultInstance(); LogFile& dbglogfile = LogFile::getDefaultInstance(); dbglogfile.setVerbosity(); int diff = 0; // Parse the test config file if (rc.parseFile("gnashrc")) { runtest.pass ("rc.parseFile()"); } else { runtest.fail ("rc.parseFile()"); } // If we don't have support for mallinfo(), this code is useless #if HAVE_MALLINFO Memory mem; mem.startStats(); mem.addStats(__LINE__); // take a sample mem.addStats(__LINE__); // take a sample diff = mem.diffStats(); if (mem.diffStats() == 0) { runtest.pass("No allocations yet"); } else { runtest.fail("No allocations yet"); } Memory m1; mem.addStats(__LINE__); // take a sample diff = mem.diffStats(); // cerr << "Memory::Memory: " << diff << endl; if ((diff >= 8) || (diff <= 16)) { runtest.pass("Memory::Memory"); } else { runtest.fail("Memory::Memory"); } if (mem.diffStamp() > 0) { runtest.pass("Memory::diffStamp()"); } else { runtest.fail("Memory::diffStamp()"); } if (mem.diffStats() > 0) { runtest.pass("Memory::diffStats()"); } else { runtest.fail("Memory::diffStats()"); } char *x = new char[120]; mem.addStats(__LINE__); // take a sample diff = mem.diffStats(); // cerr << "Buffer allocation: " << diff << endl; if ((diff >= 104) && (diff <= 136)) { runtest.pass("Buffer allocation"); } else { runtest.fail("Buffer allocation"); } vector<string> sv; sv.push_back("Hello World"); mem.addStats(__LINE__); // take a sample diff = mem.diffStats(); // cerr << "First string allocated: " << diff << endl; if ((diff >= 40) && (diff <= 48)) { runtest.pass("First string allocated"); } else { runtest.fail("First string allocated"); } sv.push_back("Aloha"); delete x; mem.addStats(__LINE__); // take a sample diff = mem.diffStats(); // cerr << "Second string allocated: " << diff << endl; if ((diff >= -104) && (diff <= -96)) { runtest.pass("Second string allocated"); } else { runtest.fail("Second string allocated"); } sv.push_back("Guten Tag"); mem.addStats(__LINE__); // take a sample diff = mem.diffStats(); // cerr << "Third string allocated: " << diff << endl; if ((diff >= 40) && (diff <= 48)){ runtest.pass("Third string allocated"); } else { runtest.fail("Third string allocated"); } mem.startCheckpoint(); test_leak(); if (mem.endCheckpoint()) { runtest.fail("leak"); } else { runtest.pass("leak"); } mem.addStats(__LINE__); // take a sample if (mem.diffStats() == 32) { runtest.pass("test_leak"); } else { runtest.fail("test_leak"); } mem.startCheckpoint(); test_noleak(); mem.addStats(__LINE__); // take a sample if (mem.endCheckpoint()) { runtest.pass("noleak"); } else { runtest.fail("noleak"); } diff = mem.diffStats(); if ((diff >= 0) && (diff <= 8)) { runtest.pass("test_noleak"); } else { runtest.fail("test_noleak"); } mem.endStats(); // mem.dump(); mem.analyze(); #else runtest.untested("No support for mallinfo()"); #endif // end of HAVE_MALLINFO }
int main(int argc, char *argv[]) { char buffer[300]; int c; memset(buffer, 0, 300); while ((c = getopt (argc, argv, "hdvsm:")) != -1) { switch (c) { case 'h': usage (); break; case 'v': verbosity++; break; default: usage (); break; } } // get the file name from the command line if (optind < argc) { string filespec = argv[optind]; cout << "Will use \"" << filespec << "\" for test " << endl; } AMF amf_obj; int fd, ret; unsigned char buf[AMF_PACKET_SIZE+1]; AMF::amf_element_t el; // First see if we can read variables. This file is produced by // using a network packet sniffer, and should be binary correct. memset(buf, 0, AMF_PACKET_SIZE+1); string filespec = SRCDIR; filespec += "/string-variable.amf"; fd = open(filespec.c_str(), O_RDONLY); if (fd <= 0) { cerr << "Couldn't open the binary test file!" << endl; exit(1); } ret = read(fd, buf, AMF_PACKET_SIZE); close(fd); if (amf_obj.extractVariable(&el, buf)) { runtest.pass("Got String element"); } else { runtest.fail("Got String element"); } if ((el.type == amf::AMF::STRING) && (el.length == 25) && (el.name == "tcUrl")) { runtest.pass("Got String element data"); } else { runtest.fail("Got String element data"); } char *out = (char*)amf_obj.encodeVariable("tcUrl", "rtmp://localhost/oflaDemo"); if ((out[1] == 0x5) && (out[2] == 't') && (out[3] == 'c') && (out[4] == 'U') && (out[5] == 'r') && (out[6] == 'l')) { runtest.pass("String Variable name correct"); } else { runtest.fail("String Variable name correct"); } if ((out[7] == AMF::STRING) && (out[8] == 0x0) && (out[9] == 25) && (out[10] == 'r') && (out[11] == 't') && (out[12] == 'm') && (out[13] == 'p') && (out[14] == ':')) { runtest.pass("Variable String data correct"); } else { runtest.fail("Variable String data correct"); } if (memcmp(buf, out, 0x15) == 0) { runtest.pass("String Packets match"); } else { runtest.fail("String Packets match"); } delete [] out; // Test number fields memset(buf, 0, AMF_PACKET_SIZE+1); filespec = SRCDIR; filespec += "/number-variable.amf"; fd = open(filespec.c_str(), O_RDONLY); ret = read(fd, buf, AMF_PACKET_SIZE); close(fd); if (amf_obj.extractVariable(&el, buf)) { runtest.pass("Got Number element"); } else { runtest.fail("Got Number element"); } if ((el.type == amf::AMF::NUMBER) && (el.name == "audioCodecs") && (el.data[5] == 0x38) && (el.data[6] == 0x83) && (el.data[7] == 0x40)) { runtest.pass("Got Number element data"); } else { runtest.fail("Got Number element data"); } amfnum_t bignum = 0x388340L; out = (char*)amf_obj.encodeVariable("audioCodecs", bignum); if ((out[1] == 11) && (out[2] == 'a') && (out[3] == 'u') && (out[4] == 'd') && (out[5] == 'i') && (out[6] == 'o')) { runtest.pass("Number Variable name correct"); } else { runtest.fail("Number Variable name correct"); } if ((out[13] == AMF::NUMBER) && (out[14] == 0x40) && (out[15] == -125) && (out[16] == 0x38)) { runtest.pass("Variable Number data correct"); } else { runtest.fail("Variable Number data correct"); } if (memcmp(buf, out, 0x15) == 0) { runtest.pass("Number Packets match"); } else { runtest.fail("Number Packets match"); } delete [] out; }
int main (int /*argc*/, char** /*argv*/) { RcInitFile& rc = RcInitFile::getDefaultInstance(); gnash::LogFile& dbglogfile = gnash::LogFile::getDefaultInstance(); dbglogfile.setVerbosity(); // Default rendering quality is driven by SWF if (rc.qualityLevel() == -1) { runtest.pass ("rc.qualityLevel() == -1"); } else { runtest.fail ("rc.qualityLevel() != -1"); } // Parse the test config file if (rc.parseFile("gnashrc")) { runtest.pass ("rc.parseFile()"); } else { runtest.fail ("rc.parseFile()"); } // By default, use a splash screen if (rc.useSplashScreen()) { runtest.pass ("useSplashScreen default"); } else { runtest.fail ("useSplashScreen default"); } // By default, limit access to the local host only if (rc.useLocalDomain()) { runtest.pass ("useLocalDomain default"); } else { runtest.fail ("useLocalDomain default"); } if (rc.useLocalHost()) { runtest.pass ("useLocalHost default"); } else { runtest.fail ("useLocalHost default"); } if (rc.useActionDump()) { runtest.fail ("useActionDump"); } else { runtest.pass ("useActionDump"); } if (rc.useParserDump()) { runtest.fail ("useParserDump"); } else { runtest.pass ("useParserDump"); } if (rc.useWriteLog()) { runtest.pass ("useWriteLog"); } else { runtest.fail ("useWriteLog"); } if (rc.useDebugger()) { runtest.fail ("useDebugger"); } else { runtest.pass ("useDebugger"); } if (rc.getTimerDelay() == 50) { runtest.pass ("getTimerDelay"); } else { runtest.fail ("getTimerDelay"); } if (rc.verbosityLevel() == 1) { runtest.pass ("verbosityLevel"); } else { runtest.fail ("verbosityLevel"); } if (rc.useSound() == 0) { runtest.pass ("useSound"); } else { runtest.fail ("useSound"); } if (rc.usePluginSound() == 0) { runtest.pass ("usePluginSound"); } else { runtest.fail ("usePluginSound"); } if (rc.enableExtensions() == 1) { runtest.pass ("enableExtensions"); } else { runtest.fail ("enableExtensions"); } if (rc.getFlashVersionString() == "GSH 9,0,99,0") { runtest.pass ("getFlashVersionString"); } else { runtest.fail ("getFlashVersionString"); } if (rc.getDebugLog() == "/tmp/gnash-dbg.log") { runtest.pass ("getDebugLog"); } else { runtest.fail ("getDebugLog"); } if (rc.startStopped() == 1) { runtest.pass ("startStopped"); } else { runtest.fail ("startStopped"); } if (rc.getStreamsTimeout() == 1.5) { runtest.pass ("streamsTimeout"); } else { runtest.fail ("streamsTimeout"); } if (rc.insecureSSL()) { runtest.pass ("insecureSSL"); } else { runtest.fail ("insecureSSL"); } if (rc.getSOLSafeDir().size() > 0) { runtest.pass ("getSOLSafeDir"); } else { runtest.fail ("getSOLSafeDir"); } // Parsed gnashrc sets qualityLevel to 0 (low) if (rc.qualityLevel() == 0) { runtest.pass ("rc.qualityLevel() == 0"); } else { runtest.fail ("rc.qualityLevel() != 0"); } std::vector<std::string> whitelist = rc.getWhiteList(); if (whitelist.size()) { if ((whitelist[0] == "www.doonesbury.com") && (whitelist[1] == "www.cnn.com") && (whitelist[2] == "www.9news.com")) { runtest.pass ("rc.getWhiteList()"); } else { runtest.fail ("rc.getWhiteList()"); } runtest.pass ("rc.getWhiteList() has elements"); } else { runtest.fail ("rc.getWhiteList() doesn't have elements"); } if (rc.getLCShmKey() == 0xdd3adabd) { runtest.pass ("rc.getLCShmKey() == 0xabcd1234"); } else { runtest.fail ("rc.getLCShmKey() != 0xabcd1234"); } if (rc.getRootCert() == "testrootcert.pem") { runtest.pass ("rc.getRootCert() == testrootcert.pem"); } else { runtest.fail ("rc.getRootCert() != testrootcert.pem"); } if (rc.getCertFile() == "testclient.pem") { runtest.pass ("rc.getCertFile() == testclient.pem"); } else { runtest.fail ("rc.getCertFile() != testclient.pem"); } if (rc.getCertDir() == "/test/etc/pki/tls/") { runtest.pass ("rc.getCertDir() == /test/etc/pki/tls/"); } else { runtest.fail ("rc.getCertDir() != /test/etc/pki/tls/"); } std::vector<std::string> blacklist = rc.getBlackList(); if (blacklist.size()) { if ((blacklist[0] == "www.doubleclick.com") && (blacklist[1] == "www.ebay.com")) { runtest.pass ("rc.getBlackList()"); } else { runtest.fail ("rc.getBlackList()"); } runtest.pass ("rc.getBlackList() has elements"); } else { runtest.fail ("rc.getBlackList() doesn't have elements"); } const std::vector<std::string>& localSandbox = rc.getLocalSandboxPath(); if (localSandbox.size() != 1) { runtest.fail ("rc.getLocalSandboxPath() doesn't have 1 element after set"); } else { if ( localSandbox[0] == "/tmp/p1" ) { runtest.pass ("set localSandbox"); } else { runtest.fail ("rc.getLocalSandboxPath() doesn't have the correct first element after set"); } } if (rc.getURLOpenerFormat() == "lynx %u") { runtest.pass ("getURLOpenerFormat"); } else { runtest.fail ("getURLOpenerFormat"); } if (rc.getSOLSafeDir() == "/tmp/SharedObjects") { runtest.pass ("getSOLSafeDir"); } else { runtest.fail ("getSOLSafeDir"); } if (rc.getSOLReadOnly() == true) { runtest.pass ("getSOLReadOnly"); } else { runtest.fail ("getSOLReadOnly"); } if (rc.ignoreShowMenu() == false) { runtest.pass ("ignoreShowMenu"); } else { runtest.fail ("ignoreShowMenu"); } if ( rc.getRenderer().empty() ) { runtest.pass ("getRenderer gives empty string"); } else { runtest.fail ("getRenderer gives " + rc.getRenderer() ); } if ( rc.getMediaHandler().empty() ) { runtest.pass ("getMediaHandler gives empty string"); } else { runtest.fail ("getMediaHandler gives " + rc.getMediaHandler() ); } // Parse a second file if (rc.parseFile("gnashrc-local")) { // Test whether blacklist in gnashrc-local is appended std::vector<std::string> blacklist = rc.getBlackList(); if (blacklist.size()) { if ((blacklist[2] == "www.gnashdev.org") && (blacklist[3] == "www.wikipedia.de")) { runtest.pass ("rc.getBlackList(): append"); } else { runtest.fail ("rc.getBlackList(): append"); } runtest.pass ("rc.getBlackList(): has appended elements"); } else { runtest.fail ("rc.getBlackList(): doesn't appended elements"); } // Test local override of previous whitelist std::vector<std::string> whitelist = rc.getWhiteList(); if (whitelist.size()) { runtest.fail ("rc.getWhiteList(): local override failed"); } else { runtest.pass ("rc.getWhiteList(): local override succeeded"); } // Test local override of previous local sandbox const std::vector<std::string>& localSandbox = rc.getLocalSandboxPath(); if (localSandbox.empty()) { runtest.fail ("rc.getLocalSandboxPath() doesn't have elements after append"); } else { if ( localSandbox.back() == "/tmp/gnash" ) { runtest.pass ("append localSandbox"); } else { runtest.fail ("rc.getLocalSandboxPath() doesn't have the correct last element after append"); } } if ( rc.getRenderer() == std::string("fakeRenderer") ) { runtest.pass ("getRenderer gives " + rc.getRenderer() ); } else { runtest.fail ("getRenderer gives " + rc.getRenderer() ); } if ( rc.getMediaHandler() == std::string("fakeMediaHandler") ) { runtest.pass ("getMediaHandler gives " + rc.getMediaHandler() ); } else { runtest.fail ("getMediaHandler gives " + rc.getMediaHandler() ); } } }
void test_geometry(Renderer *renderer, const std::string &type) { cout << "\t" << type << " geometry tests" << endl; if (!renderer) { runtest.unresolved("No renderer to test!"); return; } int x = 10; int y = 10; geometry::Point2d nz(200, 0); geometry::Point2d z(x, y); geometry::Range2d<int> pixelbounds; geometry::Range2d<int> worldbounds; Timer tpixtow("pixel_to_world(int, int)"); z = renderer->pixel_to_world(x, y); tpixtow.stop(); if ((z.x >= 199) || (z.y >= 199)) { runtest.pass(std::string("pixel_to_world(int, int) ") + tpixtow.elapsed()); } else { runtest.fail(std::string("pixel_to_world(int, int) ") + tpixtow.elapsed()); } #if 0 Timer tpixtow2("pixel_to_world(pixelbounds)"); worldbounds = renderer->pixel_to_world(pixelbounds); tpixtow2.stop(); if (worldbounds.isNull()) { runtest.pass(std::string("pixel_to_world(geometry::Range2d<int>) ") + tpixtow2.elapsed()); } else { runtest.fail(std::string("pixel_to_world(geometry::Range2d<int>) ") + tpixtow2.elapsed()); } #else runtest.untested("pixel_to_world(geometry::Range2d<int>)"); #endif Timer twtop("world_to_pixel(geometry::Range2d<int>)"); pixelbounds = renderer->world_to_pixel(worldbounds); twtop.stop(); if (pixelbounds.isNull()) { runtest.pass(std::string("world_to_pixel(geometry::Range2d<int>) ") + twtop.elapsed()); } else { runtest.fail(std::string("world_to_pixel(geometry::Range2d<int>) ") + twtop.elapsed()); } SWFRect bounds; Timer tbounds1("bounds_in_clipping_area(SWFRect)"); bool ret = renderer->bounds_in_clipping_area(bounds); tbounds1.stop(); if (ret) { runtest.pass(std::string("bounds_in_clipping_area(SWFRect) ") + tbounds1.elapsed()); } else { runtest.fail(std::string("bounds_in_clipping_area(SWFRect) ") + tbounds1.elapsed()); } InvalidatedRanges ranges; Timer tbounds2("bounds_in_clipping_area(InvalidatedRanges)"); ret = renderer->bounds_in_clipping_area(ranges); tbounds2.stop(); if (!ret) { runtest.pass(std::string("bounds_in_clipping_area(InvalidatedRanges) ") + tbounds2.elapsed()); } else { runtest.fail(std::string("bounds_in_clipping_area(InvalidatedRanges) ") + tbounds2.elapsed()); } Timer tbounds3("bounds_in_clipping_area(geometry::Range2d<int>)"); ret = renderer->bounds_in_clipping_area(pixelbounds); tbounds3.stop(); if (!ret) { runtest.pass(std::string("bounds_in_clipping_area(geometry::Range2d<int>) ") + tbounds3.elapsed()); } else { runtest.fail(std::string("bounds_in_clipping_area(geometry::Range2d<int>) ") + tbounds3.elapsed()); } }
void test_read() { LcShm lc; char *shmaddr; string con1 = "lc_reply"; if (lc.connect(con1)) { runtest.pass("LcShm::connect()"); } else { runtest.fail("LcShm::connect()"); } shmaddr = reinterpret_cast<char*>(lc.begin()); // if (memcmp(shmaddr, con1.c_str(): // Since this is a test case, populate the memory with known good data string srcdir = SRCDIR; srcdir += "/segment.raw"; int fd = ::open(srcdir.c_str(), O_RDONLY); void *dataptr = mmap(0, 64528, PROT_READ, MAP_SHARED, fd, 0); #if 1 if (dataptr != (void*)-1) { memcpy(shmaddr, dataptr, 64528); } else { cerr << "ERROR: couldn't map input file!" << endl; } #endif ::close(fd); Listener list(reinterpret_cast<uint8_t *>(shmaddr)); vector<string>::const_iterator it; auto_ptr< vector<string> > listeners ( list.listListeners() ); if (listeners->size() == 0) { cout << "Nobody is listening" << endl; } else { for (it=listeners->begin(); it!=listeners->end(); it++) { string str = *it; if ((str[0] != ':') || (dbglogfile.getVerbosity() > 0)) { cout << " Listeners: " << str << endl; } } } #if 0 string str = "localhost:lc_name1"; if (list.findListener(str)) { runtest.pass("LcShm::findListener()"); } else { runtest.fail("LcShm::findListener()"); } #endif // list.addListener(filespec); listeners = list.listListeners(); // will delete former listener list if (listeners->empty()) { cout << "Nobody is listening" << endl; } else { for (it=listeners->begin(); it!=listeners->end(); it++) { string str = *it; if ((str[0] != ':') || (dbglogfile.getVerbosity() > 0)) { cout << " Listeners: " << str << endl; } } } // boost::uint8_t *ptr = lc.parseHeader(reinterpret_cast<boost::uint8_t *>(shmaddr)); // vector<amf::Element *> ellist = lc.parseBody(ptr); // cout << "# of AMF Elements in file: " << ellist.size() << endl; // lc.dump(); lc.close(); // cleanup // delete ptr; }
int main(int argc, char *argv[]) { // FIXME: for now, always run verbose till this supports command line args dbglogfile.setVerbosity(); rawfb::RawFBDevice rfb; if (!rfb.initDevice(argc, argv)) { runtest.fail("RawFBDevice:InitDevice()"); } else { runtest.pass("RawFBDevice:InitDevice()"); } bool ret = rfb.attachWindow(rfb.getHandle()); if (rfb.getFBMemory()) { runtest.pass("RawFBDevice::attachWindow()"); } else { runtest.fail("RawFBDevice::attachWindow()"); } #ifdef ENABLE_DOUBLE_BUFFERING if (rfb.getOffscreenBuffer()) { runtest.pass("RawFBDevice::getOffscreenBuffer()"); } else { runtest.fail("RawFBDevice::getOffscreenBuffer()"); } #else runtest.untested("RawFBDevice::getOffscreenBuffer()"); #endif if (ret && rfb.getStride()) { runtest.pass("RawFBDevice::getStride()"); } else { runtest.fail("RawFBDevice::getStride()"); } if (ret && rfb.getWidth()) { runtest.pass("RawFBDevice::getWidth()"); } else { runtest.fail("RawFBDevice::getWidth()"); } if (ret && rfb.getHeight()) { runtest.pass("RawFBDevice::getHeight()"); } else { runtest.fail("DirecTFBDevice::getHeight()"); } if (ret && rfb.isSingleBuffered()) { runtest.pass("RawFBDevice::is*Buffered()"); } else { runtest.fail("RawFBDevice::is*Buffered()"); } if (ret && rfb.getDepth()) { runtest.pass("RawFBDevice::getDepth()"); } else { runtest.fail("RawFBDevice::getDepth()"); } if (ret && rfb.getRedSize() > 0) { runtest.pass("RawFBDevice::getRedSize()"); } else { runtest.fail("RawFBDevice::getRedSize()"); } if (ret && rfb.getGreenSize() > 0) { runtest.pass("RawFBDevice::getGreenSize()"); } else { runtest.fail("RawFBDevice::getGreenSize()"); } if (ret && rfb.getBlueSize() > 0) { runtest.pass("RawFBDevice::getBlueSize()"); } else { runtest.fail("RawFBDevice::getBlueSize()"); } #if 0 if (rfb.setGrayscaleLUT8()) { runtest.pass("RawFBDevice::setGrayscaleLUT8()"); } else { runtest.fail("RawFBDevice::setGrayscaleLUT8()"); } #endif // AGG uses these to calculate the poixel format #ifdef RENDERER_AGG if (ret && rfb.getRedOffset() > 0) { runtest.pass("RawFBDevice::getRedOffset()"); } else { runtest.fail("RawFBDevice::getRedOffset()"); } if (ret && rfb.getGreenOffset() > 0) { runtest.pass("RawFBDevice::getGreenOffset()"); } else { runtest.fail("RawFBDevice::getGreenOffset()"); } if (ret && rfb.getBlueOffset() == 0) { runtest.pass("RawFBDevice::getBlueOffset()"); } else { runtest.fail("RawFBDevice::getBlueOffset()"); } #endif // This is a manual test to see if we can draw a line on the // raw framebuffer to make sure it got initialized correctly. int x = 0, y = 0; long location = 0; int line_length = rfb.getStride(); std::uint8_t *fbp = 0; fbp = rfb.getFBMemory(); if (fbp > 0) { runtest.pass("RawFBDevice::getFBMemory()"); } else { runtest.fail("RawFBDevice::getFBMemory()"); exit; } for(y=100; y<102; y++); /* Where we are going to put the pixel */ for(x=0; x<200; x++) { /* Figure out where in memory to put the pixel */ location = x * (rfb.getDepth()/8) + y * line_length; *(fbp + location) = 89; /* Some blue */ *(fbp + location + 1) = 40; /* A little green */ *(fbp + location + 2) = 200; /* A lot of red */ *(fbp + location + 3) = 0; /* No transparency */ } return 0; }
void test_write() { #if 0 AMF amf_obj; // char *data = const_cast<char *>("/dev/input/mic"); // el.data = reinterpret_cast<uint8_t *>(data); AMF::amf_element_t el; AMF::amf_element_t newel; double dub = 50.0; amf_obj.createElement(&el, "gain", dub); sol.addObj(el); if ((el.name == "gain") && (el.type == AMF::NUMBER) && (memcmp(el.data, &dub, AMF0_NUMBER_SIZE) == 0) && (*((double *)el.data) == dub) && (el.length == AMF0_NUMBER_SIZE)) { runtest.pass("gain set"); } else { runtest.fail("gain set"); } boost::uint8_t *foo = amf_obj.encodeVariable(el); char *ptr = (char *)amf_obj.extractVariable(&newel, foo); if ((el.name == newel.name) && (el.length == newel.length) && (newel.type == AMF::NUMBER) && (memcmp(el.data, newel.data, el.length) == 0)) { runtest.pass("gain number encoded/extracted"); } else { runtest.fail("gain number encoded/extracted"); } amf_obj.createElement(&el, "echosuppression", false); sol.addObj(el); if ((el.name == "echosuppression") && (el.type == AMF::BOOLEAN) && (*el.data == 0) && (el.length == 1)) { runtest.pass("echosupression set"); } else { runtest.fail("echosupression set"); } foo = amf_obj.encodeVariable(el); ptr = (char *)amf_obj.extractVariable(&newel, reinterpret_cast<uint8_t *>(foo)); if ((el.name == newel.name) && (el.type == AMF::BOOLEAN) && (el.length == newel.length) && (memcmp(el.data, newel.data, el.length) == 0)) { runtest.pass("echosupression bool(false) encoded/extracted"); } else { runtest.fail("echosupression bool(false) encoded/extracted"); } string name = "defaultmicrophone"; string data = "/dev/input/mic"; amf_obj.createElement(&el, name, data); sol.addObj(el); if ((el.name == name) && (el.type == AMF::STRING) && (memcmp(el.data, data.c_str(), el.length) == 0) && (el.length == data.size())) { runtest.pass("defaultmicrophone set"); } else { runtest.fail("defaultmicrophone set"); } amf_obj.createElement(&el, "defaultcamera", ""); sol.addObj(el); if ((el.name == "defaultcamera") && (el.type == AMF::STRING) && (*el.data == 0) && (el.length == 0)) { runtest.pass("defaultcamera set"); } else { runtest.fail("defaultcamea set"); } dub = 100.0; amf_obj.createElement(&el, "defaultklimit", dub); sol.addObj(el); if ((el.name == "defaultklimit") && (el.type == AMF::NUMBER) && (memcmp(el.data, &dub, AMF0_NUMBER_SIZE) == 0) && (*((double *)el.data) == dub) && (el.length == AMF0_NUMBER_SIZE)) { runtest.pass("defaultklimit set"); } else { runtest.fail("defaultklimit set"); } amf_obj.createElement(&el, "defaultalways", false); sol.addObj(el); if ((el.name == "defaultalways") && (el.type == AMF::BOOLEAN) && (*el.data == 0) && (el.length == 1)) { runtest.pass("defaultalways set"); } else { runtest.fail("defaultalways set"); } amf_obj.createElement(&el, "crossdomainAllow", true); sol.addObj(el); if ((el.name == "crossdomainAllow") && (el.type == AMF::BOOLEAN) && (*el.data == 1) && (el.length == 1)) { runtest.pass("crossdomainAllow set"); } else { runtest.fail("crossdomainAllow set"); } amf_obj.createElement(&el, "crossdomainAlways", true); sol.addObj(el); if ((el.name == "crossdomainAlways") && (el.type == AMF::BOOLEAN) && (*el.data == 1) && (el.length == 1)) { runtest.pass("crossdomainAlways set"); } else { runtest.fail("crossdomainAlways set"); } amf_obj.createElement(&el, "allowThirdPartyLSOAccess", true); sol.addObj(el); if ((el.name == "allowThirdPartyLSOAccess") && (el.type == AMF::BOOLEAN) && (*el.data == 1) && (el.length == 1)) { runtest.pass("allowThirdPartyLSOAccess set"); } else { runtest.fail("allowThirdPartyLSOAccess set"); } // FIXME: Why does GCC keep linking this to the bool // version instead ? boost::intrusive_ptr<gnash::as_object> as; amf_obj.createElement(&el, "trustedPaths", &as); if ((el.name == "trustedPaths") && (el.type == AMF::OBJECT)) { runtest.pass("trustedPaths set"); } else { runtest.fail("trustedPaths set"); // force the type so the binary output stays correct. // As this builds a null object, we get away with it, // and it helps debugging to have the hexdumps of the // .sol files match the originals. el.type = AMF::OBJECT; el.length = 0; } sol.addObj(el); amf_obj.createElement(&el, "localSecPath", ""); sol.addObj(el); if ((el.name == "localSecPath") && (el.type == AMF::STRING) && (*el.data == 0) && (el.length == 0)) { runtest.pass("localSecPath set"); } else { runtest.fail("localSecPath set"); } // Grabbed from GDB when reading this huge value dub = 1.8379389592608646e-304; swapBytes(&dub, 8); amf_obj.createElement(&el, "localSecPathTime", dub); sol.addObj(el); if ((el.name == "localSecPathTime") && (el.type == AMF::NUMBER) && (memcmp(el.data, &dub, AMF0_NUMBER_SIZE) == 0) && (*((double *)el.data) == dub) && (el.length == AMF0_NUMBER_SIZE)) { runtest.pass("localSecPathTime set"); } else { runtest.fail("localSecPathTime set"); } // sol.dump(); // now write the data to disk sol.writeFile(filespec, "settings"); #endif }
void test_renderer(Renderer *renderer, const std::string &type) { cout << "Testing " << type << " Renderer" << endl; // Timer trend("Renderer Tests", true); if (!renderer) { runtest.unresolved("No renderer to test!"); return; } if (renderer > 0) { runtest.pass("Got Renderer"); } else { runtest.fail("Couldn't get Renderer"); } if (!renderer->description().empty()) { if (renderer->description() == type) { runtest.pass("description is correct"); } else { runtest.fail("description is wrong"); } } else { runtest.fail("Couldn't get description!"); } #if 0 if (renderer->getBitsPerPixel()) { runtest.pass("getBitsPerPixel()"); } else { runtest.fail("getBitsPerPixel()"); } #endif image::GnashImage *frame1 = new image::ImageRGBA(10, 12); std::auto_ptr<image::GnashImage> im1(frame1); CachedBitmap *cb = renderer->createCachedBitmap(im1); if (cb) { image::GnashImage &gi = cb->image(); if ((gi.width() == 10) && (gi.height() == 12)) { runtest.pass("createCachedBitmap()"); } else { runtest.fail("createCachedBitmap()"); } } else { runtest.unresolved("createCachedBitmap()"); } #if 0 // FIXME: initTestBuffer() is going away, replaced by the fake // framebuffer code. // Initializes the renderer for off-screen rendering used by the testsuite. if (renderer->initTestBuffer(10, 10)) { runtest.pass("initTestBuffer()"); } else { runtest.fail("initTestBuffer()"); } #endif /// @coords an array of 16-bit signed integer coordinates. Even indices /// (and 0) are x coordinates, while uneven ones are y coordinates. /// @vertex_count the number of x-y coordinates (vertices). /// @color the color to be used to draw the line strip. /// @mat the SWFMatrix to be used to transform the vertices. boost::uint16_t x = 10; boost::uint16_t y = 10; boost::uint16_t h = 10; std::vector<point> box = boost::assign::list_of (point(x, y)) (point(x, y + h)); rgba color(0, 0, 0, 255); SWFMatrix mat; mat.set_scale_rotation(1, 3, 0); Timer tdrawline("drawline"); renderer->drawLine(box, color, mat); tdrawline.stop(); // if (1) { // runtest.pass("drawLine()"); // } else { // runtest.fail("drawLine()"); // } runtest.unresolved(std::string("drawLine() ") + tdrawline.elapsed()); //drawVideoFrame(image::GnashImage* frame, const Transform& xform, const SWFRect* bounds, bool smooth); #if 0 image::GnashImage *frame; const Transform xform; const SWFRect bounds; bool smooth; Timer tdrawvideo("drawVideoFrame"); renderer->drawVideoFrame(frame, xform, bounds, smooth); tdrawvideo.stop(); #endif runtest.untested("drawVideoFrame()"); point *corners = 0; size_t corner_count = 0; rgba fill(0, 0, 0, 255);; rgba outline(0, 0, 0, 255);; bool masked = true; Timer tdrawpoly("drawPoly"); renderer->draw_poly(corners, corner_count, fill, outline, mat, masked); tdrawpoly.stop(); runtest.unresolved(std::string("drawPoly() ") + tdrawpoly.elapsed()); // SWF::ShapeRecord shape; SWFMatrix mat2(0x10000, 0x0, 0x0, 0x10000, 0x0, 0x0); SWFCxForm cxform; //(0x100, 0x100, 0x100, 0x100, 0x0, 0x0, 0x0, 0x0); Transform xform(mat2, cxform); SWF::ShapeRecord shape; // _bounds = {0x80000000, 0x7fffffff, // 0x80000000, 0x80000000, // 0x80000000, 0x80000000}} Timer drawshape("drawShape"); renderer->drawShape(shape, xform); runtest.unresolved("drawShape()"); drawshape.stop(); // SWF::ShapeRecord rec; // rgba color; // SWFMatrix mat; // Timer drawGlyph("drawGlyph"); // renderer->drawGlyph(rec, color, mat); runtest.untested("drawGlyph()"); // drawglyph.stop(); #if 0 boost::shared_ptr<IOChannel> io; FileType ftype; Timer renderi("renderToImage"); renderer->renderToImage(io, ftype); renderi.stop(); #endif runtest.untested("renderToImage()"); CachedBitmap *bitmap = 0; image::GnashImage *frame2 = new image::ImageRGBA(10, 10); std::auto_ptr<image::GnashImage> im(frame2); Timer cbit("createCachedBitmap"); bitmap = renderer->createCachedBitmap(im); cbit.stop(); if (bitmap) { runtest.pass(std::string("createCachedBitmap() ") + cbit.elapsed()); } else { runtest.fail(std::string("createCachedBitmap() ") + cbit.elapsed()); } }