1# This Source Code Form is subject to the terms of the Mozilla Public
2# License, v. 2.0. If a copy of the MPL was not distributed with this
3# file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5import calendar
6import random
7import time
8
9from marionette_driver.errors import UnsupportedOperationException
10from marionette_harness import MarionetteTestCase
11
12
13class CookieTest(MarionetteTestCase):
14
15    def setUp(self):
16        MarionetteTestCase.setUp(self)
17        test_url = self.marionette.absolute_url('test.html')
18        self.marionette.navigate(test_url)
19        self.COOKIE_A = {"name": "foo",
20                         "value": "bar",
21                         "path": "/",
22                         "secure": False}
23
24    def tearDown(self):
25        self.marionette.delete_all_cookies()
26        MarionetteTestCase.tearDown(self)
27
28    def test_add_cookie(self):
29        self.marionette.add_cookie(self.COOKIE_A)
30        cookie_returned = str(self.marionette.execute_script("return document.cookie"))
31        self.assertTrue(self.COOKIE_A["name"] in cookie_returned)
32
33    def test_adding_a_cookie_that_expired_in_the_past(self):
34        cookie = self.COOKIE_A.copy()
35        cookie["expiry"] = calendar.timegm(time.gmtime()) - 1
36        self.marionette.add_cookie(cookie)
37        cookies = self.marionette.get_cookies()
38        self.assertEquals(0, len(cookies))
39
40    def test_chrome_error(self):
41        with self.marionette.using_context("chrome"):
42            self.assertRaises(UnsupportedOperationException,
43                              self.marionette.add_cookie, self.COOKIE_A)
44            self.assertRaises(UnsupportedOperationException,
45                              self.marionette.delete_cookie, self.COOKIE_A)
46            self.assertRaises(UnsupportedOperationException,
47                              self.marionette.delete_all_cookies)
48            self.assertRaises(UnsupportedOperationException,
49                              self.marionette.get_cookies)
50
51    def test_delete_all_cookie(self):
52        self.marionette.add_cookie(self.COOKIE_A)
53        cookie_returned = str(self.marionette.execute_script("return document.cookie"))
54        print cookie_returned
55        self.assertTrue(self.COOKIE_A["name"] in cookie_returned)
56        self.marionette.delete_all_cookies()
57        self.assertFalse(self.marionette.get_cookies())
58
59    def test_delete_cookie(self):
60        self.marionette.add_cookie(self.COOKIE_A)
61        cookie_returned = str(self.marionette.execute_script("return document.cookie"))
62        self.assertTrue(self.COOKIE_A["name"] in cookie_returned)
63        self.marionette.delete_cookie("foo")
64        cookie_returned = str(self.marionette.execute_script("return document.cookie"))
65        self.assertFalse(self.COOKIE_A["name"] in cookie_returned)
66
67    def test_should_get_cookie_by_name(self):
68        key = "key_{}".format(int(random.random()*10000000))
69        self.marionette.execute_script("document.cookie = arguments[0] + '=set';", [key])
70
71        cookie = self.marionette.get_cookie(key)
72        self.assertEquals("set", cookie["value"])
73
74    def test_get_all_cookies(self):
75        key1 = "key_{}".format(int(random.random()*10000000))
76        key2 = "key_{}".format(int(random.random()*10000000))
77
78        cookies = self.marionette.get_cookies()
79        count = len(cookies)
80
81        one = {"name" :key1,
82               "value": "value"}
83        two = {"name":key2,
84               "value": "value"}
85
86        self.marionette.add_cookie(one)
87        self.marionette.add_cookie(two)
88
89        test_url = self.marionette.absolute_url('test.html')
90        self.marionette.navigate(test_url)
91        cookies = self.marionette.get_cookies()
92        self.assertEquals(count + 2, len(cookies))
93
94    def test_should_not_delete_cookies_with_a_similar_name(self):
95        cookieOneName = "fish"
96        cookie1 = {"name" :cookieOneName,
97                    "value":"cod"}
98        cookie2 = {"name" :cookieOneName + "x",
99                    "value": "earth"}
100        self.marionette.add_cookie(cookie1)
101        self.marionette.add_cookie(cookie2)
102
103        self.marionette.delete_cookie(cookieOneName)
104        cookies = self.marionette.get_cookies()
105
106        self.assertFalse(cookie1["name"] == cookies[0]["name"], msg=str(cookies))
107        self.assertEquals(cookie2["name"] , cookies[0]["name"], msg=str(cookies))
108
109    def test_we_get_required_elements_when_available(self):
110        self.marionette.add_cookie(self.COOKIE_A)
111        cookies = self.marionette.get_cookies()
112
113        self.assertIn("name", cookies[0], 'name not available')
114        self.assertIn("value", cookies[0], 'value not available')
115        self.assertIn("httpOnly", cookies[0], 'httpOnly not available')
116