17640caaf912a7eefacc3e2108c5afd70f7b072a4noda/*
27640caaf912a7eefacc3e2108c5afd70f7b072a4noda * Copyright (C) 2010 The Android Open Source Project
37640caaf912a7eefacc3e2108c5afd70f7b072a4noda *
47640caaf912a7eefacc3e2108c5afd70f7b072a4noda * Licensed under the Apache License, Version 2.0 (the "License");
57640caaf912a7eefacc3e2108c5afd70f7b072a4noda * you may not use this file except in compliance with the License.
67640caaf912a7eefacc3e2108c5afd70f7b072a4noda * You may obtain a copy of the License at
77640caaf912a7eefacc3e2108c5afd70f7b072a4noda *
87640caaf912a7eefacc3e2108c5afd70f7b072a4noda *      http://www.apache.org/licenses/LICENSE-2.0
97640caaf912a7eefacc3e2108c5afd70f7b072a4noda *
107640caaf912a7eefacc3e2108c5afd70f7b072a4noda * Unless required by applicable law or agreed to in writing, software
117640caaf912a7eefacc3e2108c5afd70f7b072a4noda * distributed under the License is distributed on an "AS IS" BASIS,
127640caaf912a7eefacc3e2108c5afd70f7b072a4noda * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137640caaf912a7eefacc3e2108c5afd70f7b072a4noda * See the License for the specific language governing permissions and
147640caaf912a7eefacc3e2108c5afd70f7b072a4noda * limitations under the License.
157640caaf912a7eefacc3e2108c5afd70f7b072a4noda */
167640caaf912a7eefacc3e2108c5afd70f7b072a4noda
177640caaf912a7eefacc3e2108c5afd70f7b072a4nodapackage com.android.smspush.unitTests;
187640caaf912a7eefacc3e2108c5afd70f7b072a4noda
197640caaf912a7eefacc3e2108c5afd70f7b072a4nodaimport android.app.Service;
207640caaf912a7eefacc3e2108c5afd70f7b072a4nodaimport android.content.Context;
217640caaf912a7eefacc3e2108c5afd70f7b072a4nodaimport android.content.Intent;
227640caaf912a7eefacc3e2108c5afd70f7b072a4nodaimport android.os.IBinder;
237640caaf912a7eefacc3e2108c5afd70f7b072a4nodaimport android.util.Log;
247640caaf912a7eefacc3e2108c5afd70f7b072a4noda
257640caaf912a7eefacc3e2108c5afd70f7b072a4nodaimport com.android.internal.util.HexDump;
267640caaf912a7eefacc3e2108c5afd70f7b072a4noda
277640caaf912a7eefacc3e2108c5afd70f7b072a4noda/**
287640caaf912a7eefacc3e2108c5afd70f7b072a4noda * To verify that receiver application receives correct body data.
297640caaf912a7eefacc3e2108c5afd70f7b072a4noda */
307640caaf912a7eefacc3e2108c5afd70f7b072a4nodapublic class DataVerify extends Service {
317640caaf912a7eefacc3e2108c5afd70f7b072a4noda    private static final String LOG_TAG = "WAP PUSH";
327640caaf912a7eefacc3e2108c5afd70f7b072a4noda    private static final int TIME_WAIT = 100;
337640caaf912a7eefacc3e2108c5afd70f7b072a4noda    private static final int WAIT_COUNT = 100;
347640caaf912a7eefacc3e2108c5afd70f7b072a4noda    private static byte[] mLastReceivedPdu = null;
357640caaf912a7eefacc3e2108c5afd70f7b072a4noda    private static boolean sDataSet = false;
367640caaf912a7eefacc3e2108c5afd70f7b072a4noda
377640caaf912a7eefacc3e2108c5afd70f7b072a4noda    private class IDataVerifyStub extends IDataVerify.Stub {
387640caaf912a7eefacc3e2108c5afd70f7b072a4noda        public Context mContext;
397640caaf912a7eefacc3e2108c5afd70f7b072a4noda
407640caaf912a7eefacc3e2108c5afd70f7b072a4noda        public IDataVerifyStub() {
417640caaf912a7eefacc3e2108c5afd70f7b072a4noda        }
427640caaf912a7eefacc3e2108c5afd70f7b072a4noda
437640caaf912a7eefacc3e2108c5afd70f7b072a4noda        boolean arrayCompare(byte[] arr1, byte[] arr2) {
447640caaf912a7eefacc3e2108c5afd70f7b072a4noda            int i;
457640caaf912a7eefacc3e2108c5afd70f7b072a4noda
467640caaf912a7eefacc3e2108c5afd70f7b072a4noda            if (arr1 == null || arr2 == null) {
477640caaf912a7eefacc3e2108c5afd70f7b072a4noda                if (arr1 == null) {
487640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    Log.w(LOG_TAG, "arr1 is null");
497640caaf912a7eefacc3e2108c5afd70f7b072a4noda                } else {
507640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    Log.w(LOG_TAG, "arr2 is null");
517640caaf912a7eefacc3e2108c5afd70f7b072a4noda                }
527640caaf912a7eefacc3e2108c5afd70f7b072a4noda                return false;
537640caaf912a7eefacc3e2108c5afd70f7b072a4noda            }
547640caaf912a7eefacc3e2108c5afd70f7b072a4noda
557640caaf912a7eefacc3e2108c5afd70f7b072a4noda            if (arr1.length != arr2.length) {
567640caaf912a7eefacc3e2108c5afd70f7b072a4noda                return false;
577640caaf912a7eefacc3e2108c5afd70f7b072a4noda            }
587640caaf912a7eefacc3e2108c5afd70f7b072a4noda
597640caaf912a7eefacc3e2108c5afd70f7b072a4noda            for (i = 0; i < arr1.length; i++) {
607640caaf912a7eefacc3e2108c5afd70f7b072a4noda                if (arr1[i] != arr2[i]) return false;
617640caaf912a7eefacc3e2108c5afd70f7b072a4noda            }
627640caaf912a7eefacc3e2108c5afd70f7b072a4noda            return true;
637640caaf912a7eefacc3e2108c5afd70f7b072a4noda        }
647640caaf912a7eefacc3e2108c5afd70f7b072a4noda
657640caaf912a7eefacc3e2108c5afd70f7b072a4noda        /**
667640caaf912a7eefacc3e2108c5afd70f7b072a4noda         * Compare pdu and received pdu
677640caaf912a7eefacc3e2108c5afd70f7b072a4noda         */
687640caaf912a7eefacc3e2108c5afd70f7b072a4noda        public synchronized boolean verifyData(byte[] pdu) {
697640caaf912a7eefacc3e2108c5afd70f7b072a4noda            int cnt = 0;
707640caaf912a7eefacc3e2108c5afd70f7b072a4noda
717640caaf912a7eefacc3e2108c5afd70f7b072a4noda            while (!sDataSet) {
727640caaf912a7eefacc3e2108c5afd70f7b072a4noda                // wait for the activity receive data.
737640caaf912a7eefacc3e2108c5afd70f7b072a4noda                try {
747640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    Thread.sleep(TIME_WAIT);
757640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    if (cnt++ > WAIT_COUNT) {
767640caaf912a7eefacc3e2108c5afd70f7b072a4noda                        // don't wait more than 10 sec.
777640caaf912a7eefacc3e2108c5afd70f7b072a4noda                        return false;
787640caaf912a7eefacc3e2108c5afd70f7b072a4noda                    }
797640caaf912a7eefacc3e2108c5afd70f7b072a4noda                } catch (InterruptedException e) {}
807640caaf912a7eefacc3e2108c5afd70f7b072a4noda            }
817640caaf912a7eefacc3e2108c5afd70f7b072a4noda
827640caaf912a7eefacc3e2108c5afd70f7b072a4noda            Log.v(LOG_TAG, "verify pdu");
837640caaf912a7eefacc3e2108c5afd70f7b072a4noda            boolean ret = arrayCompare(pdu, mLastReceivedPdu);
847640caaf912a7eefacc3e2108c5afd70f7b072a4noda            return ret;
857640caaf912a7eefacc3e2108c5afd70f7b072a4noda        }
867640caaf912a7eefacc3e2108c5afd70f7b072a4noda
877640caaf912a7eefacc3e2108c5afd70f7b072a4noda        /**
887640caaf912a7eefacc3e2108c5afd70f7b072a4noda         * Clear the old data. This method must be called before starting the test
897640caaf912a7eefacc3e2108c5afd70f7b072a4noda         */
907640caaf912a7eefacc3e2108c5afd70f7b072a4noda        public void resetData() {
917640caaf912a7eefacc3e2108c5afd70f7b072a4noda            mLastReceivedPdu = null;
927640caaf912a7eefacc3e2108c5afd70f7b072a4noda            sDataSet = false;
937640caaf912a7eefacc3e2108c5afd70f7b072a4noda        }
947640caaf912a7eefacc3e2108c5afd70f7b072a4noda    }
957640caaf912a7eefacc3e2108c5afd70f7b072a4noda
967640caaf912a7eefacc3e2108c5afd70f7b072a4noda    private final IDataVerifyStub binder = new IDataVerifyStub();
977640caaf912a7eefacc3e2108c5afd70f7b072a4noda
987640caaf912a7eefacc3e2108c5afd70f7b072a4noda    /**
997640caaf912a7eefacc3e2108c5afd70f7b072a4noda     * Constructor
1007640caaf912a7eefacc3e2108c5afd70f7b072a4noda     */
1017640caaf912a7eefacc3e2108c5afd70f7b072a4noda    public DataVerify() {
1027640caaf912a7eefacc3e2108c5afd70f7b072a4noda    }
1037640caaf912a7eefacc3e2108c5afd70f7b072a4noda
1047640caaf912a7eefacc3e2108c5afd70f7b072a4noda    /**
1057640caaf912a7eefacc3e2108c5afd70f7b072a4noda     * Receiver application must call this method when it receives the wap push message
1067640caaf912a7eefacc3e2108c5afd70f7b072a4noda     */
1077640caaf912a7eefacc3e2108c5afd70f7b072a4noda    public static void SetLastReceivedPdu(byte[] pdu) {
1087640caaf912a7eefacc3e2108c5afd70f7b072a4noda        mLastReceivedPdu = pdu;
1097640caaf912a7eefacc3e2108c5afd70f7b072a4noda        sDataSet = true;
1107640caaf912a7eefacc3e2108c5afd70f7b072a4noda    }
1117640caaf912a7eefacc3e2108c5afd70f7b072a4noda
1127640caaf912a7eefacc3e2108c5afd70f7b072a4noda    @Override
1137640caaf912a7eefacc3e2108c5afd70f7b072a4noda    public IBinder onBind(Intent arg0) {
1147640caaf912a7eefacc3e2108c5afd70f7b072a4noda        return binder;
1157640caaf912a7eefacc3e2108c5afd70f7b072a4noda    }
1167640caaf912a7eefacc3e2108c5afd70f7b072a4noda
1177640caaf912a7eefacc3e2108c5afd70f7b072a4noda}
1187640caaf912a7eefacc3e2108c5afd70f7b072a4noda
1197640caaf912a7eefacc3e2108c5afd70f7b072a4noda
120