// SPDX-License-Identifier: GPL-2.0-or-later /** @file * TODO: insert short description here *//* * Authors: see git history * * Copyright (C) 2015 Authors * Released under GNU GPL v2+, read the file 'COPYING' for more information. */ #include #include // realpath #include // mkdtemp, realpath #include // chdir #include // strlen, strncpy, strrchr #include "inkscapestream.h" #include "base64stream.h" #include "gzipstream.h" #include "stringstream.h" #include "uristream.h" #include "xsltstream.h" // quick way to pass the name of the executable into the test char myself[PATH_MAX]; // names and path storage for other tests char *xmlname = "crystalegg.xml"; char xmlpath[PATH_MAX]; char *xslname = "doc2html.xsl"; char xslpath[PATH_MAX]; bool testUriStream() { printf("######### UriStream copy ############\n"); Inkscape::URI inUri(myself); Inkscape::IO::UriInputStream ins(inUri); Inkscape::URI outUri("streamtest.copy"); Inkscape::IO::UriOutputStream outs(outUri); pipeStream(ins, outs); ins.close(); outs.close(); return true; } bool testWriter() { printf("######### OutputStreamWriter ############\n"); Inkscape::IO::StdOutputStream outs; Inkscape::IO::OutputStreamWriter writer(outs); writer << "Hello, world! " << 123.45 << " times\n"; writer.printf("There are %f quick brown foxes in %d states\n", 123.45, 88); return true; } bool testStdWriter() { printf("######### StdWriter ############\n"); Inkscape::IO::StdWriter writer; writer << "Hello, world! " << 123.45 << " times\n"; writer.printf("There are %f quick brown foxes in %d states\n", 123.45, 88); return true; } bool testBase64() { printf("######### Base64 Out ############\n"); Inkscape::URI plainInUri(xmlpath); Inkscape::IO::UriInputStream ins1(plainInUri); Inkscape::URI b64OutUri("crystalegg.xml.b64"); Inkscape::IO::UriOutputStream outs1(b64OutUri); Inkscape::IO::Base64OutputStream b64Outs(outs1); pipeStream(ins1, b64Outs); ins1.close(); b64Outs.close(); printf("######### Base64 In ############\n"); Inkscape::URI b64InUri("crystalegg.xml.b64"); Inkscape::IO::UriInputStream ins2(b64InUri); Inkscape::IO::Base64InputStream b64Ins(ins2); Inkscape::URI plainOutUri("crystalegg.xml.b64dec"); Inkscape::IO::UriOutputStream outs2(plainOutUri); pipeStream(b64Ins, outs2); outs2.close(); b64Ins.close(); return true; } bool testXslt() { printf("######### XSLT Sheet ############\n"); Inkscape::URI xsltSheetUri(xslpath); Inkscape::IO::UriInputStream xsltSheetIns(xsltSheetUri); Inkscape::IO::XsltStyleSheet stylesheet(xsltSheetIns); xsltSheetIns.close(); Inkscape::URI sourceUri(xmlpath); Inkscape::IO::UriInputStream xmlIns(sourceUri); printf("######### XSLT Input ############\n"); Inkscape::URI destUri("test.html"); Inkscape::IO::UriOutputStream xmlOuts(destUri); Inkscape::IO::XsltInputStream xsltIns(xmlIns, stylesheet); pipeStream(xsltIns, xmlOuts); xsltIns.close(); xmlOuts.close(); printf("######### XSLT Output ############\n"); Inkscape::IO::UriInputStream xmlIns2(sourceUri); Inkscape::URI destUri2("test2.html"); Inkscape::IO::UriOutputStream xmlOuts2(destUri2); Inkscape::IO::XsltOutputStream xsltOuts(xmlOuts2, stylesheet); pipeStream(xmlIns2, xsltOuts); xmlIns2.close(); xsltOuts.close(); return true; } bool testGzip() { printf("######### Gzip Output ############\n"); Inkscape::URI gzUri("test.gz"); Inkscape::URI sourceUri(xmlpath); Inkscape::IO::UriInputStream sourceIns(sourceUri); Inkscape::IO::UriOutputStream gzOuts(gzUri); Inkscape::IO::GzipOutputStream gzipOuts(gzOuts); pipeStream(sourceIns, gzipOuts); sourceIns.close(); gzipOuts.close(); printf("######### Gzip Input ############\n"); Inkscape::IO::UriInputStream gzIns(gzUri); Inkscape::URI destUri("crystalegg2.xml"); Inkscape::IO::UriOutputStream destOuts(destUri); Inkscape::IO::GzipInputStream gzipIns(gzIns); pipeStream(gzipIns, destOuts); gzipIns.close(); destOuts.close(); return true; } bool doTest() { if (!testUriStream()) { return false; } if (!testWriter()) { return false; } if (!testStdWriter()) { return false; } if (!testBase64()) { return false; } if (!testXslt()) { return false; } if (!testGzip()) { return false; } return true; } void path_init(char *path, char *name) { if (strlen(name)>PATH_MAX-strlen(myself)) { printf("merging paths would be too long\n"); exit(1); } strncpy(path,myself,PATH_MAX); char * ptr = strrchr(path,'/'); if (!ptr) { printf("path '%s' is missing any slashes\n",path); exit(1); } strncpy(ptr+1,name,strlen(name)+1); path[PATH_MAX-1] = '\0'; printf("'%s'\n",path); } int main(int argc, char **argv) { if (!realpath(argv[0],myself)) { perror("realpath"); return 1; } path_init(xmlpath,xmlname); path_init(xslpath,xslname); // create temp files somewhere else instead of current dir // TODO: clean them up too char * testpath = strdup("/tmp/streamtest-XXXXXX"); char * testpath2; testpath2 = mkdtemp(testpath); free(testpath); if (!testpath2) { perror("mkdtemp"); return 1; } if (chdir(testpath2)) { perror("chdir"); return 1; } if (!doTest()) { printf("#### Test failed\n"); return 1; } else { printf("##### Test succeeded\n"); } return 0; }