1/*
2 * Copyright (C) 2012 Samsung Electronics
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27
28#include "UnitTestUtils/EWK2UnitTestBase.h"
29
30using namespace EWK2UnitTest;
31
32struct OriginData {
33    Eina_List* originList;
34    Ewk_Storage_Manager* manager;
35    bool didReceiveOriginsCallback;
36    bool isSynchronized;
37    unsigned timeToCheck;
38
39    OriginData()
40        : originList(0)
41        , manager(0)
42        , didReceiveOriginsCallback(false)
43        , isSynchronized(false)
44        , timeToCheck(10)
45    { }
46};
47
48static void getStorageOriginsCallback(Eina_List* origins, Ewk_Error* error, void* userData)
49{
50    ASSERT_FALSE(error);
51
52    OriginData* originData = static_cast<OriginData*>(userData);
53    originData->didReceiveOriginsCallback = true;
54
55    Eina_List* l;
56    void* data;
57    EINA_LIST_FOREACH(origins, l, data) {
58        originData->originList = eina_list_append(originData->originList, data);
59        Ewk_Security_Origin* origin = static_cast<Ewk_Security_Origin*>(data);
60        if (!strcmp(ewk_security_origin_protocol_get(origin), "http")
61            && !strcmp(ewk_security_origin_host_get(origin), "www.storagetest.com")
62            && !ewk_security_origin_port_get(origin)) {
63                originData->isSynchronized = true;
64                ecore_main_loop_quit();
65        }
66    }
67}
68
69static bool timerCallback(void* userData)
70{
71    OriginData* originData = static_cast<OriginData*>(userData);
72
73    if (originData->isSynchronized || !--(originData->timeToCheck)) {
74        ecore_main_loop_quit();
75        return ECORE_CALLBACK_CANCEL;
76    }
77
78    if (originData->didReceiveOriginsCallback) {
79        originData->didReceiveOriginsCallback = false;
80        ewk_storage_manager_origins_get(originData->manager, getStorageOriginsCallback, originData);
81    }
82
83    return ECORE_CALLBACK_RENEW;
84}
85
86static bool checkOrigin(Eina_List* origins, Ewk_Security_Origin** origin)
87{
88    Eina_List* l;
89    void* data;
90    EINA_LIST_FOREACH(origins, l, data) {
91        *origin = static_cast<Ewk_Security_Origin*>(data);
92        if (!strcmp(ewk_security_origin_protocol_get(*origin), "http")
93            && !strcmp(ewk_security_origin_host_get(*origin), "www.storagetest.com")
94            && !ewk_security_origin_port_get(*origin))
95            return true;
96    }
97
98    return false;
99}
100
101TEST_F(EWK2UnitTestBase, ewk_storage_manager_origins_get)
102{
103    Evas_Object* view = webView();
104    const char* storageHTML =
105        "<html><head><title>original title</title></head>"
106        "<body>"
107        "<script type='text/javascript'>"
108        " localStorage.setItem('item', 'storage');"
109        "</script>"
110        "</body></html>";
111
112    ewk_view_html_string_load(view, storageHTML, "http://www.storagetest.com", 0);
113
114    OriginData originData;
115    originData.manager = ewk_context_storage_manager_get(ewk_view_context_get(view));
116    ASSERT_TRUE(ewk_storage_manager_origins_get(originData.manager, getStorageOriginsCallback, &originData));
117    Ecore_Timer* storage_timer = ecore_timer_add(1, reinterpret_cast<Ecore_Task_Cb>(timerCallback), &originData);
118
119    ecore_main_loop_begin();
120    if (storage_timer)
121        ecore_timer_del(storage_timer);
122
123    ASSERT_TRUE(originData.isSynchronized);
124    ASSERT_LE(1, eina_list_count(originData.originList));
125
126    Ewk_Security_Origin* origin = 0;
127    EXPECT_TRUE(checkOrigin(originData.originList, &origin));
128
129    EXPECT_EQ(origin, ewk_object_ref(origin));
130    ewk_object_unref(origin);
131}
132