From 7806c39ecc92055cd338749148fda51b2dc01691 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Mon, 25 Apr 2016 12:39:27 +0300 Subject: Add base64_encode(), base64_decode() --- tests/base64/buildfile | 7 ++++ tests/base64/driver.cxx | 106 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/buildfile | 2 +- 3 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 tests/base64/buildfile create mode 100644 tests/base64/driver.cxx (limited to 'tests') diff --git a/tests/base64/buildfile b/tests/base64/buildfile new file mode 100644 index 0000000..63212fa --- /dev/null +++ b/tests/base64/buildfile @@ -0,0 +1,7 @@ +# file : tests/base64/buildfile +# copyright : Copyright (c) 2014-2016 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +exe{driver}: cxx{driver} ../../butl/lib{butl} + +include ../../butl/ diff --git a/tests/base64/driver.cxx b/tests/base64/driver.cxx new file mode 100644 index 0000000..e43e04a --- /dev/null +++ b/tests/base64/driver.cxx @@ -0,0 +1,106 @@ +// file : tests/base64/driver.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include +#include +#include + +#include + +using namespace std; +using namespace butl; + +static bool +encode (const string& i, const string& o) +{ + // Test encoding. + // + istringstream is (i); + string s (base64_encode (is)); + bool r (s == o && is.eof ()); + + if (r) + { + is.seekg (0); + ostringstream os; + base64_encode (os, is); + r = os.str () == o && is.eof (); + } + + if (r) + r = base64_encode (vector (i.begin (), i.end ())) == o; + + // Test decoding. + // + if (r) + { + istringstream is (o); + ostringstream os; + base64_decode (os, is); + r = os.str () == i; + } + + if (r) + { + ostringstream os; + base64_decode (os, o); + r = os.str () == i; + } + + if (r) + { + vector v (base64_decode (o)); + r = string (v.begin (), v.end ()) == i; + } + + return r; +} + +int +main () +{ + assert (encode ("", "")); + assert (encode ("B", "Qg==")); + assert (encode ("BX", "Qlg=")); + assert (encode ("BXz", "Qlh6")); + assert (encode ("BXzS", "Qlh6Uw==")); + assert (encode ("BXzS@", "Qlh6U0A=")); + assert (encode ("BXzS@#", "Qlh6U0Aj")); + assert (encode ("BXzS@#/", "Qlh6U0AjLw==")); + + const char* s (R"delim( +class fdstream_base +{ +protected: + fdstream_base () = default; + fdstream_base (int fd): buf_ (fd) {} + +protected: + fdbuf buf_; +}; + +class ifdstream: fdstream_base, public std::istream +{ +public: + ifdstream (): std::istream (&buf_) {} + ifdstream (int fd): fdstream_base (fd), std::istream (&buf_) {} + + void close () {buf_.close ();} + void open (int fd) {buf_.open (fd);} + bool is_open () const {return buf_.is_open ();} +}; +)delim"); + + const char* r (R"delim( +CmNsYXNzIGZkc3RyZWFtX2Jhc2UKewpwcm90ZWN0ZWQ6CiAgZmRzdHJlYW1fYmFzZSAoKSA9IGRl +ZmF1bHQ7CiAgZmRzdHJlYW1fYmFzZSAoaW50IGZkKTogYnVmXyAoZmQpIHt9Cgpwcm90ZWN0ZWQ6 +CiAgZmRidWYgYnVmXzsKfTsKCmNsYXNzIGlmZHN0cmVhbTogZmRzdHJlYW1fYmFzZSwgcHVibGlj +IHN0ZDo6aXN0cmVhbQp7CnB1YmxpYzoKICBpZmRzdHJlYW0gKCk6IHN0ZDo6aXN0cmVhbSAoJmJ1 +Zl8pIHt9CiAgaWZkc3RyZWFtIChpbnQgZmQpOiBmZHN0cmVhbV9iYXNlIChmZCksIHN0ZDo6aXN0 +cmVhbSAoJmJ1Zl8pIHt9CgogIHZvaWQgY2xvc2UgKCkge2J1Zl8uY2xvc2UgKCk7fQogIHZvaWQg +b3BlbiAoaW50IGZkKSB7YnVmXy5vcGVuIChmZCk7fQogIGJvb2wgaXNfb3BlbiAoKSBjb25zdCB7 +cmV0dXJuIGJ1Zl8uaXNfb3BlbiAoKTt9Cn07Cg==)delim"); + + assert (encode (s, r + 1)); +} diff --git a/tests/buildfile b/tests/buildfile index 45c78d6..59caba8 100644 --- a/tests/buildfile +++ b/tests/buildfile @@ -2,6 +2,6 @@ # copyright : Copyright (c) 2014-2016 Code Synthesis Ltd # license : MIT; see accompanying LICENSE file -d = dir-iterator/ path/ prefix-map/ sha256/ timestamp/ triplet/ +d = base64/ dir-iterator/ path/ prefix-map/ sha256/ timestamp/ triplet/ .: $d include $d -- cgit v1.1