1d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru/*
2d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Copyright (C) 2011 The Android Open Source Project
3d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru *
4d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Licensed under the Apache License, Version 2.0 (the "License");
5d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * you may not use this file except in compliance with the License.
6d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * You may obtain a copy of the License at
7d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru *
8d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru *      http://www.apache.org/licenses/LICENSE-2.0
9d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru *
10d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software
11d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * distributed under the License is distributed on an "AS IS" BASIS,
12d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * See the License for the specific language governing permissions and
14d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * limitations under the License.
15d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */
16d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
17d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Querupackage com.android.volley.toolbox;
18d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
19d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport android.content.res.Resources;
20d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport android.graphics.Bitmap;
21d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport android.graphics.Bitmap.Config;
22d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport android.test.InstrumentationTestCase;
23d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport android.test.suitebuilder.annotation.SmallTest;
24d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
25d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.NetworkResponse;
26d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.Response;
27d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport com.android.volley.tests.R;
28d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
29d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport java.io.ByteArrayOutputStream;
30d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport java.io.IOException;
31d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queruimport java.io.InputStream;
32d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
33d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru@SmallTest
34d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Querupublic class ImageRequestTest extends InstrumentationTestCase {
35d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
36d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public void testParseNetworkResponse_resizing() throws Exception {
37d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        byte[] jpegBytes = readRawResource(
38d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru                getInstrumentation().getContext().getResources(), R.raw.large_jpeg_1024_500);
39d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        NetworkResponse jpeg = new NetworkResponse(jpegBytes);
40d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
41d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // Exact sizes
42d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        verifyResize(jpeg, 512, 250, 512, 250); // exactly half
43d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        verifyResize(jpeg, 511, 249, 509, 249); // just under half
44d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        verifyResize(jpeg, 1080, 500, 1024, 500); // larger
45d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        verifyResize(jpeg, 500, 500, 500, 244); // keep same ratio
46d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
47d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // Specify only width, preserve aspect ratio
48d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        verifyResize(jpeg, 512, 0, 512, 250);
49d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        verifyResize(jpeg, 800, 0, 800, 390);
50d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        verifyResize(jpeg, 1024, 0, 1024, 500);
51d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
52d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // Specify only height, preserve aspect ratio
53d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        verifyResize(jpeg, 0, 250, 512, 250);
54d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        verifyResize(jpeg, 0, 391, 800, 391);
55d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        verifyResize(jpeg, 0, 500, 1024, 500);
56d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
57d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // No resize
58d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        verifyResize(jpeg, 0, 0, 1024, 500);
59d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
60d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
61d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    private void verifyResize(NetworkResponse networkResponse, int maxWidth, int maxHeight,
62d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru            int expectedWidth, int expectedHeight) {
63d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        ImageRequest request = new ImageRequest(
64d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru                "", null, maxWidth, maxHeight, Config.RGB_565, null);
65d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        Response<Bitmap> response = request.parseNetworkResponse(networkResponse);
66d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNotNull(response);
67d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertTrue(response.isSuccess());
68d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        Bitmap bitmap = response.result;
69d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertNotNull(bitmap);
70d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(expectedWidth, bitmap.getWidth());
71d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(expectedHeight, bitmap.getHeight());
72d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
73d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
74d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    public void testFindBestSampleSize() {
75d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // desired == actual == 1
76d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(1, ImageRequest.findBestSampleSize(100, 150, 100, 150));
77d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
78d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // exactly half == 2
79d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(2, ImageRequest.findBestSampleSize(280, 160, 140, 80));
80d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
81d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // just over half == 1
82d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(1, ImageRequest.findBestSampleSize(1000, 800, 501, 401));
83d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
84d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        // just under 1/4 == 4
85d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        assertEquals(4, ImageRequest.findBestSampleSize(100, 200, 24, 50));
86d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
87d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
88d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    private static byte[] readRawResource(Resources res, int resId) throws IOException {
89d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        InputStream in = res.openRawResource(resId);
90d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
91d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        byte[] buffer = new byte[1024];
92d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        int count;
93d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        while ((count = in.read(buffer)) != -1) {
94d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru            bytes.write(buffer, 0, count);
95d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        }
96d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        in.close();
97d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru        return bytes.toByteArray();
98d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru    }
99d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru
100d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru}
101