19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage android.sax;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.AndroidTestCase;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.LargeTest;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Xml;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.kxml2.io.KXmlParser;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xml.sax.SAXException;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xml.sax.helpers.DefaultHandler;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayInputStream;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayOutputStream;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
341a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport com.android.frameworks.saxtests.R;
351a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ExpatPerformanceTest extends AndroidTestCase {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = ExpatPerformanceTest.class.getSimpleName();
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private byte[] mXmlBytes;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setUp() throws Exception {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.setUp();
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InputStream in = mContext.getResources().openRawResource(R.raw.youtube);
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ByteArrayOutputStream out = new ByteArrayOutputStream();
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] buffer = new byte[1024];
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int length;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((length = in.read(buffer)) != -1) {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.write(buffer, 0, length);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mXmlBytes = out.toByteArray();
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.i("***", "File size: " + (mXmlBytes.length / 1024) + "k");
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @LargeTest
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testPerformance() throws Exception {
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        try {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//            Debug.startMethodTracing("expat3");
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        for (int i = 0; i < 1; i++) {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runJavaPullParser();
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runSax();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runExpatPullParser();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//    } finally {
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//            Debug.stopMethodTracing();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//        }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private InputStream newInputStream() {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new ByteArrayInputStream(mXmlBytes);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void runSax() throws IOException, SAXException {
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long start = System.currentTimeMillis();
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Xml.parse(newInputStream(), Xml.Encoding.UTF_8, new DefaultHandler());
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long elapsed = System.currentTimeMillis() - start;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.i(TAG, "expat SAX: " + elapsed + "ms");
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void runExpatPullParser() throws XmlPullParserException, IOException {
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long start = System.currentTimeMillis();
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlPullParser pullParser = Xml.newPullParser();
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pullParser.setInput(newInputStream(), "UTF-8");
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        withPullParser(pullParser);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long elapsed = System.currentTimeMillis() - start;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.i(TAG, "expat pull: " + elapsed + "ms");
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void runJavaPullParser() throws XmlPullParserException, IOException {
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XmlPullParser pullParser;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long start = System.currentTimeMillis();
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pullParser = new KXmlParser();
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pullParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pullParser.setInput(newInputStream(), "UTF-8");
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        withPullParser(pullParser);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long elapsed = System.currentTimeMillis() - start;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.i(TAG, "java pull parser: " + elapsed + "ms");
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void withPullParser(XmlPullParser pullParser)
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws IOException, XmlPullParserException {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int eventType = pullParser.next();
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (eventType != XmlPullParser.END_DOCUMENT) {
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (eventType) {
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case XmlPullParser.START_TAG:
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pullParser.getName();
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                        int nattrs = pullParser.getAttributeCount();
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                        for (int i = 0; i < nattrs; ++i) {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                            pullParser.getAttributeName(i);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                            pullParser.getAttributeValue(i);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//                        }
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case XmlPullParser.END_TAG:
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pullParser.getName();
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case XmlPullParser.TEXT:
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pullParser.getText();
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            eventType = pullParser.next();
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
126