etk/test/testUriProvider.cpp

239 lines
7.6 KiB
C++

/**
* @author Edouard DUPIN
*
* @copyright 2011, Edouard DUPIN, all right reserved
*
* @license MPL v2.0 (see license file)
*/
#include <etest/etest.hpp>
#include <test-debug/debug.hpp>
#include <etk/uri/Uri.hpp>
#include <etk/uri/provider/provider.hpp>
#include <etk/uri/provider/ProviderFile.hpp>
#include <etk/uri/provider/ProviderFileZip.hpp>
#include <etk/fs/fileSystem.hpp>
TEST(TestUriProvider, defaultContructor) {
etk::uri::provider::clear();
EXPECT_EQ(etk::uri::provider::exist(""), true);
}
static int32_t s_plouf = 0;
namespace {
class ProviderTest1 : public etk::uri::provider::Interface {
public:
ememory::SharedPtr<etk::io::Interface> create(const etk::Uri& _uri) override {
s_plouf = 5555;
return null;
}
bool exist(const etk::Uri& _uri) override {
return false;
}
etk::Vector<etk::Uri> list(const etk::Uri& _uri) override {
etk::Vector<etk::Uri> out;
return out;
}
};
class ProviderTest2 : public etk::uri::provider::Interface {
public:
ememory::SharedPtr<etk::io::Interface> create(const etk::Uri& _uri) override {
s_plouf = 9999;
return null;
}
bool exist(const etk::Uri& _uri) override {
return false;
}
etk::Vector<etk::Uri> list(const etk::Uri& _uri) override {
etk::Vector<etk::Uri> out;
return out;
}
};
}
TEST(TestUriProvider, checkPlouf) {
etk::uri::provider::clear();
s_plouf = 0;
EXPECT_EQ(etk::uri::provider::exist(""), true);
EXPECT_EQ(etk::uri::provider::exist("RAW"), true);
EXPECT_EQ(etk::uri::provider::exist("PLOUF_1"), false);
EXPECT_EQ(etk::uri::provider::exist("PLOUF_2"), false);
etk::uri::provider::add("PLOUF_1", ememory::makeShared<::ProviderTest1>());
EXPECT_EQ(etk::uri::provider::exist(""), true);
EXPECT_EQ(etk::uri::provider::exist("PLOUF_1"), true);
EXPECT_EQ(etk::uri::provider::exist("PLOUF_2"), false);
etk::uri::provider::add("PLOUF_2", ememory::makeShared<::ProviderTest2>());
EXPECT_EQ(etk::uri::provider::exist(""), true);
EXPECT_EQ(etk::uri::provider::exist("PLOUF_1"), true);
EXPECT_EQ(etk::uri::provider::exist("PLOUF_2"), true);
EXPECT_EQ(s_plouf, 0);
etk::uri::provider::get("PLOUF_1:///qsdfqsdfqsdfqsdf.txt");
EXPECT_EQ(s_plouf, 5555);
etk::uri::provider::get("PLOUF_2:///qsdfqsdfqsdfqsdf.txt");
EXPECT_EQ(s_plouf, 9999);
etk::uri::provider::remove("PLOUF_1");
EXPECT_EQ(etk::uri::provider::exist(""), true);
EXPECT_EQ(etk::uri::provider::exist("PLOUF_1"), false);
EXPECT_EQ(etk::uri::provider::exist("PLOUF_2"), true);
etk::uri::provider::remove("PLOUF_2");
EXPECT_EQ(etk::uri::provider::exist(""), true);
EXPECT_EQ(etk::uri::provider::exist("PLOUF_1"), false);
EXPECT_EQ(etk::uri::provider::exist("PLOUF_2"), false);
}
etk::Vector<etk::Uri> listDirect = {
"DATA:///filePresent.txt",
"DATA:///fileEmpty.txt",
"DATA:///data",
"DATA:///data_sample.zip",
};
/* This function takes last element as pivot, places
the pivot element at its correct position in sorted
array, and places all smaller (smaller than pivot)
to left of pivot and all greater elements to right
of pivot */
int_t partition (etk::Vector<etk::Uri>& _data, int _low, int _high) {
int_t iii = (_low - 1); // Index of smaller element
for (int_t jjj = _low; jjj < _high; ++jjj) {
// If current element is smaller than or equal to pivot
if (_data[jjj] < _data[_high]) {
iii++; // increment index of smaller element
etk::swap(_data[iii], _data[jjj]);
}
}
etk::swap(_data[iii + 1], _data[_high]);
return (iii + 1);
}
/* The main function that implements QuickSort
arr[] --> Array to be sorted,
low --> Starting index,
high --> Ending index */
void quickSort(etk::Vector<etk::Uri>& _data, int _low, int _high) {
if (_low >= _high) {
return;
}
// pi is partitioning index, arr[p] is now at right place
int_t pi = partition(_data, _low, _high);
// Separately sort elements before partition and after partition
quickSort(_data, _low, pi - 1);
quickSort(_data, pi + 1, _high);
}
TEST(TestUriProvider, checkDirectAccess) {
etk::uri::provider::clear();
TEST_VERBOSE("data path: " << etk::fs::getDataPath());
etk::uri::provider::add("DATA", ememory::makeShared<etk::uri::provider::ProviderFile>(etk::fs::getDataPath()));
EXPECT_EQ(etk::uri::provider::exist("DATA"), true);
ememory::SharedPtr<etk::uri::provider::Interface> provider = etk::uri::provider::getProvider("DATA");
EXPECT_NE(provider, null);
etk::Uri searchBase("DATA:///");
auto elems = provider->list(searchBase);
TEST_WARNING("List DATA path: (A)");
for (auto& it: elems) {
TEST_WARNING(" " << it);
}
elems.sort(0, elems.size(), [] (const etk::Uri& _left, const etk::Uri& _right) {
TEST_WARNING("compare " << _left << " " << (_left < _right?"<":">=") << " " << _right);
return _left < _right;
});
TEST_WARNING("List DATA path: (B)");
for (auto& it: elems) {
TEST_WARNING(" " << it);
}
quickSort(elems, 0, elems.size()-1);
TEST_WARNING("List DATA path: (C)");
for (auto& it: elems) {
TEST_WARNING(" " << it);
}
EXPECT_EQ(elems, listDirect);
}
etk::Vector<etk::Uri> listDirect2 = {
"DATA:///data/.file_hidden.txt",
"DATA:///data/dir_A",
"DATA:///data/dir_B",
"DATA:///data/file_1.txt",
"DATA:///data/file_2.txt",
"DATA:///data/file_3.txt"
};
TEST(TestUriProvider, checkDirectAccess2) {
etk::uri::provider::clear();
TEST_VERBOSE("data path: " << etk::fs::getDataPath());
etk::uri::provider::add("DATA", ememory::makeShared<etk::uri::provider::ProviderFile>(etk::fs::getDataPath()));
EXPECT_EQ(etk::uri::provider::exist("DATA"), true);
ememory::SharedPtr<etk::uri::provider::Interface> provider = etk::uri::provider::getProvider("DATA");
EXPECT_NE(provider, null);
etk::Uri searchBase("DATA:///data");
auto elems = provider->list(searchBase);
TEST_WARNING("List DATA path: (A)");
for (auto& it: elems) {
TEST_WARNING(" " << it);
}
elems.sort(0, elems.size(), [] (const etk::Uri& _left, const etk::Uri& _right) {
return _left < _right;
});
TEST_WARNING("List DATA path: (B)");
for (auto& it: elems) {
TEST_WARNING(" " << it);
}
EXPECT_EQ(elems, listDirect2);
}
etk::Vector<etk::Uri> listZip = {
"DATA:///.file_hidden.txt",
"DATA:///dir_A",
"DATA:///dir_B",
"DATA:///file_1.txt",
"DATA:///file_2.txt",
"DATA:///file_3.txt"
};
TEST(TestUriProvider, checkZipAccess) {
etk::uri::provider::clear();
TEST_VERBOSE("data path: " << etk::fs::getDataPath());
etk::uri::provider::add("DATA", ememory::makeShared<etk::uri::provider::ProviderFileZip>(etk::fs::getDataPath() / "data_sample.zip", "data"));
EXPECT_EQ(etk::uri::provider::exist("DATA"), true);
ememory::SharedPtr<etk::uri::provider::Interface> provider = etk::uri::provider::getProvider("DATA");
EXPECT_NE(provider, null);
TEST_WARNING("List DATA path:");
etk::Uri searchBase("DATA://");
auto elems = provider->list(searchBase);
for (auto& it: elems) {
TEST_WARNING(" " << it);
}
EXPECT_EQ(elems, listZip);
}
etk::Vector<etk::Uri> listZip2 = {
"DATA:///dir_B/dir_C",
"DATA:///dir_B/file_B_1.txt",
"DATA:///dir_B/file_B_2.txt",
};
TEST(TestUriProvider, checkZipAccess2) {
etk::uri::provider::clear();
TEST_VERBOSE("data path: " << etk::fs::getDataPath());
etk::uri::provider::add("DATA", ememory::makeShared<etk::uri::provider::ProviderFileZip>(etk::fs::getDataPath() / "data_sample.zip", "data"));
EXPECT_EQ(etk::uri::provider::exist("DATA"), true);
ememory::SharedPtr<etk::uri::provider::Interface> provider = etk::uri::provider::getProvider("DATA");
EXPECT_NE(provider, null);
TEST_WARNING("List DATA path:");
etk::Uri searchBase("DATA:///dir_B");
auto elems = provider->list(searchBase);
for (auto& it: elems) {
TEST_WARNING(" " << it);
}
EXPECT_EQ(elems, listZip2);
}