1e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick/*
2e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick * Copyright (C) 2013 The Android Open Source Project
3e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick *
4e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick * Licensed under the Apache License, Version 2.0 (the "License");
5e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick * you may not use this file except in compliance with the License.
6e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick * You may obtain a copy of the License at
7e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick *
8e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick *      http://www.apache.org/licenses/LICENSE-2.0
9e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick *
10e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick * Unless required by applicable law or agreed to in writing, software
11e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick * distributed under the License is distributed on an "AS IS" BASIS,
12e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick * See the License for the specific language governing permissions and
14e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick * limitations under the License.
15e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick */
16e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick
17e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrickpackage com.android.volley.toolbox;
18e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick
19e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrickimport com.android.volley.Cache;
20e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrickimport com.android.volley.toolbox.DiskBasedCache.CacheHeader;
21b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrickimport org.junit.Test;
22e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick
23e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrickimport java.io.ByteArrayInputStream;
24e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrickimport java.io.ByteArrayOutputStream;
25e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmannimport java.io.File;
26e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrickimport java.util.HashMap;
27b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrickimport java.util.Map;
28e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick
29b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrickimport static org.junit.Assert.*;
30b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick
31b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrickpublic class DiskBasedCacheTest {
32e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick
33e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick    // Simple end-to-end serialize/deserialize test.
34b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick    @Test public void cacheHeaderSerialization() throws Exception {
35e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        Cache.Entry e = new Cache.Entry();
36e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        e.data = new byte[8];
37e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        e.serverDate = 1234567L;
389324df1b8046548587ffec89ec755264f6fbb097Ralph Bergmann        e.lastModified = 13572468L;
39e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        e.ttl = 9876543L;
40e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        e.softTtl = 8765432L;
41e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        e.etag = "etag";
42e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        e.responseHeaders = new HashMap<String, String>();
43e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        e.responseHeaders.put("fruit", "banana");
44e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick
45e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        CacheHeader first = new CacheHeader("my-magical-key", e);
46e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        ByteArrayOutputStream baos = new ByteArrayOutputStream();
47e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        first.writeHeader(baos);
48e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
49e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        CacheHeader second = CacheHeader.readHeader(bais);
50e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick
51e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        assertEquals(first.key, second.key);
52e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        assertEquals(first.serverDate, second.serverDate);
539324df1b8046548587ffec89ec755264f6fbb097Ralph Bergmann        assertEquals(first.lastModified, second.lastModified);
54e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        assertEquals(first.ttl, second.ttl);
55e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        assertEquals(first.softTtl, second.softTtl);
56e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        assertEquals(first.etag, second.etag);
57e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick        assertEquals(first.responseHeaders, second.responseHeaders);
58e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick    }
59e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick
60b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick    @Test public void serializeInt() throws Exception {
61b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        ByteArrayOutputStream baos = new ByteArrayOutputStream();
62b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeInt(baos, 0);
63b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeInt(baos, 19791214);
64b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeInt(baos, -20050711);
65b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeInt(baos, Integer.MIN_VALUE);
66b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeInt(baos, Integer.MAX_VALUE);
67b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
68b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readInt(bais), 0);
69b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readInt(bais), 19791214);
70b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readInt(bais), -20050711);
71b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readInt(bais), Integer.MIN_VALUE);
72b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readInt(bais), Integer.MAX_VALUE);
73b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick    }
74b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick
75b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick    @Test public void serializeLong() throws Exception {
76b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        ByteArrayOutputStream baos = new ByteArrayOutputStream();
77b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeLong(baos, 0);
78b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeLong(baos, 31337);
79b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeLong(baos, -4160);
80b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeLong(baos, 4295032832L);
81b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeLong(baos, -4314824046L);
82b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeLong(baos, Long.MIN_VALUE);
83b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeLong(baos, Long.MAX_VALUE);
84b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
85b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readLong(bais), 0);
86b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readLong(bais), 31337);
87b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readLong(bais), -4160);
88b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readLong(bais), 4295032832L);
89b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readLong(bais), -4314824046L);
90b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readLong(bais), Long.MIN_VALUE);
91b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readLong(bais), Long.MAX_VALUE);
92b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick    }
93b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick
94b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick    @Test public void serializeString() throws Exception {
95b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        ByteArrayOutputStream baos = new ByteArrayOutputStream();
96b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeString(baos, "");
97b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeString(baos, "This is a string.");
98b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeString(baos, "ファイカス");
99b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
100b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readString(bais), "");
101b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readString(bais), "This is a string.");
102b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readString(bais), "ファイカス");
103b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick    }
104b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick
105b9b8dc3d98fb1a8c3f02c2c2fcc18cbd344c05cbFicus Kirkpatrick    @Test public void serializeMap() throws Exception {
106b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        ByteArrayOutputStream baos = new ByteArrayOutputStream();
107b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        Map<String, String> empty = new HashMap<String, String>();
108b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeStringStringMap(empty, baos);
109b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeStringStringMap(null, baos);
110b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        Map<String, String> twoThings = new HashMap<String, String>();
111b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        twoThings.put("first", "thing");
112b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        twoThings.put("second", "item");
113b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeStringStringMap(twoThings, baos);
114b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        Map<String, String> emptyKey = new HashMap<String, String>();
115b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        emptyKey.put("", "value");
116b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeStringStringMap(emptyKey, baos);
117b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        Map<String, String> emptyValue = new HashMap<String, String>();
118b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        emptyValue.put("key", "");
119b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        DiskBasedCache.writeStringStringMap(emptyValue, baos);
120b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
121b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readStringStringMap(bais), empty);
122b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readStringStringMap(bais), empty); // null reads back empty
123b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readStringStringMap(bais), twoThings);
124b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readStringStringMap(bais), emptyKey);
125b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick        assertEquals(DiskBasedCache.readStringStringMap(bais), emptyValue);
126b33d0d6651b0b31e965839211d410136db2dcb5bFicus Kirkpatrick    }
1279324df1b8046548587ffec89ec755264f6fbb097Ralph Bergmann
128e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann    @Test
129e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann    public void publicMethods() throws Exception {
130e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann        // Catch-all test to find API-breaking changes.
131e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann        assertNotNull(DiskBasedCache.class.getConstructor(File.class, int.class));
132e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann        assertNotNull(DiskBasedCache.class.getConstructor(File.class));
133e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann
134e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann        assertNotNull(DiskBasedCache.class.getMethod("getFileForKey", String.class));
135e1f0d61968d5194088c18f00b1bcfc46a91adbfdRalph Bergmann    }
136e5a344749f100325cd8ef0d78cd7db5221b5e628Ficus Kirkpatrick}
137