Add Case and Tester of Javascript
[0xbench:0xbench.git] / src / org / zeroxlab / benchmark / Benchmark.java
1 /*
2  * Copyright (C) 2010-2011 0xlab - http://0xlab.org/
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  * Authored by Julian Chu <walkingice@0xlab.org> and
17  *             Joseph Chang (bizkit) <bizkit@0xlab.org>
18  */
19
20 package org.zeroxlab.benchmark;
21
22 import android.util.Log;
23
24 import android.app.Activity;
25 import android.app.ActivityManager;
26 import android.app.ProgressDialog;
27 import android.app.TabActivity;
28 import android.content.Context;
29 import android.content.Intent;
30 import android.content.res.Configuration;
31 import android.os.Build;
32 import android.os.Bundle;
33 import android.os.Environment;
34 import android.os.Handler;
35 import android.os.Message;
36 import android.os.PowerManager;
37 import android.os.PowerManager.WakeLock;
38 import android.os.SystemClock;
39 import android.view.Gravity;
40 import android.view.KeyEvent;
41 import android.view.Menu;
42 import android.view.MenuItem;
43 import android.view.MotionEvent;
44 import android.view.View;
45 import android.view.ViewGroup;
46 import android.webkit.WebView;
47 import android.webkit.WebViewClient;
48 import android.widget.Button;
49 import android.widget.CheckBox;
50 import android.widget.ImageView;
51 import android.widget.LinearLayout;
52 import android.widget.ScrollView;
53 import android.widget.TabHost;
54 import android.widget.TabHost.TabContentFactory;
55 import android.widget.TextView;
56
57 import java.io.BufferedReader;
58 import java.io.File;
59 import java.io.FileOutputStream;
60 import java.io.FileReader;
61 import java.io.IOException;
62 import java.lang.StringBuffer;
63 import java.text.SimpleDateFormat;
64 import java.util.Arrays;
65 import java.util.Date;
66 import java.util.HashSet;
67 import java.util.HashMap;
68 import java.util.LinkedList;
69 import java.util.regex.Pattern;
70 import java.util.regex.Matcher;
71 import java.util.UUID;
72
73 import org.json.JSONObject;
74 import org.json.JSONArray;
75 import org.json.JSONException;
76 import org.opensolaris.hub.libmicro.NativeCaseMicro;
77 import org.zeroxlab.byteunix.NativeCaseUbench;;
78 import org.zeroxlab.utils.BenchUtil;
79
80 /* Construct a basic UI */
81 public class Benchmark extends TabActivity implements View.OnClickListener {
82
83     public final static String TAG     = "Benchmark";
84     public final static String PACKAGE = "org.zeroxlab.benchmark";
85
86     private final static String mOutputFile = "0xBenchmark";
87
88     private final static int GROUP_DEFAULT = 0;
89     private final static int SETTINGS_ID = Menu.FIRST;
90
91     private static String mXMLResult;
92     private static String mJSONResult;
93     private final static String mOutputXMLFile = "0xBenchmark.xml";
94     private final static String mOutputJSONFile = "0xBenchmark.bundle";
95
96     private Button   mRun;
97     private Button   mShow;
98     private CheckBox mCheckList[];
99     private TextView mDesc[];
100     private TextView mBannerInfo;
101
102     private ScrollView   mScrollView;
103     private LinearLayout mLinearLayout;
104     private LinearLayout mMainView;
105     private TabHost mTabHost;
106
107     LinkedList<Case> mCases;
108     boolean mTouchable = true;
109     private int orientation = Configuration.ORIENTATION_UNDEFINED;
110
111     private WakeLock mWakeLock;
112
113     private final String MAIN = "Main";
114     private final String D2 = "2D";
115     private final String D3 = "3D";
116     private final String MISC = "Misc";
117     private final String VM = "VM";
118     private final String NATIVE = "Native";
119
120     private CheckBox d2CheckBox;
121     private CheckBox d3CheckBox;
122     private CheckBox miscCheckBox;
123     private CheckBox vmCheckBox;
124     private CheckBox nativeCheckBox;
125
126     private HashMap< String, HashSet<Case> > mCategory = new HashMap< String, HashSet<Case> >();
127
128     private final String trackerUrl = "http://0xbenchmark.appspot.com/static/MobileTracker.html";
129
130     boolean mAutoRun = false;
131     boolean mCheckMisc = false;
132     boolean mCheck2D = false;
133     boolean mCheck3D = false;
134     boolean mCheckVM = false;
135     boolean mCheckNative = false;
136     boolean mAutoUpload = false;
137
138     @Override
139     protected void onDestroy() {
140         super.onPause();
141         mWakeLock.release();
142     }
143
144     @Override
145     protected void onCreate(Bundle savedInstanceState) {
146         super.onCreate(savedInstanceState);
147         orientation = getResources().getConfiguration().orientation;
148         PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
149         mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, TAG);
150         mWakeLock.acquire();
151
152         setContentView(R.layout.main);
153         mCases = new LinkedList<Case>();
154         Case arith  = new CaseArithmetic();
155         Case javascript = new CaseJavascript();
156         Case scimark2  = new CaseScimark2();
157         Case canvas = new CaseCanvas();
158         Case glcube = new CaseGLCube();
159         Case circle = new CaseDrawCircle();
160         Case nehe08 = new CaseNeheLesson08();
161         Case nehe16 = new CaseNeheLesson16();
162         Case teapot = new CaseTeapot();
163         Case gc     = new CaseGC();
164         Case libMicro = new NativeCaseMicro();
165         Case libUbench = new NativeCaseUbench();
166
167         Case dc2 = new CaseDrawCircle2();
168         Case dr = new CaseDrawRect();
169         Case da = new CaseDrawArc();
170         Case di = new CaseDrawImage();
171         Case dt = new CaseDrawText();
172
173         mCategory.put(D2, new HashSet<Case>());
174         mCategory.put(D3, new HashSet<Case>());
175         mCategory.put(MISC, new HashSet<Case>());
176         mCategory.put(VM, new HashSet<Case>());
177         mCategory.put(NATIVE, new HashSet<Case>());
178
179         // mflops
180         mCases.add(arith);
181         mCases.add(scimark2);
182         mCases.add(javascript);
183         mCategory.get(MISC).add(arith);
184         mCategory.get(MISC).add(scimark2);
185         mCategory.get(MISC).add(javascript);
186
187         // 2d
188         mCases.add(canvas);
189         mCases.add(circle);
190         mCases.add(dc2);
191         mCases.add(dr);
192         mCases.add(da);
193         mCases.add(di);
194         mCases.add(dt);
195
196         mCategory.get(D2).add(canvas);
197         mCategory.get(D2).add(circle);
198         mCategory.get(D2).add(dc2);
199         mCategory.get(D2).add(dr);
200         mCategory.get(D2).add(da);
201         mCategory.get(D2).add(di);
202         mCategory.get(D2).add(dt);
203
204         // 3d
205         mCases.add(glcube);
206         mCases.add(nehe08);
207         mCases.add(nehe16);
208         mCases.add(teapot);
209
210         mCategory.get(D3).add(glcube);
211         mCategory.get(D3).add(nehe08);
212         mCategory.get(D3).add(nehe16);
213         mCategory.get(D3).add(teapot);
214
215         // vm
216         mCases.add(gc);
217         mCategory.get(VM).add(gc);
218
219         // native
220         mCases.add(libMicro);
221         mCases.add(libUbench);
222
223         mCategory.get(NATIVE).add(libMicro);
224         mCategory.get(NATIVE).add(libUbench);
225
226         initViews();
227
228         Intent intent = getIntent();
229         Bundle bundle = intent.getExtras();
230         if (bundle != null) {
231             mAutoRun = bundle.getBoolean("autorun");
232             mCheckMisc = bundle.getBoolean("misc");
233             mCheck2D = bundle.getBoolean("2d");
234             mCheck3D = bundle.getBoolean("3d");
235             mCheckVM = bundle.getBoolean("vm");
236             mCheckNative = bundle.getBoolean("native");
237             mAutoUpload = bundle.getBoolean("autoupload");
238         }
239
240         if (mCheckMisc && !miscCheckBox.isChecked()) {
241             miscCheckBox.performClick();
242         }
243
244         if (mCheck2D && !d2CheckBox.isChecked()) {
245             d2CheckBox.performClick();
246         }
247
248         if (mCheck3D && !d3CheckBox.isChecked()) {
249             d3CheckBox.performClick();
250         }
251
252         if (mCheckVM && !vmCheckBox.isChecked()) {
253             vmCheckBox.performClick();
254         }
255
256         if (mCheckNative && !nativeCheckBox.isChecked()) {
257             nativeCheckBox.performClick();
258         }
259         /*
260         if (intent.getBooleanExtra("AUTO", false)) {
261             ImageView head = (ImageView)findViewById(R.id.banner_img);
262             head.setImageResource(R.drawable.icon_auto);
263             mTouchable = false;
264             initAuto();
265         }
266         */
267         if (mAutoRun) {
268             onClick(mRun);
269         }
270     }
271
272     @Override
273     public boolean onCreateOptionsMenu(Menu menu) {
274         super.onCreateOptionsMenu(menu);
275         MenuItem item1 = menu.add(GROUP_DEFAULT, SETTINGS_ID, Menu.NONE, R.string.menu_settings);
276         return true;
277     }
278
279     @Override
280     public boolean onOptionsItemSelected(MenuItem menu) {
281         if (menu.getGroupId() == GROUP_DEFAULT && menu.getItemId() == SETTINGS_ID) {
282             org.zeroxlab.utils.Util.launchActivity(this, "org.zeroxlab.benchmark.ActivitySettings");
283         }
284         return true;
285     }
286
287     @Override
288     public boolean dispatchTouchEvent(MotionEvent event) {
289         if (mTouchable) {
290             return super.dispatchTouchEvent(event);
291         } else {
292             return true;
293         }
294     }
295
296     @Override
297     public boolean dispatchKeyEvent(KeyEvent event) {
298         if (mTouchable) {
299             return super.dispatchKeyEvent(event);
300         } else {
301             return true;
302         }
303     }
304
305     @Override
306     public boolean dispatchTrackballEvent(MotionEvent event) {
307         if (mTouchable) {
308             return super.dispatchTrackballEvent(event);
309         } else {
310             return true;
311         }
312     }
313
314     private void _checkTagCase(String [] Tags) {
315         Arrays.sort(Tags);
316         for (int i = 0; i < mCheckList.length; i++) {
317             String [] caseTags = mCases.get(i).mTags;
318             for (String t: caseTags) {
319                 int search = Arrays.binarySearch(Tags, t);
320                 if (search >= 0)
321                     mCheckList[i].setChecked(true);
322             }
323         }
324     }
325
326     private void _checkCatCase(String [] Cats) {
327         Arrays.sort(Cats);
328         for (int i = 0; i < mCheckList.length; i++) {
329             int search = Arrays.binarySearch(Cats, mCases.get(i).mType);
330             if (search  >= 0)
331                 mCheckList[i].setChecked(true);
332         }
333     }
334
335     private void _checkAllCase(boolean check) {
336         for (int i = 0; i < mCheckList.length; i++)
337             mCheckList[i].setChecked(check);
338     }
339
340     private void initAuto() {
341         Intent intent = getIntent();
342         String TAG = intent.getStringExtra("TAG");
343         String CAT = intent.getStringExtra("CAT");
344
345
346         _checkAllCase(false);
347         if (TAG != null)
348             _checkTagCase( TAG.split(",") );
349         if (CAT != null)
350             _checkCatCase( CAT.split(",") );
351         if (TAG == null && CAT == null)
352             _checkAllCase(true);
353         final Handler h = new Handler() {
354             public void handleMessage(Message msg) {
355                 if (msg.what == 0x1234)
356                     onClick(mRun);
357             }
358     };
359     
360     final ProgressDialog dialog = new ProgressDialog(this).show(this, "Starting Benchmark", "Please wait...", true, false);
361     new Thread() {
362             public void run() {
363                 SystemClock.sleep(1000);
364                 dialog.dismiss();
365                 Message m = new Message();
366                 m.what = 0x1234;
367                 h.sendMessage(m);
368             }
369         }.start();
370         mTouchable = true;
371     }
372
373     private void initViews() {
374         /*
375         mRun = (Button)findViewById(R.id.btn_run);
376         mRun.setOnClickListener(this);
377
378         mShow = (Button)findViewById(R.id.btn_show);
379         mShow.setOnClickListener(this);
380         mShow.setClickable(false);
381
382         mLinearLayout = (LinearLayout)findViewById(R.id.list_container);
383         mMainView = (LinearLayout)findViewById(R.id.main_view);
384
385         mBannerInfo = (TextView)findViewById(R.id.banner_info);
386         mBannerInfo.setText("Hello!\nSelect cases to Run.\nUploaded results:\nhttp://0xbenchmark.appspot.com");
387         */
388
389         mTabHost = getTabHost();
390
391         int length = mCases.size();
392         mCheckList = new CheckBox[length];
393         mDesc      = new TextView[length];
394         for (int i = 0; i < length; i++) {
395             mCheckList[i] = new CheckBox(this);
396             mCheckList[i].setText(mCases.get(i).getTitle());
397             mDesc[i] = new TextView(this);
398             mDesc[i].setText(mCases.get(i).getDescription());
399             mDesc[i].setTextSize(mDesc[i].getTextSize() - 2);
400             mDesc[i].setPadding(42, 0, 10, 10);
401         }
402
403         TabContentFactory mTCF = new TabContentFactory() {
404             public View createTabContent(String tag) {
405                 ViewGroup.LayoutParams fillParent = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
406                 ViewGroup.LayoutParams fillWrap = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
407                 LinearLayout.LayoutParams wrapContent = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
408                 wrapContent.gravity = Gravity.CENTER;
409                 LinearLayout.LayoutParams weightedFillWrap = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
410                 weightedFillWrap.weight = 1;
411
412                 if (tag.equals(MAIN)) {
413                     LinearLayout mMainView = new LinearLayout(Benchmark.this);
414                     mMainView.setOrientation(1);
415                     ScrollView mListScroll = new ScrollView(Benchmark.this);
416
417                     LinearLayout mMainViewContainer = new LinearLayout(Benchmark.this);
418                     mMainViewContainer.setOrientation(1);
419                     ImageView mIconView = new ImageView(Benchmark.this);
420                     mIconView.setImageResource(R.drawable.icon);
421
422                     TextView mBannerInfo = new TextView(Benchmark.this);
423                     mBannerInfo.setText("0xbench\nSelect benchmarks in the tabs,\nor batch select:");
424
425                     d2CheckBox = new CheckBox(Benchmark.this);
426                     d2CheckBox.setText(D2);
427                     d2CheckBox.setOnClickListener(Benchmark.this);
428
429                     d3CheckBox = new CheckBox(Benchmark.this);
430                     d3CheckBox.setText(D3);
431                     d3CheckBox.setOnClickListener(Benchmark.this);
432
433                     miscCheckBox = new CheckBox(Benchmark.this);
434                     miscCheckBox.setText(MISC);
435                     miscCheckBox.setOnClickListener(Benchmark.this);
436
437                     vmCheckBox = new CheckBox(Benchmark.this);
438                     vmCheckBox.setText(VM);
439                     vmCheckBox.setOnClickListener(Benchmark.this);
440
441                     nativeCheckBox = new CheckBox(Benchmark.this);
442                     nativeCheckBox.setText(NATIVE);
443                     nativeCheckBox.setOnClickListener(Benchmark.this);
444
445                     TextView mWebInfo = new TextView(Benchmark.this);
446                     mWebInfo.setText("Uploaded results:\nhttp://0xbenchmark.appspot.com");
447
448                     LinearLayout mButtonContainer = new LinearLayout(Benchmark.this);
449                     mRun = new Button(Benchmark.this);
450                     mShow = new Button(Benchmark.this);
451                     mRun.setText("Run");
452                     mShow.setText("Show");
453                     mRun.setOnClickListener(Benchmark.this);
454                     mShow.setOnClickListener(Benchmark.this);
455                     mButtonContainer.addView(mRun, weightedFillWrap);
456                     mButtonContainer.addView(mShow, weightedFillWrap);
457                     WebView mTracker = new WebView(Benchmark.this);
458                     mTracker.clearCache(true);
459                     mTracker.setWebViewClient(new WebViewClient () {
460                         public void onPageFinished(WebView view, String url) {
461                             Log.i(TAG, "Tracker: " + view.getTitle() + " -> " + url);
462                         }
463                         public void onReceivedError(WebView view, int errorCode,
464                                                     String description, String failingUrl) {
465                             Log.e(TAG, "Track err: " + description);
466                         }
467                     });
468                     mTracker.loadUrl(trackerUrl);
469                     mMainViewContainer.addView(mIconView,wrapContent);
470                     mMainViewContainer.addView(mBannerInfo);
471                     mMainViewContainer.addView(miscCheckBox);
472                     mMainViewContainer.addView(d2CheckBox);
473                     mMainViewContainer.addView(d3CheckBox);
474                     mMainViewContainer.addView(vmCheckBox);
475                     mMainViewContainer.addView(nativeCheckBox);
476                     mMainViewContainer.addView(mWebInfo);
477                     mMainViewContainer.addView(mButtonContainer, fillWrap);
478                     mMainViewContainer.addView(mTracker, 0,0);
479                     mListScroll.addView(mMainViewContainer, fillParent);
480                     mMainView.addView(mListScroll, fillWrap);
481
482                     return mMainView;
483
484                 }
485
486                 LinearLayout mMainView = new LinearLayout(Benchmark.this);
487                 mMainView.setOrientation(1);
488                 ScrollView mListScroll = new ScrollView(Benchmark.this);
489                 LinearLayout mListContainer = new LinearLayout(Benchmark.this);
490                 mListContainer.setOrientation(1);
491                 mListScroll.addView(mListContainer, fillParent);
492                 mMainView.addView(mListScroll, fillWrap);
493
494                 boolean gray = true;
495                 int length = mCases.size();
496                 Log.i(TAG, "L: " + length);
497                 Log.i(TAG, "TCF: " + tag);
498                 for (int i = 0; i < length; i++) {
499                     if (!mCategory.get(tag).contains(mCases.get(i)))
500                         continue;
501                     Log.i(TAG, "Add: " + i); 
502                     mListContainer.addView(mCheckList[i], fillWrap);
503                     mListContainer.addView(mDesc[i], fillWrap);
504                     if (gray) {
505                         int color = 0xFF333333; //ARGB
506                         mCheckList[i].setBackgroundColor(color);
507                         mDesc[i].setBackgroundColor(color);
508                     }
509                     gray = !gray;
510                 }
511                 return mMainView;
512             }
513         };
514
515         mTabHost.addTab(mTabHost.newTabSpec(MAIN).setIndicator(MAIN, getResources().getDrawable(R.drawable.ic_eye)).setContent(mTCF));
516         mTabHost.addTab(mTabHost.newTabSpec(D2).setIndicator(D2, getResources().getDrawable(R.drawable.ic_2d)).setContent(mTCF));
517         mTabHost.addTab(mTabHost.newTabSpec(D3).setIndicator(D3, getResources().getDrawable(R.drawable.ic_3d)).setContent(mTCF));
518         mTabHost.addTab(mTabHost.newTabSpec(MISC).setIndicator(MISC, getResources().getDrawable(R.drawable.ic_pi)).setContent(mTCF));
519         mTabHost.addTab(mTabHost.newTabSpec(VM).setIndicator(VM, getResources().getDrawable(R.drawable.ic_vm)).setContent(mTCF));
520         mTabHost.addTab(mTabHost.newTabSpec(NATIVE).setIndicator(NATIVE, getResources().getDrawable(R.drawable.ic_c)).setContent(mTCF));
521
522     }
523
524     public void onClick(View v) {
525         if (v == mRun) {
526             int numberOfCaseChecked = 0;
527             for (int i = 0; i < mCheckList.length; i++) {
528                 if (mCheckList[i].isChecked()) {
529                     mCases.get(i).reset();
530                     numberOfCaseChecked++;
531                 } else {
532                     mCases.get(i).clear();
533                 }
534             }
535             if (numberOfCaseChecked > 0)
536                 runCase(mCases);
537         } else if (v == mShow) {
538             String result = getResult();
539             Log.i(TAG,"\n\n"+result+"\n\n");
540             writeResult(mOutputFile, result);
541             Intent intent = new Intent();
542             intent.putExtra(Report.REPORT, result);
543             intent.putExtra(Report.XML, mXMLResult);
544             if (mAutoUpload) {
545                 intent.putExtra(Report.AUTOUPLOAD, true);
546                 mAutoUpload = false;
547             }
548             intent.setClassName(Report.packageName(), Report.fullClassName());
549             startActivity(intent);
550         } else if (v == d2CheckBox || v == d3CheckBox || v == miscCheckBox ||
551                    v == vmCheckBox || v == nativeCheckBox) {
552             int length = mCases.size();
553             String tag = ((CheckBox)v).getText().toString();
554             for (int i = 0; i < length; i++) {
555                 if (!mCategory.get(tag).contains(mCases.get(i)))
556                     continue;
557                 mCheckList[i].setChecked(((CheckBox)v).isChecked());
558             }
559         }
560     }
561
562     public void runCase(LinkedList<Case> list) {
563         Case pointer = null;
564         boolean finish = true;
565         for (int i = 0; i < list.size(); i++) {
566             pointer = list.get(i);
567             if (!pointer.isFinish()) {
568                 finish = false;
569                 break;
570             }
571         }
572
573         if (finish) {
574 //            mBannerInfo.setText("Benchmarking complete.\nClick Show to upload.\nUploaded results:\nhttp://0xbenchmark.appspot.com");
575             String result = getResult();
576             writeResult(mOutputFile, result);
577
578             final ProgressDialog dialogGetXml = new ProgressDialog(this).show(this, "Generating XML Report", "Please wait...", true, false);
579             new Thread() {
580                 public void run() {
581                     mJSONResult = getJSONResult();
582                     mXMLResult = getXMLResult();
583                     Log.d(TAG, "XML: " + mXMLResult);
584                     writeResult(mOutputXMLFile, mXMLResult);
585                     Log.d(TAG, "JSON: " + mJSONResult);
586                     writeResult(mOutputJSONFile, mJSONResult);
587                     mShow.setClickable(true);
588                     onClick(mShow);
589                     mTouchable = true;
590                     dialogGetXml.dismiss();
591                 }
592             }.start();
593         } else {
594             Intent intent = pointer.generateIntent();
595             if (intent != null) {
596                 startActivityForResult(intent, 0);
597             }
598         }
599     }
600
601     public String getXMLResult() {
602         if (mCases.size() == 0)
603             return "";
604
605         Date date = new Date();
606         //2010-05-28T17:40:25CST
607         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
608
609         String xml = "";
610         xml += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
611         xml += "<result";
612         xml += " executedTimestamp=\"" + sdf.format(date) + "\"";
613         xml += " manufacturer=\"" + Build.MANUFACTURER.replace(' ', '_') + "\"";
614         xml += " model=\"" + Build.MODEL.replace(' ', '_') + ":" + Build.DISPLAY + "\"";
615         xml += " buildTimestamp=\"" + sdf.format(new Date(Build.TIME)) + "\"";
616         xml += " orientation=\"" + Integer.toString(orientation) + "\"";
617
618         try { // read kernel version
619             BufferedReader procVersion = new BufferedReader( new FileReader("/proc/version") );
620             StringBuffer sbuff = new StringBuffer();
621             String tmp;
622             while ((tmp = procVersion.readLine()) != null)
623                 sbuff.append(tmp);
624             procVersion.close();
625             tmp = sbuff.toString().replace("[\n\r]+", " ").replace(" +", ".");
626             xml += " version=\"" + tmp + "\"";
627         } catch (IOException e){
628             Log.e(TAG, "opening /proc/version failed: " + e.toString());
629         }
630
631         try { // read and parse cpu info
632             BufferedReader procVersion = new BufferedReader(new FileReader("/proc/cpuinfo") );
633             StringBuffer sbuff = new StringBuffer();
634             String tmp;
635             while ((tmp = procVersion.readLine()) != null)
636                 sbuff.append(tmp + "\n");
637             procVersion.close();
638
639             tmp = sbuff.toString();
640
641             sbuff = new StringBuffer();
642
643             Pattern p1 = Pattern.compile("(Processor\\s*:\\s*(.*)\\s*[\n\r]+)");
644             Matcher m1 = p1.matcher(tmp);
645             if (m1.find()) sbuff.append(m1.group(2));
646
647             Pattern p2 = Pattern.compile("(Hardware\\s*:\\s*(.*)\\s*[\n\r]+)");
648             Matcher m2 = p2.matcher(tmp);
649             if (m2.find()) sbuff.append(":"+m2.group(2));
650
651             Pattern p3 = Pattern.compile("(Revision\\s*:\\s*(.*)\\s*[\n\r]+)");
652             Matcher m3 = p3.matcher(tmp);
653             if (m3.find()) sbuff.append(":"+m3.group(2));
654
655             Log.e(TAG, sbuff.toString());
656             xml += " cpu=\"" + sbuff.toString() + "\"";
657         } catch (IOException e) {
658             Log.e(TAG, "opening /proc/version failed: " + e.toString());
659         }
660
661         xml += ">";
662
663         Case mycase;
664         for (int i = 0; i < mCases.size(); i++) {
665             mycase = mCases.get(i);
666             xml += mycase.getXMLBenchmark();
667         }
668
669         xml += "</result>";
670         return xml;
671     }
672
673     /*
674      * Add Linaro Dashboard Bundle's JSON format support
675      * https://launchpad.net/linaro-python-dashboard-bundle/trunk
676      */
677     public String getJSONResult() {
678         Date date = new Date();
679         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
680
681         JSONObject result = new JSONObject();
682         try {
683             JSONArray testRunsArray = new JSONArray();
684             JSONObject testRunsObject = new JSONObject();
685             testRunsObject.put("analyzer_assigned_date", sdf.format(date));
686             testRunsObject.put("time_check_performed", false);
687             // TODO: should be UUID version 1
688             testRunsObject.put("analyzer_assigned_uuid", UUID.randomUUID().toString());
689             testRunsObject.put("test_id", "0xbench");
690
691             JSONArray testResultsList = new JSONArray();
692             Case myCase;
693             for (int i = 0; i < mCases.size(); i++) {
694                 myCase = mCases.get(i);
695                 JSONArray caseResultList = myCase.getJSONBenchmark();
696                 for (int j = 0; j < caseResultList.length(); j++) {
697                     testResultsList.put(caseResultList.get(j));
698                 }
699             }
700             testRunsObject.put("test_results", testResultsList);
701
702             testRunsArray.put(testRunsObject);
703             result.put("test_runs", testRunsArray);
704             result.put("format", "Dashboard Bundle Format 1.2");
705         }
706         catch (JSONException jsonE) {
707             jsonE.printStackTrace();
708         }
709         return result.toString();
710     }
711
712     public String getResult() {
713         String result = "";
714         Case mycase;
715         for (int i = 0; i < mCases.size(); i++) {
716             mycase = mCases.get(i);
717             if ( !mycase.couldFetchReport() ) continue;
718             result += "============================================================\n";
719             result += mycase.getTitle() + "\n";
720             result += "------------------------------------------------------------\n";
721             result += mycase.getResultOutput().trim() + "\n";
722         }
723         result += "============================================================\n";
724
725         return result;
726     }
727     
728     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
729         if (data == null) {
730             Log.i(TAG, "oooops....Intent is null");
731             return;
732         }
733
734         Case mycase;
735         for (int i = 0; i < mCases.size(); i++) {
736             mycase = mCases.get(i);
737             if (mycase.realize(data)) {
738                 mycase.parseIntent(data);
739                 break;
740             }
741         }
742         runCase(mCases);
743     }
744
745     private boolean writeResult(String filename, String output) {
746         File writeDir = new File(BenchUtil.getResultDir(this));
747         if (!writeDir.exists()) {
748             writeDir.mkdirs();
749         }
750
751         File file = new File(writeDir, filename);
752         if (file.exists()) {
753             Log.w(TAG, "File exists, delete " + writeDir.getPath() + filename);
754             file.delete();
755         }
756
757         try {
758             file.createNewFile();
759             FileOutputStream fos = new FileOutputStream(file);
760             fos.write(output.getBytes());
761             fos.flush();
762         } catch (Exception e) {
763             Log.i(TAG, "Write Failed.");
764             e.printStackTrace();
765             return false;
766         }
767         return true;
768     }
769 }