test_ewk2_favicon_database.cpp [plain text]
#include "config.h"
#include "UnitTestUtils/EWK2UnitTestBase.h"
#include "UnitTestUtils/EWK2UnitTestServer.h"
#include "WKEinaSharedString.h"
using namespace EWK2UnitTest;
extern EWK2UnitTestEnvironment* environment;
class EWK2FaviconDatabaseTest : public EWK2UnitTestBase {
public:
struct IconRequestData {
Evas_Object* view;
Evas_Object* icon;
};
static void serverCallback(SoupServer* httpServer, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer)
{
if (message->method != SOUP_METHOD_GET) {
soup_message_set_status(message, SOUP_STATUS_NOT_IMPLEMENTED);
return;
}
if (!strcmp(path, "/favicon.ico")) {
CString faviconPath = environment->pathForResource("blank.ico");
Eina_File* f = eina_file_open(faviconPath.data(), false);
if (!f) {
soup_message_set_status(message, SOUP_STATUS_NOT_FOUND);
soup_message_body_complete(message->response_body);
return;
}
size_t fileSize = eina_file_size_get(f);
void* contents = eina_file_map_all(f, EINA_FILE_POPULATE);
if (!contents) {
soup_message_set_status(message, SOUP_STATUS_NOT_FOUND);
soup_message_body_complete(message->response_body);
return;
}
soup_message_body_append(message->response_body, SOUP_MEMORY_COPY, contents, fileSize);
soup_message_set_status(message, SOUP_STATUS_OK);
soup_message_body_complete(message->response_body);
eina_file_map_free(f, contents);
eina_file_close(f);
return;
}
const char contents[] = "<html><body>favicon test</body></html>";
soup_message_set_status(message, SOUP_STATUS_OK);
soup_message_body_append(message->response_body, SOUP_MEMORY_COPY, contents, strlen(contents));
soup_message_body_complete(message->response_body);
}
static void requestFaviconData(Ewk_Favicon_Database *faviconDatabase, const char *url, void *userdata)
{
IconRequestData* data = static_cast<IconRequestData*>(userdata);
Evas* evas = evas_object_evas_get(data->view);
data->icon = ewk_favicon_database_icon_get(faviconDatabase, url, evas);
}
};
TEST_F(EWK2FaviconDatabaseTest, ewk_favicon_database_async_icon_get)
{
std::unique_ptr<EWK2UnitTestServer> httpServer = std::make_unique<EWK2UnitTestServer>();
httpServer->run(serverCallback);
Ewk_Context* context = ewk_view_context_get(webView());
ewk_context_favicon_database_directory_set(context, 0);
Ewk_Favicon_Database* database = ewk_context_favicon_database_get(context);
IconRequestData data = { webView(), 0 };
ewk_favicon_database_icon_change_callback_add(database, requestFaviconData, &data);
ASSERT_TRUE(loadUrlSync(httpServer->getURLForPath("/").data()));
while (!data.icon)
ecore_main_loop_iterate();
ASSERT_TRUE(data.icon);
int width, height;
evas_object_image_size_get(data.icon, &width, &height);
EXPECT_EQ(16, width);
EXPECT_EQ(16, height);
evas_object_unref(data.icon);
ewk_favicon_database_icon_change_callback_del(database, requestFaviconData);
}
TEST_F(EWK2FaviconDatabaseTest, DISABLED_ewk_favicon_database_clear)
{
std::unique_ptr<EWK2UnitTestServer> httpServer1 = std::make_unique<EWK2UnitTestServer>();
httpServer1->run(serverCallback);
Ewk_Context* context = ewk_view_context_get(webView());
ewk_context_favicon_database_directory_set(context, 0);
Ewk_Favicon_Database* database = ewk_context_favicon_database_get(context);
IconRequestData data1 = { webView(), 0 };
ewk_favicon_database_icon_change_callback_add(database, requestFaviconData, &data1);
ASSERT_TRUE(loadUrlSync(httpServer1->getURLForPath("/").data()));
while (!data1.icon)
ecore_main_loop_iterate();
ASSERT_TRUE(data1.icon);
evas_object_unref(data1.icon);
ewk_favicon_database_icon_change_callback_del(database, requestFaviconData);
std::unique_ptr<EWK2UnitTestServer> httpServer2 = std::make_unique<EWK2UnitTestServer>();
httpServer2->run(serverCallback);
IconRequestData data2 = { webView(), 0 };
ewk_favicon_database_icon_change_callback_add(database, requestFaviconData, &data2);
ASSERT_TRUE(loadUrlSync(httpServer2->getURLForPath("/").data()));
while (!data2.icon)
ecore_main_loop_iterate();
ASSERT_TRUE(data2.icon);
evas_object_unref(data2.icon);
ewk_favicon_database_icon_change_callback_del(database, requestFaviconData);
ewk_favicon_database_clear(database);
data1.icon = ewk_favicon_database_icon_get(database, httpServer1->getURLForPath("/").data(), evas_object_evas_get(webView()));
ASSERT_FALSE(data1.icon);
data2.icon = ewk_favicon_database_icon_get(database, httpServer2->getURLForPath("/").data(), evas_object_evas_get(webView()));
ASSERT_FALSE(data2.icon);
}