Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(888)

Unified Diff: chrome/android/junit/src/org/chromium/chrome/browser/cookies/CanonicalCookieTest.java

Issue 1894213003: android: Fix CanonicalCookie same_site field (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: visibility Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/junit/src/org/chromium/chrome/browser/cookies/CanonicalCookieTest.java
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/cookies/CanonicalCookieTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/cookies/CanonicalCookieTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..be56a08cadacbe439d224f710a77feaafffa29ff
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/cookies/CanonicalCookieTest.java
@@ -0,0 +1,254 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.cookies;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.BlockJUnit4ClassRunner;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.crypto.Cipher;
+import javax.crypto.CipherOutputStream;
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
+
+
+/**
+ * Unit test serialization code.
+ */
+@RunWith(BlockJUnit4ClassRunner.class)
+public class CanonicalCookieTest {
+ // Name meant to match CanonicalCookie method.
+ private static byte[] saveToStream(final List<CanonicalCookie> cookies)
Yaron 2016/04/28 03:43:10 reuse CanonicalCookies.writeToByteArray instead of
boliu 2016/04/28 17:49:26 Disagree. writeToByteArray also does encryption, w
+ throws Exception {
+ ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
+ DataOutputStream out = new DataOutputStream(outByteStream);
+ try {
+ CanonicalCookie cookiesArray[] = new CanonicalCookie[cookies.size()];
+ cookies.toArray(cookiesArray);
+ CanonicalCookie.saveToStream(out, cookiesArray);
+ } finally {
+ out.close();
+ outByteStream.close();
+ }
+ return outByteStream.toByteArray();
+ }
+
+ // Name meant to match CanonicalCookie method.
+ private static List<CanonicalCookie> createFromStream(final byte[] byteArray)
+ throws Exception {
+ ByteArrayInputStream inByteStream = new ByteArrayInputStream(byteArray);
+ DataInputStream in = new DataInputStream(inByteStream);
+ try {
+ return CanonicalCookie.readFromStream(in);
+ } finally {
+ in.close();
+ inByteStream.close();
+ }
+ }
+
+ private static void assertCookiesEqual(CanonicalCookie lhs, CanonicalCookie rhs) {
+ Assert.assertEquals(lhs.getUrl(), rhs.getUrl());
+ Assert.assertEquals(lhs.getName(), rhs.getName());
+ Assert.assertEquals(lhs.getValue(), rhs.getValue());
+ Assert.assertEquals(lhs.getDomain(), rhs.getDomain());
+ Assert.assertEquals(lhs.getPath(), rhs.getPath());
+ Assert.assertEquals(lhs.getCreationDate(), rhs.getCreationDate());
+ Assert.assertEquals(lhs.getExpirationDate(), rhs.getExpirationDate());
+ Assert.assertEquals(lhs.getLastAccessDate(), rhs.getLastAccessDate());
+ Assert.assertEquals(lhs.isSecure(), rhs.isSecure());
+ Assert.assertEquals(lhs.isHttpOnly(), rhs.isHttpOnly());
+ Assert.assertEquals(lhs.getSameSite(), rhs.getSameSite());
+ Assert.assertEquals(lhs.getPriority(), rhs.getPriority());
+ }
+
+ private static void doSaveRestoreCookiesListTest(final List<CanonicalCookie> cookies)
+ throws Exception {
+ byte[] byteArray = saveToStream(cookies);
+ List<CanonicalCookie> readCookies = createFromStream(byteArray);
+
+ Assert.assertEquals(cookies.size(), readCookies.size());
+ for (int i = 0; i < cookies.size(); ++i) {
+ assertCookiesEqual(cookies.get(i), readCookies.get(i));
+ }
+ }
+
+ @Test
+ public void testSaveRestoreEmptyList() throws Exception {
+ doSaveRestoreCookiesListTest(new ArrayList<CanonicalCookie>());
+ }
+
+ @Test
+ public void testSaveRestore() throws Exception {
+ ArrayList<CanonicalCookie> cookies = new ArrayList<>();
+ cookies.add(new CanonicalCookie("http://url", "name", "value", "domain", "path",
boliu 2016/04/28 00:00:43 you can blame weird formatting here on clang..
+ 0 /* creation */, 1 /* expiration */, 0 /* lastAccess */, false /* secure */,
+ true /* httpOnly */, 0 /* sameSite */, 0 /* priority */));
+ cookies.add(new CanonicalCookie("http://url2", "name2", "value2", "domain2", "path2",
+ 10 /* creation */, 20 /* expiration */, 15 /* lastAccess */, true /* secure */,
+ false /* httpOnly */, 1 /* sameSite */, 1 /* priority */));
+ cookies.add(new CanonicalCookie("http://url3", "name3", "value3", "domain3", "path3",
+ 10 /* creation */, 20 /* expiration */, 15 /* lastAccess */, true /* secure */,
+ false /* httpOnly */, 2 /* sameSite */, 2 /* priority */));
+
+ doSaveRestoreCookiesListTest(cookies);
+ }
+
+ private static byte[] saveToStreamLegacyFormat(final List<CanonicalCookie> cookies)
+ throws Exception {
+ ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
+ DataOutputStream out = new DataOutputStream(outByteStream);
+ try {
+ // Don't change logic here. This is legacy code maintained in test.
+ out.writeUTF(CanonicalCookie.LEGACY_FORMAT_MAGIC_STRING);
+ for (CanonicalCookie cookie : cookies) {
+ out.writeUTF(cookie.getUrl());
+ out.writeUTF(cookie.getName());
+ out.writeUTF(cookie.getValue());
+ out.writeUTF(cookie.getDomain());
+ out.writeUTF(cookie.getPath());
+ out.writeLong(cookie.getCreationDate());
+ out.writeLong(cookie.getExpirationDate());
+ out.writeLong(cookie.getLastAccessDate());
+ out.writeBoolean(cookie.isSecure());
+ out.writeBoolean(cookie.isHttpOnly());
+ out.writeBoolean(cookie.getSameSite() > 0);
+ out.writeInt(cookie.getPriority());
+ }
+ } finally {
+ out.close();
+ outByteStream.close();
+ }
+ return outByteStream.toByteArray();
+ }
+
+ // Name meant to match CanonicalCookie method.
+ private static List<CanonicalCookie> readFromLegacyStream(final byte[] byteArray)
+ throws Exception {
+ ByteArrayInputStream inByteStream = new ByteArrayInputStream(byteArray);
+ DataInputStream in = new DataInputStream(inByteStream);
+ try {
+ return CanonicalCookie.readFromLegacyStream(in);
+ } finally {
+ in.close();
+ inByteStream.close();
+ }
+ }
+
+ @Test
+ public void testReadFromLegacyStream() throws Exception {
+ ArrayList<CanonicalCookie> cookies = new ArrayList<>();
+ cookies.add(new CanonicalCookie("http://url", "name", "value", "domain", "path",
+ 0 /* creation */, 1 /* expiration */, 0 /* lastAccess */, false /* secure */,
+ true /* httpOnly */, 0 /* sameSite */, 0 /* priority */));
+ cookies.add(new CanonicalCookie("http://url2", "name2", "value2", "domain2", "path2",
+ 10 /* creation */, 20 /* expiration */, 15 /* lastAccess */, true /* secure */,
+ false /* httpOnly */, 1 /* sameSite */, 1 /* priority */));
+ // Doesn't support sameSite == 2.
+ byte[] byteArray = saveToStreamLegacyFormat(cookies);
+ List<CanonicalCookie> readCookies = readFromLegacyStream(byteArray);
+
+ Assert.assertEquals(cookies.size(), readCookies.size());
+ for (int i = 0; i < cookies.size(); ++i) {
+ assertCookiesEqual(cookies.get(i), readCookies.get(i));
+ }
+ }
+
+ @Test
+ public void testLegacySourceMergeSameSite() throws Exception {
+ ArrayList<CanonicalCookie> cookies = new ArrayList<>();
+ cookies.add(new CanonicalCookie("http://url", "name", "value", "domain", "path",
+ 0 /* creation */, 1 /* expiration */, 0 /* lastAccess */, false /* secure */,
+ true /* httpOnly */, 2 /* sameSite */, 0 /* priority */));
Yaron 2016/04/28 03:43:10 This seems a little strange. 2 couldn't exist in l
boliu 2016/04/28 17:49:26 Oh good point. true -> 1 case is covered above alr
+
+ byte[] byteArray = saveToStreamLegacyFormat(cookies);
+ List<CanonicalCookie> readCookies = readFromLegacyStream(byteArray);
+
+ Assert.assertEquals(cookies.size(), readCookies.size());
+ Assert.assertEquals(1, readCookies.get(0).getSameSite());
+ }
+
+ @Test
+ public void testReadWriteToFile() throws Exception {
+ ArrayList<CanonicalCookie> cookies = new ArrayList<>();
+ cookies.add(new CanonicalCookie("http://url", "name", "value", "domain", "path",
+ 0 /* creation */, 1 /* expiration */, 0 /* lastAccess */, false /* secure */,
+ true /* httpOnly */, 0 /* sameSite */, 0 /* priority */));
+ cookies.add(new CanonicalCookie("http://url2", "name2", "value2", "domain2", "path2",
+ 10 /* creation */, 20 /* expiration */, 15 /* lastAccess */, true /* secure */,
+ false /* httpOnly */, 1 /* sameSite */, 1 /* priority */));
+ CanonicalCookie cookiesArray[] = new CanonicalCookie[cookies.size()];
+ cookies.toArray(cookiesArray);
+
+ KeyGenerator keyGen = KeyGenerator.getInstance("AES");
+ keyGen.init(128);
+ final SecretKey key = keyGen.generateKey();
+ Cipher encryptCipher = Cipher.getInstance("AES");
+ encryptCipher.init(Cipher.ENCRYPT_MODE, key);
+
+ byte[] byteArray = CanonicalCookie.writeToByteArray(encryptCipher, cookiesArray);
+ File tempFile = File.createTempFile("cookies_junit_test", null);
+ tempFile.deleteOnExit();
+ FileOutputStream outStream = new FileOutputStream(tempFile);
+ outStream.write(byteArray);
+ outStream.close();
+
+ Cipher decryptCipher = Cipher.getInstance("AES");
+ decryptCipher.init(Cipher.DECRYPT_MODE, key);
+ List<CanonicalCookie> readCookies =
+ CanonicalCookie.readFromFileUnknownFormat(tempFile, decryptCipher);
+ Assert.assertEquals(cookies.size(), readCookies.size());
+ for (int i = 0; i < cookies.size(); ++i) {
+ assertCookiesEqual(cookies.get(i), readCookies.get(i));
+ }
+ }
+
+ @Test
+ public void testReadFromLegacyFormat() throws Exception {
+ ArrayList<CanonicalCookie> cookies = new ArrayList<>();
+ cookies.add(new CanonicalCookie("http://url", "name", "value", "domain", "path",
+ 0 /* creation */, 1 /* expiration */, 0 /* lastAccess */, false /* secure */,
+ true /* httpOnly */, 0 /* sameSite */, 0 /* priority */));
+ cookies.add(new CanonicalCookie("http://url2", "name2", "value2", "domain2", "path2",
+ 10 /* creation */, 20 /* expiration */, 15 /* lastAccess */, true /* secure */,
+ false /* httpOnly */, 1 /* sameSite */, 1 /* priority */));
+ cookies.add(new CanonicalCookie("http://url2", "name2", "value2", "domain2", "path2",
+ 10 /* creation */, 20 /* expiration */, 15 /* lastAccess */, true /* secure */,
+ false /* httpOnly */, 2 /* sameSite */, 1 /* priority */));
+
+ KeyGenerator keyGen = KeyGenerator.getInstance("AES");
+ keyGen.init(128);
+ final SecretKey key = keyGen.generateKey();
+ Cipher encryptCipher = Cipher.getInstance("AES");
+ encryptCipher.init(Cipher.ENCRYPT_MODE, key);
+
+ byte[] byteArray = saveToStreamLegacyFormat(cookies);
+ File tempFile = File.createTempFile("cookies_junit_test", null);
+ tempFile.deleteOnExit();
+ CipherOutputStream outStream =
+ new CipherOutputStream(new FileOutputStream(tempFile), encryptCipher);
+ outStream.write(byteArray);
+ outStream.close();
+
+ Cipher decryptCipher = Cipher.getInstance("AES");
+ decryptCipher.init(Cipher.DECRYPT_MODE, key);
+ List<CanonicalCookie> readCookies =
+ CanonicalCookie.readFromFileUnknownFormat(tempFile, decryptCipher);
+ Assert.assertEquals(cookies.size(), readCookies.size());
+ for (int i = 0; i < 2; ++i) {
+ assertCookiesEqual(cookies.get(i), readCookies.get(i));
+ }
+ Assert.assertEquals(1, readCookies.get(2).getSameSite());
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698