1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage tests.support.resource;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.File;
213827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughesimport java.io.FileInputStream;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileNotFoundException;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileOutputStream;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
2691922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstromimport java.io.OutputStream;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.MalformedURLException;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URL;
2991922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstromimport tests.support.Support_Configuration;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Support_Resources {
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final String RESOURCE_PACKAGE = "/tests/resources/";
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final String RESOURCE_PACKAGE_NAME = "tests.resources";
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static InputStream getStream(String name) {
383827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes        // If we have the resources packaged up in our jar file, get them that way.
3917baca0a1628322f512b2a91486d8f454b722ac2Jesse Wilson        String path = RESOURCE_PACKAGE + name;
4017baca0a1628322f512b2a91486d8f454b722ac2Jesse Wilson        InputStream result = Support_Resources.class.getResourceAsStream(path);
413827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes        if (result != null) {
423827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes            return result;
4317baca0a1628322f512b2a91486d8f454b722ac2Jesse Wilson        }
443827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes        // Otherwise, if we're in an Android build tree, get the files directly.
453827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes        String ANDROID_BUILD_TOP = System.getenv("ANDROID_BUILD_TOP");
463827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes        if (ANDROID_BUILD_TOP != null) {
473827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes            File resource = new File(ANDROID_BUILD_TOP + "/libcore/support/src/test/java" + path);
483827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes            if (resource.exists()) {
493827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes                try {
503827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes                    return new FileInputStream(resource);
513827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes                } catch (IOException ex) {
523827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes                    throw new IllegalArgumentException("Couldn't open: " + resource, ex);
533827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes                }
543827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes            }
553827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes        }
563827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes        throw new IllegalArgumentException("No such resource: " + path);
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String getURL(String name) {
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String folder = null;
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String fileName = name;
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        File resources = createTempFolder();
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int index = name.lastIndexOf("/");
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (index != -1) {
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            folder = name.substring(0, index);
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            name = name.substring(index + 1);
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        copyFile(resources, folder, name);
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        URL url = null;
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String resPath = resources.toString();
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (resPath.charAt(0) == '/' || resPath.charAt(0) == '\\') {
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            resPath = resPath.substring(1);
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            url = new URL("file:/" + resPath + "/" + fileName);
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (MalformedURLException e) {
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // TODO Auto-generated catch block
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            e.printStackTrace();
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return url.toString();
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static File createTempFolder() {
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        File folder = null;
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            folder = File.createTempFile("hyts_resources", "", null);
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            folder.delete();
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            folder.mkdirs();
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // TODO Auto-generated catch block
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            e.printStackTrace();
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        folder.deleteOnExit();
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return folder;
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static File copyFile(File root, String folder, String file) {
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        File f;
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (folder != null) {
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            f = new File(root.toString() + "/" + folder);
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!f.exists()) {
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                f.mkdirs();
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                f.deleteOnExit();
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            f = root;
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        File dest = new File(f.toString() + "/" + file);
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InputStream in = Support_Resources.getStream(folder == null ? file
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                : folder + "/" + file);
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            copyLocalFileto(dest, in);
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (FileNotFoundException e) {
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // TODO Auto-generated catch block
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            e.printStackTrace();
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // TODO Auto-generated catch block
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            e.printStackTrace();
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return dest;
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static File createTempFile(String suffix) throws IOException {
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return File.createTempFile("hyts_", suffix, null);
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
131086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public static void copyLocalFileto(File dest, InputStream in) throws IOException {
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!dest.exists()) {
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            FileOutputStream out = new FileOutputStream(dest);
13491922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom            copy(in, out);
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            out.close();
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            dest.deleteOnExit();
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
138086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson        in.close();
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
14191922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom    private static int copy(InputStream in, OutputStream out) throws IOException {
14291922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom        int total = 0;
14391922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom        byte[] buffer = new byte[8192];
14491922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom        int c;
14591922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom        while ((c = in.read(buffer)) != -1) {
14691922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom            total += c;
14791922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom            out.write(buffer, 0, c);
14891922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom        }
14991922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom        return total;
15091922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom    }
15191922d920e0020bde20ef5ae21b66cab847dd58bBrian Carlstrom
152086fd0244a54fa5ecf13ea66d49b22b36d7d456eJesse Wilson    public static File getExternalLocalFile(String url) throws IOException {
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        File resources = createTempFolder();
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InputStream in = new URL(url).openStream();
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        File temp = new File(resources.toString() + "/local.tmp");
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        copyLocalFileto(temp, in);
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return temp;
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String getResourceURL(String resource) {
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return "http://" + Support_Configuration.TestResources + resource;
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Util method to load resource files
166f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name - name of resource file
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return - resource input stream
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static InputStream getResourceStream(String name) {
171728d33e7431ed0a19c3fe2f3caad92a9343c7f81Urs Grob        InputStream is = Support_Resources.class.getResourceAsStream(name);
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (is == null) {
174728d33e7431ed0a19c3fe2f3caad92a9343c7f81Urs Grob            name = RESOURCE_PACKAGE + name;
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            is = Support_Resources.class.getResourceAsStream(name);
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (is == null) {
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new RuntimeException("Failed to load resource: " + name);
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
180f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return is;
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1841ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson    public static File resourceToTempFile(String path) throws IOException {
1851ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson        File f = File.createTempFile("out", ".xml");
1861ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson        f.deleteOnExit();
1871ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson        FileOutputStream out = new FileOutputStream(f);
1881ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson
1891ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson        InputStream xml = Support_Resources.class.getResourceAsStream(path);
1901ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson        int b;
1911ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson        while ((b = xml.read()) != -1) {
1921ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson            out.write(b);
1931ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson        }
1941ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson        out.flush();
1951ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson        out.close();
1961ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson        xml.close();
1971ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson        return f;
1981ec94feeb09591c30996c7c0834d6f131e204922Jesse Wilson    }
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
200