testcase.h revision 39c016f875b793296a121f41de5775b88f6fa1c9
139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania/*
239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * Copyright (C) 2009 The Android Open Source Project
339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * All rights reserved.
439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *
539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * Redistribution and use in source and binary forms, with or without
639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * modification, are permitted provided that the following conditions
739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * are met:
839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *  * Redistributions of source code must retain the above copyright
939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *    notice, this list of conditions and the following disclaimer.
1039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *  * Redistributions in binary form must reproduce the above copyright
1139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *    notice, this list of conditions and the following disclaimer in
1239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *    the documentation and/or other materials provided with the
1339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *    distribution.
1439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *
1539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
1839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
1939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
2239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
2539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * SUCH DAMAGE.
2739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania */
2839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
2939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
3039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#ifndef SYSTEM_EXTRAS_TESTS_SDCARD_TESTCASE_H_
3139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#define SYSTEM_EXTRAS_TESTS_SDCARD_TESTCASE_H_
3239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
3339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#include <stdlib.h>
3439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#include "stopwatch.h"
3539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#include "sysutil.h"
3639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
3739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catanianamespace android_test {
3839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
3939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania// Class to group test parameters and implementation.
4039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania// Takes care of forking child processes and wait for them.
4139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
4239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniaclass TestCase {
4339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania  public:
4439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    enum Type {UNKNOWN_TEST, WRITE, READ, OPEN_CREATE, READ_WRITE};
4539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    enum Pipe {READ_FROM_CHILD = 0, WRITE_TO_PARENT, READ_FROM_PARENT, WRITE_TO_CHILD};
4639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    enum Sync {NO_SYNC, FSYNC, SYNC};
4739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
4839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // Reads takes less time than writes. This is a basic
4939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // approximation of how much longer the read tasks must run to
5039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // terminate roughly at the same time as the write tasks.
5139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    const static int kReadWriteFactor = 5;
5239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
5339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    TestCase(const char *appName);
5439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
5539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    ~TestCase();
5639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
5739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    size_t iter() const { return mIter; }
5839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    void setIter(size_t iter);
5939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
6039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    size_t nproc() const { return mNproc; }
6139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    void setNproc(size_t val) { mNproc = val; }
6239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
6339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    size_t dataSize() const { return mDataSize; }
6439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    void setDataSize(size_t val) { mDataSize = val; }
6539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
6639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    size_t chunkSize() const { return mChunkSize; }
6739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    void setChunkSize(size_t val) { mChunkSize = val; }
6839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
6939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    bool newFairSleepers() const { return mNewFairSleepers; }
7039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    void setNewFairSleepers(bool val) {
7139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        mNewFairSleepers = val;
7239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        android::setNewFairSleepers(val);
7339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
7439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
7539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    bool normalizedSleepers() const { return mNormalizedSleepers; }
7639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    void setNormalizedSleepers(bool val) {
7739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        mNormalizedSleepers = val;
7839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        android::setNormalizedSleepers(val);
7939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
8039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
8139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    Sync sync() const { return mSync; }
8239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    void setSync(Sync s);
8339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    const char *syncAsStr() const;
8439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
8539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    bool cpuScaling() const { return mCpuScaling; }
8639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    void setCpuScaling() { mCpuScaling = true; }
8739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
8839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    bool truncateToSize() const { return mTruncateToSize; }
8939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    void setTruncateToSize() { mTruncateToSize = true; }
9039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
9139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    int fadvise() { return mFadvice; }
9239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    void setFadvise(const char *advice);
9339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    const char *fadviseAsStr() const;
9439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
9539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // Print the samples.
9639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    void setDump() { StopWatch::setPrintRawMode(true); }
9739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
9839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    StopWatch *testTimer() { return mTestTimer; }
9939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    StopWatch *openTimer() { return mOpenTimer; }
10039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    StopWatch *readTimer() { return mReadTimer; }
10139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    StopWatch *writeTimer() { return mWriteTimer; }
10239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    StopWatch *syncTimer() { return mSyncTimer; }
10339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    StopWatch *truncateTimer() { return mTruncateTimer; }
10439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
10539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // Fork the children, run the test and wait for them to complete.
10639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    bool runTest();
10739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
10839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    void signalParentAndWait() {
10939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        if (!android::writePidAndWaitForReply(mIpc[WRITE_TO_PARENT], mIpc[READ_FROM_PARENT])) {
11039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            exit(1);
11139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        }
11239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
11339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
11439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    void createTimers();
11539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    bool setTypeFromName(const char *test_name);
11639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    Type type() const { return mType; }
11739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    pid_t pid() const { return mPid; }
11839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    const char *name() const { return mName; }
11939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
12039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // This is set to the function that will actually do the test when
12139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // the command line arguments have been parsed. The function will
12239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // be run in one or more child(ren) process(es).
12339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    bool (*mTestBody)(TestCase *);
12439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniaprivate:
12539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    const char *mAppName;
12639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    size_t mDataSize;
12739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    size_t mChunkSize;
12839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    size_t mIter;
12939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    size_t mNproc;
13039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    pid_t mPid;
13139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    char mName[80];
13239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    Type mType;
13339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
13439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    bool mDump;  // print the raw values instead of a human friendly report.
13539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    bool mCpuScaling;  // true, do not turn off cpu scaling.
13639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    Sync mSync;
13739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    int mFadvice;
13839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // When new files are created, truncate them to the final size.
13939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    bool mTruncateToSize;
14039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
14139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    bool mNewFairSleepers;
14239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    bool mNormalizedSleepers;
14339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
14439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // IPC
14539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    //        Parent               Child(ren)
14639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // ---------------------------------------
14739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // 0: read from child          closed
14839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // 1: closed                   write to parent
14939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // 2: closed                   read from parent
15039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // 3: write to child           closed
15139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    int mIpc[4];
15239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
15339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    StopWatch *mTestTimer;  // Used to time the test overall.
15439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    StopWatch *mOpenTimer;  // Used to time the open calls.
15539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    StopWatch *mReadTimer;  // Used to time the read calls.
15639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    StopWatch *mWriteTimer;  // Used to time the write calls.
15739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    StopWatch *mSyncTimer;  // Used to time the sync/fsync calls.
15839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    StopWatch *mTruncateTimer;  // Used to time the ftruncate calls.
15939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania};
16039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
16139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}  // namespace android_test
16239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
16339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#endif  // SYSTEM_EXTRAS_TESTS_SDCARD_TESTCASE_H_
164