Main.java revision 7403503d9ba33463e850b7e87a1b0430372d7003
1d063d912e5580222b1822b152de315420cef49eeJeff Hao/*
2d063d912e5580222b1822b152de315420cef49eeJeff Hao * Copyright (C) 2014 The Android Open Source Project
3d063d912e5580222b1822b152de315420cef49eeJeff Hao *
4d063d912e5580222b1822b152de315420cef49eeJeff Hao * Licensed under the Apache License, Version 2.0 (the "License");
5d063d912e5580222b1822b152de315420cef49eeJeff Hao * you may not use this file except in compliance with the License.
6d063d912e5580222b1822b152de315420cef49eeJeff Hao * You may obtain a copy of the License at
7d063d912e5580222b1822b152de315420cef49eeJeff Hao *
8d063d912e5580222b1822b152de315420cef49eeJeff Hao *      http://www.apache.org/licenses/LICENSE-2.0
9d063d912e5580222b1822b152de315420cef49eeJeff Hao *
10d063d912e5580222b1822b152de315420cef49eeJeff Hao * Unless required by applicable law or agreed to in writing, software
11d063d912e5580222b1822b152de315420cef49eeJeff Hao * distributed under the License is distributed on an "AS IS" BASIS,
12d063d912e5580222b1822b152de315420cef49eeJeff Hao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d063d912e5580222b1822b152de315420cef49eeJeff Hao * See the License for the specific language governing permissions and
14d063d912e5580222b1822b152de315420cef49eeJeff Hao * limitations under the License.
15d063d912e5580222b1822b152de315420cef49eeJeff Hao */
16d063d912e5580222b1822b152de315420cef49eeJeff Hao
17d063d912e5580222b1822b152de315420cef49eeJeff Haoimport java.io.File;
18d063d912e5580222b1822b152de315420cef49eeJeff Haoimport java.io.IOException;
19d063d912e5580222b1822b152de315420cef49eeJeff Haoimport java.lang.reflect.Method;
20d063d912e5580222b1822b152de315420cef49eeJeff Hao
21d063d912e5580222b1822b152de315420cef49eeJeff Haopublic class Main {
22d063d912e5580222b1822b152de315420cef49eeJeff Hao    public static void main(String[] args) throws Exception {
23d063d912e5580222b1822b152de315420cef49eeJeff Hao        String name = System.getProperty("java.vm.name");
24d063d912e5580222b1822b152de315420cef49eeJeff Hao        if (!"Dalvik".equals(name)) {
25d063d912e5580222b1822b152de315420cef49eeJeff Hao            System.out.println("This test is not supported on " + name);
26d063d912e5580222b1822b152de315420cef49eeJeff Hao            return;
27d063d912e5580222b1822b152de315420cef49eeJeff Hao        }
28d063d912e5580222b1822b152de315420cef49eeJeff Hao        testMethodTracing();
29d063d912e5580222b1822b152de315420cef49eeJeff Hao    }
30d063d912e5580222b1822b152de315420cef49eeJeff Hao
317403503d9ba33463e850b7e87a1b0430372d7003Andreas Gampe    private static File createTempFile() throws Exception {
328cf89c4ac6e09f17093ef0f8c35e86dcd2807d98Jeff Hao        try {
337403503d9ba33463e850b7e87a1b0430372d7003Andreas Gampe            return  File.createTempFile("test", ".trace");
348cf89c4ac6e09f17093ef0f8c35e86dcd2807d98Jeff Hao        } catch (IOException e) {
357403503d9ba33463e850b7e87a1b0430372d7003Andreas Gampe            System.setProperty("java.io.tmpdir", "/data/local/tmp");
367403503d9ba33463e850b7e87a1b0430372d7003Andreas Gampe            try {
377403503d9ba33463e850b7e87a1b0430372d7003Andreas Gampe                return File.createTempFile("test", ".trace");
387403503d9ba33463e850b7e87a1b0430372d7003Andreas Gampe            } catch (IOException e2) {
397403503d9ba33463e850b7e87a1b0430372d7003Andreas Gampe                System.setProperty("java.io.tmpdir", "/sdcard");
407403503d9ba33463e850b7e87a1b0430372d7003Andreas Gampe                return File.createTempFile("test", ".trace");
417403503d9ba33463e850b7e87a1b0430372d7003Andreas Gampe            }
42d063d912e5580222b1822b152de315420cef49eeJeff Hao        }
437403503d9ba33463e850b7e87a1b0430372d7003Andreas Gampe    }
447403503d9ba33463e850b7e87a1b0430372d7003Andreas Gampe
457403503d9ba33463e850b7e87a1b0430372d7003Andreas Gampe    private static void testMethodTracing() throws Exception {
467403503d9ba33463e850b7e87a1b0430372d7003Andreas Gampe        File tempFile = createTempFile();
478cf89c4ac6e09f17093ef0f8c35e86dcd2807d98Jeff Hao        tempFile.deleteOnExit();
488cf89c4ac6e09f17093ef0f8c35e86dcd2807d98Jeff Hao        String tempFileName = tempFile.getPath();
49d063d912e5580222b1822b152de315420cef49eeJeff Hao
50cbe15be6f108da7f56c7cb481d2cbed9c568d35aJeff Hao        if (VMDebug.getMethodTracingMode() != 0) {
51cbe15be6f108da7f56c7cb481d2cbed9c568d35aJeff Hao            VMDebug.stopMethodTracing();
52cbe15be6f108da7f56c7cb481d2cbed9c568d35aJeff Hao        }
53cbe15be6f108da7f56c7cb481d2cbed9c568d35aJeff Hao
54d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("Confirm enable/disable");
55d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("status=" + VMDebug.getMethodTracingMode());
56d063d912e5580222b1822b152de315420cef49eeJeff Hao        VMDebug.startMethodTracing(tempFileName, 0, 0, false, 0);
57d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("status=" + VMDebug.getMethodTracingMode());
58d063d912e5580222b1822b152de315420cef49eeJeff Hao        VMDebug.stopMethodTracing();
59d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("status=" + VMDebug.getMethodTracingMode());
60d063d912e5580222b1822b152de315420cef49eeJeff Hao        if (tempFile.length() == 0) {
61d063d912e5580222b1822b152de315420cef49eeJeff Hao            System.out.println("ERROR: tracing output file is empty");
62d063d912e5580222b1822b152de315420cef49eeJeff Hao        }
63d063d912e5580222b1822b152de315420cef49eeJeff Hao
64d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("Confirm sampling");
65d063d912e5580222b1822b152de315420cef49eeJeff Hao        VMDebug.startMethodTracing(tempFileName, 0, 0, true, 1000);
66d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("status=" + VMDebug.getMethodTracingMode());
67d063d912e5580222b1822b152de315420cef49eeJeff Hao        VMDebug.stopMethodTracing();
68d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("status=" + VMDebug.getMethodTracingMode());
69d063d912e5580222b1822b152de315420cef49eeJeff Hao        if (tempFile.length() == 0) {
70d063d912e5580222b1822b152de315420cef49eeJeff Hao            System.out.println("ERROR: sample tracing output file is empty");
71d063d912e5580222b1822b152de315420cef49eeJeff Hao        }
72d063d912e5580222b1822b152de315420cef49eeJeff Hao
73d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("Test starting when already started");
74d063d912e5580222b1822b152de315420cef49eeJeff Hao        VMDebug.startMethodTracing(tempFileName, 0, 0, false, 0);
75d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("status=" + VMDebug.getMethodTracingMode());
76d063d912e5580222b1822b152de315420cef49eeJeff Hao        VMDebug.startMethodTracing(tempFileName, 0, 0, false, 0);
77d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("status=" + VMDebug.getMethodTracingMode());
78d063d912e5580222b1822b152de315420cef49eeJeff Hao
79d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("Test stopping when already stopped");
80d063d912e5580222b1822b152de315420cef49eeJeff Hao        VMDebug.stopMethodTracing();
81d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("status=" + VMDebug.getMethodTracingMode());
82d063d912e5580222b1822b152de315420cef49eeJeff Hao        VMDebug.stopMethodTracing();
83d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("status=" + VMDebug.getMethodTracingMode());
84d063d912e5580222b1822b152de315420cef49eeJeff Hao
85d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("Test tracing with empty filename");
86d063d912e5580222b1822b152de315420cef49eeJeff Hao        try {
87d063d912e5580222b1822b152de315420cef49eeJeff Hao            VMDebug.startMethodTracing("", 0, 0, false, 0);
88d063d912e5580222b1822b152de315420cef49eeJeff Hao            System.out.println("Should have thrown an exception");
89d063d912e5580222b1822b152de315420cef49eeJeff Hao        } catch (Exception e) {
90d063d912e5580222b1822b152de315420cef49eeJeff Hao            System.out.println("Got expected exception");
91d063d912e5580222b1822b152de315420cef49eeJeff Hao        }
92d063d912e5580222b1822b152de315420cef49eeJeff Hao
93d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("Test tracing with bogus (< 1024 && != 0) filesize");
94d063d912e5580222b1822b152de315420cef49eeJeff Hao        try {
95d063d912e5580222b1822b152de315420cef49eeJeff Hao            VMDebug.startMethodTracing(tempFileName, 1000, 0, false, 0);
96d063d912e5580222b1822b152de315420cef49eeJeff Hao            System.out.println("Should have thrown an exception");
97d063d912e5580222b1822b152de315420cef49eeJeff Hao        } catch (Exception e) {
98d063d912e5580222b1822b152de315420cef49eeJeff Hao            System.out.println("Got expected exception");
99d063d912e5580222b1822b152de315420cef49eeJeff Hao        }
100d063d912e5580222b1822b152de315420cef49eeJeff Hao
101d063d912e5580222b1822b152de315420cef49eeJeff Hao        System.out.println("Test sampling with bogus (<= 0) interval");
102d063d912e5580222b1822b152de315420cef49eeJeff Hao        try {
103d063d912e5580222b1822b152de315420cef49eeJeff Hao            VMDebug.startMethodTracing(tempFileName, 0, 0, true, 0);
104d063d912e5580222b1822b152de315420cef49eeJeff Hao            System.out.println("Should have thrown an exception");
105d063d912e5580222b1822b152de315420cef49eeJeff Hao        } catch (Exception e) {
106d063d912e5580222b1822b152de315420cef49eeJeff Hao            System.out.println("Got expected exception");
107d063d912e5580222b1822b152de315420cef49eeJeff Hao        }
108d063d912e5580222b1822b152de315420cef49eeJeff Hao
109d063d912e5580222b1822b152de315420cef49eeJeff Hao        tempFile.delete();
110d063d912e5580222b1822b152de315420cef49eeJeff Hao    }
111d063d912e5580222b1822b152de315420cef49eeJeff Hao
112d063d912e5580222b1822b152de315420cef49eeJeff Hao    private static class VMDebug {
113d063d912e5580222b1822b152de315420cef49eeJeff Hao        private static final Method startMethodTracingMethod;
114d063d912e5580222b1822b152de315420cef49eeJeff Hao        private static final Method stopMethodTracingMethod;
115d063d912e5580222b1822b152de315420cef49eeJeff Hao        private static final Method getMethodTracingModeMethod;
116d063d912e5580222b1822b152de315420cef49eeJeff Hao        static {
117d063d912e5580222b1822b152de315420cef49eeJeff Hao            try {
118d063d912e5580222b1822b152de315420cef49eeJeff Hao                Class c = Class.forName("dalvik.system.VMDebug");
119d063d912e5580222b1822b152de315420cef49eeJeff Hao                startMethodTracingMethod = c.getDeclaredMethod("startMethodTracing", String.class,
120d063d912e5580222b1822b152de315420cef49eeJeff Hao                        Integer.TYPE, Integer.TYPE, Boolean.TYPE, Integer.TYPE);
121d063d912e5580222b1822b152de315420cef49eeJeff Hao                stopMethodTracingMethod = c.getDeclaredMethod("stopMethodTracing");
122d063d912e5580222b1822b152de315420cef49eeJeff Hao                getMethodTracingModeMethod = c.getDeclaredMethod("getMethodTracingMode");
123d063d912e5580222b1822b152de315420cef49eeJeff Hao            } catch (Exception e) {
124d063d912e5580222b1822b152de315420cef49eeJeff Hao                throw new RuntimeException(e);
125d063d912e5580222b1822b152de315420cef49eeJeff Hao            }
126d063d912e5580222b1822b152de315420cef49eeJeff Hao        }
127d063d912e5580222b1822b152de315420cef49eeJeff Hao
128d063d912e5580222b1822b152de315420cef49eeJeff Hao        public static void startMethodTracing(String filename, int bufferSize, int flags,
129d063d912e5580222b1822b152de315420cef49eeJeff Hao                boolean samplingEnabled, int intervalUs) throws Exception {
130d063d912e5580222b1822b152de315420cef49eeJeff Hao            startMethodTracingMethod.invoke(null, filename, bufferSize, flags, samplingEnabled,
131d063d912e5580222b1822b152de315420cef49eeJeff Hao                    intervalUs);
132d063d912e5580222b1822b152de315420cef49eeJeff Hao        }
133d063d912e5580222b1822b152de315420cef49eeJeff Hao        public static void stopMethodTracing() throws Exception {
134d063d912e5580222b1822b152de315420cef49eeJeff Hao            stopMethodTracingMethod.invoke(null);
135d063d912e5580222b1822b152de315420cef49eeJeff Hao        }
136d063d912e5580222b1822b152de315420cef49eeJeff Hao        public static int getMethodTracingMode() throws Exception {
137d063d912e5580222b1822b152de315420cef49eeJeff Hao            return (int) getMethodTracingModeMethod.invoke(null);
138d063d912e5580222b1822b152de315420cef49eeJeff Hao        }
139d063d912e5580222b1822b152de315420cef49eeJeff Hao    }
140d063d912e5580222b1822b152de315420cef49eeJeff Hao}
141