1b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook/*
2b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * Copyright (C) 2010 The Android Open Source Project
3b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook *
4b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * Licensed under the Apache License, Version 2.0 (the "License");
5b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * you may not use this file except in compliance with the License.
6b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * You may obtain a copy of the License at
7b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook *
8b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook *      http://www.apache.org/licenses/LICENSE-2.0
9b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook *
10b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * Unless required by applicable law or agreed to in writing, software
11b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * distributed under the License is distributed on an "AS IS" BASIS,
12b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * See the License for the specific language governing permissions and
14b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook * limitations under the License.
15b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook */
16b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook
17b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookpackage com.android.exchange.adapter;
18b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook
19b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport android.content.ContentResolver;
20b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport android.content.ContentUris;
21b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport android.content.Context;
22b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport android.test.AndroidTestCase;
23b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook
24b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport com.android.emailcommon.provider.Account;
25b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport com.android.emailcommon.provider.Mailbox;
26b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport com.android.exchange.EasSyncService;
27b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport com.android.exchange.adapter.AbstractSyncAdapter;
28b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport com.android.exchange.adapter.EmailSyncAdapter;
29b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport com.android.exchange.adapter.EmailSyncAdapter.EasEmailSyncParser;
30b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook
31b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport java.io.ByteArrayInputStream;
32b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport java.io.InputStream;
33b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport java.lang.reflect.Constructor;
34b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookimport java.lang.reflect.InvocationTargetException;
35b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook
36b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrookpublic class SyncAdapterTestCase<T extends AbstractSyncAdapter> extends AndroidTestCase {
37b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    public Context mContext;
38b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    public Context mProviderContext;
39b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    public ContentResolver mResolver;
40b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    public Mailbox mMailbox;
41b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    public Account mAccount;
42b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    public EmailSyncAdapter mSyncAdapter;
43b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    public EasEmailSyncParser mSyncParser;
44b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook
45b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    public SyncAdapterTestCase() {
46b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    }
47b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook
48b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    @Override
49b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    public void setUp() throws Exception {
50b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        super.setUp();
51b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        mContext = getContext();
52b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        // This could be used with a MockContext if we switch over
53b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        mProviderContext = mContext;
54b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        mResolver = mContext.getContentResolver();
55b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    }
56b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook
57b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    @Override
58b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    public void tearDown() throws Exception {
59b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        super.tearDown();
60b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        // If we've created and saved an account, delete it
61b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        if (mAccount != null && mAccount.mId > 0) {
62b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook            mResolver.delete(ContentUris.withAppendedId(Account.CONTENT_URI, mAccount.mId), null,
63b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook                    null);
64b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        }
65b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    }
66b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook
67b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    /**
68b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook     * Create and return a short, simple InputStream that has at least four bytes, which is all
69b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook     * that's required to initialize an EasParser (the parent class of EasEmailSyncParser)
70b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook     * @return the InputStream
71b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook     */
72b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    public InputStream getTestInputStream() {
73b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        return new ByteArrayInputStream(new byte[] {0, 0, 0, 0, 0});
74b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    }
75b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook
76b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    EasSyncService getTestService() {
77b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        mAccount = new Account();
78b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        mAccount.mEmailAddress = "__test__@android.com";
79b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        mAccount.mId = -1;
80b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        Mailbox mailbox = new Mailbox();
81b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        mailbox.mId = -1;
82b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        return getTestService(mAccount, mailbox);
83b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    }
84b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook
85b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    EasSyncService getTestService(Account account, Mailbox mailbox) {
86b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        EasSyncService service = new EasSyncService();
87b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        service.mContext = mContext;
88b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        service.mMailbox = mailbox;
89b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        service.mAccount = account;
90b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        service.mContentResolver = mContext.getContentResolver();
91b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        return service;
92b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    }
93b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook
94b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    protected T getTestSyncAdapter(Class<T> klass) {
95b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        EasSyncService service = getTestService();
96b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        Constructor<T> c;
97b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        try {
98b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook            c = klass.getDeclaredConstructor(new Class[] {EasSyncService.class});
99b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook            return c.newInstance(service);
100b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        } catch (SecurityException e) {
101b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        } catch (NoSuchMethodException e) {
102b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        } catch (IllegalArgumentException e) {
103b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        } catch (InstantiationException e) {
104b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        } catch (IllegalAccessException e) {
105b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        } catch (InvocationTargetException e) {
106b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        }
107b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook        return null;
108b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook    }
109b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook
110b931f82fa44c2e26e2645c0d5fde9eef3e666efdPaul Westbrook}
111