DiskBasedCacheTest.java revision e1f0d61968d5194088c18f00b1bcfc46a91adbfd
1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.volley.toolbox;
18
19import com.android.volley.Cache;
20import com.android.volley.toolbox.DiskBasedCache.CacheHeader;
21import org.junit.Test;
22
23import java.io.ByteArrayInputStream;
24import java.io.ByteArrayOutputStream;
25import java.io.File;
26import java.util.HashMap;
27import java.util.Map;
28
29import static org.junit.Assert.*;
30
31public class DiskBasedCacheTest {
32
33    // Simple end-to-end serialize/deserialize test.
34    @Test public void cacheHeaderSerialization() throws Exception {
35        Cache.Entry e = new Cache.Entry();
36        e.data = new byte[8];
37        e.serverDate = 1234567L;
38        e.lastModified = 13572468L;
39        e.ttl = 9876543L;
40        e.softTtl = 8765432L;
41        e.etag = "etag";
42        e.responseHeaders = new HashMap<String, String>();
43        e.responseHeaders.put("fruit", "banana");
44
45        CacheHeader first = new CacheHeader("my-magical-key", e);
46        ByteArrayOutputStream baos = new ByteArrayOutputStream();
47        first.writeHeader(baos);
48        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
49        CacheHeader second = CacheHeader.readHeader(bais);
50
51        assertEquals(first.key, second.key);
52        assertEquals(first.serverDate, second.serverDate);
53        assertEquals(first.lastModified, second.lastModified);
54        assertEquals(first.ttl, second.ttl);
55        assertEquals(first.softTtl, second.softTtl);
56        assertEquals(first.etag, second.etag);
57        assertEquals(first.responseHeaders, second.responseHeaders);
58    }
59
60    @Test public void serializeInt() throws Exception {
61        ByteArrayOutputStream baos = new ByteArrayOutputStream();
62        DiskBasedCache.writeInt(baos, 0);
63        DiskBasedCache.writeInt(baos, 19791214);
64        DiskBasedCache.writeInt(baos, -20050711);
65        DiskBasedCache.writeInt(baos, Integer.MIN_VALUE);
66        DiskBasedCache.writeInt(baos, Integer.MAX_VALUE);
67        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
68        assertEquals(DiskBasedCache.readInt(bais), 0);
69        assertEquals(DiskBasedCache.readInt(bais), 19791214);
70        assertEquals(DiskBasedCache.readInt(bais), -20050711);
71        assertEquals(DiskBasedCache.readInt(bais), Integer.MIN_VALUE);
72        assertEquals(DiskBasedCache.readInt(bais), Integer.MAX_VALUE);
73    }
74
75    @Test public void serializeLong() throws Exception {
76        ByteArrayOutputStream baos = new ByteArrayOutputStream();
77        DiskBasedCache.writeLong(baos, 0);
78        DiskBasedCache.writeLong(baos, 31337);
79        DiskBasedCache.writeLong(baos, -4160);
80        DiskBasedCache.writeLong(baos, 4295032832L);
81        DiskBasedCache.writeLong(baos, -4314824046L);
82        DiskBasedCache.writeLong(baos, Long.MIN_VALUE);
83        DiskBasedCache.writeLong(baos, Long.MAX_VALUE);
84        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
85        assertEquals(DiskBasedCache.readLong(bais), 0);
86        assertEquals(DiskBasedCache.readLong(bais), 31337);
87        assertEquals(DiskBasedCache.readLong(bais), -4160);
88        assertEquals(DiskBasedCache.readLong(bais), 4295032832L);
89        assertEquals(DiskBasedCache.readLong(bais), -4314824046L);
90        assertEquals(DiskBasedCache.readLong(bais), Long.MIN_VALUE);
91        assertEquals(DiskBasedCache.readLong(bais), Long.MAX_VALUE);
92    }
93
94    @Test public void serializeString() throws Exception {
95        ByteArrayOutputStream baos = new ByteArrayOutputStream();
96        DiskBasedCache.writeString(baos, "");
97        DiskBasedCache.writeString(baos, "This is a string.");
98        DiskBasedCache.writeString(baos, "ファイカス");
99        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
100        assertEquals(DiskBasedCache.readString(bais), "");
101        assertEquals(DiskBasedCache.readString(bais), "This is a string.");
102        assertEquals(DiskBasedCache.readString(bais), "ファイカス");
103    }
104
105    @Test public void serializeMap() throws Exception {
106        ByteArrayOutputStream baos = new ByteArrayOutputStream();
107        Map<String, String> empty = new HashMap<String, String>();
108        DiskBasedCache.writeStringStringMap(empty, baos);
109        DiskBasedCache.writeStringStringMap(null, baos);
110        Map<String, String> twoThings = new HashMap<String, String>();
111        twoThings.put("first", "thing");
112        twoThings.put("second", "item");
113        DiskBasedCache.writeStringStringMap(twoThings, baos);
114        Map<String, String> emptyKey = new HashMap<String, String>();
115        emptyKey.put("", "value");
116        DiskBasedCache.writeStringStringMap(emptyKey, baos);
117        Map<String, String> emptyValue = new HashMap<String, String>();
118        emptyValue.put("key", "");
119        DiskBasedCache.writeStringStringMap(emptyValue, baos);
120        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
121        assertEquals(DiskBasedCache.readStringStringMap(bais), empty);
122        assertEquals(DiskBasedCache.readStringStringMap(bais), empty); // null reads back empty
123        assertEquals(DiskBasedCache.readStringStringMap(bais), twoThings);
124        assertEquals(DiskBasedCache.readStringStringMap(bais), emptyKey);
125        assertEquals(DiskBasedCache.readStringStringMap(bais), emptyValue);
126    }
127
128    /** deserializing the old format into the new one. */
129    @Test public void testCacheHeaderSerializationOldToNewFormat() throws Exception {
130
131        final int CACHE_MAGIC = 0x20140623;
132        final String key = "key";
133        final String etag = "etag";
134        final long serverDate = 1234567890l;
135        final long ttl = 1357924680l;
136        final long softTtl = 2468013579l;
137
138        Map<String, String> responseHeaders = new HashMap<String, String>();
139        responseHeaders.put("first", "thing");
140        responseHeaders.put("second", "item");
141
142        // write old sytle header (without lastModified)
143        ByteArrayOutputStream baos = new ByteArrayOutputStream();
144        DiskBasedCache.writeInt(baos, CACHE_MAGIC);
145        DiskBasedCache.writeString(baos, key);
146        DiskBasedCache.writeString(baos, etag == null ? "" : etag);
147        DiskBasedCache.writeLong(baos, serverDate);
148        DiskBasedCache.writeLong(baos, ttl);
149        DiskBasedCache.writeLong(baos, softTtl);
150        DiskBasedCache.writeStringStringMap(responseHeaders, baos);
151
152        // read / test new style header (with lastModified)
153        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
154        CacheHeader cacheHeader = CacheHeader.readHeader(bais);
155
156        assertEquals(cacheHeader.key, key);
157        assertEquals(cacheHeader.etag, etag);
158        assertEquals(cacheHeader.serverDate, serverDate);
159        assertEquals(cacheHeader.ttl, ttl);
160        assertEquals(cacheHeader.softTtl, softTtl);
161        assertEquals(cacheHeader.responseHeaders, responseHeaders);
162
163        // the old format doesn't know lastModified
164        assertEquals(cacheHeader.lastModified, 0);
165    }
166
167    @Test
168    public void publicMethods() throws Exception {
169        // Catch-all test to find API-breaking changes.
170        assertNotNull(DiskBasedCache.class.getConstructor(File.class, int.class));
171        assertNotNull(DiskBasedCache.class.getConstructor(File.class));
172
173        assertNotNull(DiskBasedCache.class.getMethod("getFileForKey", String.class));
174    }
175}
176