25ae47fd5b4f2fd645778ca753629245cfd72ddf
[WebKit.git] / Tools / TestWebKitAPI / Tests / WebKit2Cocoa / WKHTTPCookieStorage.mm
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
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 #import "PlatformUtilities.h"
29 #import <WebKit/WKFoundation.h>
30 #import <WebKit/WKHTTPCookieStorage.h>
31 #import <WebKit/WKWebsiteDataStorePrivate.h>
32 #import <wtf/RetainPtr.h>
33
34 #if WK_API_ENABLED
35
36 static bool gotFlag;
37
38 TEST(WebKit2, WKHTTPCookieStorage)
39 {
40     auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
41     [webView loadHTMLString:@"Oh hello" baseURL:[NSURL URLWithString:@"http://webkit.org"]];
42
43     RetainPtr<WKHTTPCookieStorage> cookieStorage = [WKWebsiteDataStore defaultDataStore]._httpCookieStorage;
44
45     NSArray<NSHTTPCookie *> *cookies = nil;
46     [cookieStorage fetchCookies:[cookiesPtr = &cookies](NSArray<NSHTTPCookie *> *nsCookies) {
47         *cookiesPtr = [nsCookies retain];
48         gotFlag = true;
49     }];
50
51     TestWebKitAPI::Util::run(&gotFlag);
52
53     ASSERT_EQ(cookies.count, 0u);
54     [cookies release];
55
56     gotFlag = false;
57
58     RetainPtr<NSHTTPCookie> cookie1 = [NSHTTPCookie cookieWithProperties:@{
59         NSHTTPCookiePath: @"/",
60         NSHTTPCookieName: @"CookieName",
61         NSHTTPCookieValue: @"CookieValue",
62         NSHTTPCookieDomain: @".www.webkit.org",
63         NSHTTPCookieSecure: @"TRUE",
64         NSHTTPCookieDiscard: @"TRUE",
65         NSHTTPCookieMaximumAge: @"10000",
66     }];
67
68     RetainPtr<NSHTTPCookie> cookie2 = [NSHTTPCookie cookieWithProperties:@{
69         NSHTTPCookiePath: @"/path",
70         NSHTTPCookieName: @"OtherCookieName",
71         NSHTTPCookieValue: @"OtherCookieValue",
72         NSHTTPCookieDomain: @".www.w3c.org",
73         NSHTTPCookieMaximumAge: @"10000",
74     }];
75
76     [cookieStorage setCookie:cookie1.get() completionHandler:[](){
77         gotFlag = true;
78     }];
79
80     TestWebKitAPI::Util::run(&gotFlag);
81     gotFlag = false;
82
83     [cookieStorage setCookie:cookie2.get() completionHandler:[](){
84         gotFlag = true;
85     }];
86
87     TestWebKitAPI::Util::run(&gotFlag);
88     gotFlag = false;
89
90     [cookieStorage fetchCookies:[cookiesPtr = &cookies](NSArray<NSHTTPCookie *> *nsCookies) {
91         *cookiesPtr = [nsCookies retain];
92         gotFlag = true;
93     }];
94
95     TestWebKitAPI::Util::run(&gotFlag);
96
97     ASSERT_EQ(cookies.count, 2u);
98
99     for (NSHTTPCookie *cookie : cookies) {
100         if ([cookie.name isEqual:@"CookieName"]) {
101             ASSERT_TRUE([cookie1.get().path isEqualToString:cookie.path]);
102             ASSERT_TRUE([cookie1.get().value isEqualToString:cookie.value]);
103             ASSERT_TRUE([cookie1.get().domain isEqualToString:cookie.domain]);
104             ASSERT_TRUE(cookie1.get().secure);
105             ASSERT_TRUE(cookie1.get().sessionOnly);
106         } else {
107             ASSERT_TRUE([cookie2.get().path isEqualToString:cookie.path]);
108             ASSERT_TRUE([cookie2.get().value isEqualToString:cookie.value]);
109             ASSERT_TRUE([cookie2.get().name isEqualToString:cookie.name]);
110             ASSERT_TRUE([cookie2.get().domain isEqualToString:cookie.domain]);
111             ASSERT_FALSE(cookie2.get().secure);
112             ASSERT_FALSE(cookie2.get().sessionOnly);
113         }
114     }
115
116     [cookies release];
117 }
118
119 #endif