testcase.cpp 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#include "testcase.h"
3039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#include <hardware_legacy/power.h>  // wake lock
3139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#include <sys/types.h>
3239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#include <sys/wait.h>
3339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#include <unistd.h>
3439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#include <linux/fadvise.h>
3539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
3639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catanianamespace {
3739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniaconst bool kVerbose = false;
3839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
3939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
4039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catanianamespace android_test {
4139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
4239c016f875b793296a121f41de5775b88f6fa1c9Nicolas CataniaTestCase::TestCase(const char *appName)
4339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    : mTestBody(NULL), mAppName(appName), mDataSize(1000 * 1000),
4439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      mChunkSize(mDataSize), mIter(20), mNproc(1),
4539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      mType(UNKNOWN_TEST),  mDump(false), mCpuScaling(false),
4639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      mSync(NO_SYNC), mFadvice(POSIX_FADV_NORMAL), mTruncateToSize(false),
4739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      mTestTimer(NULL)
4839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
4939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // Make sure the cpu and phone are fully awake. The
5039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // FULL_WAKE_LOCK was used by java apps and don't do
5139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // anything. Also the partial wake lock is a nop if the phone
5239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // is plugged in via USB.
5339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    acquire_wake_lock(PARTIAL_WAKE_LOCK, mAppName);
5439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mPid = getpid();
5539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    setNewFairSleepers(true);
5639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    setNormalizedSleepers(true);
5739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (pipe(mIpc) < 0)
5839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
5939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        fprintf(stderr, "pipe failed\n");
6039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        exit(1);
6139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
6239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (pipe(mIpc + 2) < 0)
6339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
6439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        fprintf(stderr, "pipe failed\n");
6539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        exit(1);
6639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
6739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
6839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
6939c016f875b793296a121f41de5775b88f6fa1c9Nicolas CataniaTestCase::~TestCase()
7039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
7139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    release_wake_lock(mAppName);
7239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    for (int i = 0; i < 4; ++i) close(mIpc[i]);
7339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    delete mTestTimer;
7439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    delete mOpenTimer;
7539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
7639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
7739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
7839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniabool TestCase::runTest()
7939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
8039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (UNKNOWN_TEST == mType)
8139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
8239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        fprintf(stderr, "No test set.");
8339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        return false;
8439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
8539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    for (size_t p = 0; p < mNproc; ++p)
8639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
8739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        pid_t childpid = android::forkOrExit();
8839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
8939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        if (0 == childpid) { // I am a child, run the test.
9039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            mPid = getpid();
9139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            close(mIpc[READ_FROM_CHILD]);
9239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            close(mIpc[WRITE_TO_CHILD]);
9339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
9439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            if (kVerbose) printf("Child pid: %d\n", mPid);
9539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            if (!mTestBody(this)) {
9639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania                printf("Test failed\n");
9739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            }
9839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            char buffer[32000] = {0,};
9939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            char *str = buffer;
10039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            size_t size_left = sizeof(buffer);
10139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
10239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            testTimer()->sprint(&str, &size_left);
10339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            if(openTimer()->used()) openTimer()->sprint(&str, &size_left);
10439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            if(readTimer()->used()) readTimer()->sprint(&str, &size_left);
10539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            if(writeTimer()->used()) writeTimer()->sprint(&str, &size_left);
10639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            if(syncTimer()->used()) syncTimer()->sprint(&str, &size_left);
10739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            if(truncateTimer()->used()) truncateTimer()->sprint(&str, &size_left);
10839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
10939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            write(mIpc[TestCase::WRITE_TO_PARENT], buffer, str - buffer);
11039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
11139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
11239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            close(mIpc[WRITE_TO_PARENT]);
11339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            close(mIpc[READ_FROM_PARENT]);
11439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            exit(EXIT_SUCCESS);
11539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        }
11639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
11739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // I am the parent process
11839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    close(mIpc[WRITE_TO_PARENT]);
11939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    close(mIpc[READ_FROM_PARENT]);
12039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
12139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // Block until all the children have reported for
12239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // duty. Unblock them so they start the work.
12339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (!android::waitForChildrenAndSignal(mNproc, mIpc[READ_FROM_CHILD], mIpc[WRITE_TO_CHILD]))
12439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
12539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        exit(1);
12639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
12739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
12839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // Process the output of each child.
12939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // TODO: handle EINTR
13039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    char buffer[32000] = {0,};
13139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    while(read(mIpc[READ_FROM_CHILD], buffer, sizeof(buffer)) != 0)
13239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
13339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        printf("%s", buffer);
13439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        fflush(stdout);
13539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        memset(buffer, 0, sizeof(buffer));
13639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
13739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    // Parent is waiting for children to exit.
13839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    android::waitForChildrenOrExit(mNproc);
13939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    return true;
14039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
14139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
14239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniavoid TestCase::setIter(size_t iter)
14339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
14439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mIter = iter;
14539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
14639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
14739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniavoid TestCase::createTimers()
14839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
14939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    char total_time[80];
15039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
15139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    snprintf(total_time, sizeof(total_time), "%s_total", mName);
15239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mTestTimer = new StopWatch(total_time, 1);
15339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mTestTimer->setDataSize(dataSize());
15439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
15539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mOpenTimer = new StopWatch("open", iter() * kReadWriteFactor);
15639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
15739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mReadTimer = new StopWatch("read", iter() * dataSize() / chunkSize() * kReadWriteFactor);
15839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mReadTimer->setDataSize(dataSize());
15939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
16039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mWriteTimer = new StopWatch("write", iter() * dataSize() / chunkSize());
16139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mWriteTimer->setDataSize(dataSize());
16239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
16339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mSyncTimer = new StopWatch("sync", iter());
16439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
16539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mTruncateTimer = new StopWatch("truncate", iter());
16639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
16739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
16839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniabool TestCase::setTypeFromName(const char *test_name)
16939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
17039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    strcpy(mName, test_name);
17139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (strcmp(mName, "write") == 0) mType = WRITE;
17239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (strcmp(mName, "read") == 0) mType = READ;
17339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (strcmp(mName, "read_write") == 0) mType = READ_WRITE;
17439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (strcmp(mName, "open_create") == 0) mType = OPEN_CREATE;
17539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
17639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    return UNKNOWN_TEST != mType;
17739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
17839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
17939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniavoid TestCase::setSync(Sync s)
18039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
18139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mSync = s;
18239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
18339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
18439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniaconst char *TestCase::syncAsStr() const
18539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
18639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    return mSync == NO_SYNC ? "disabled" : (mSync == FSYNC ? "fsync" : "sync");
18739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
18839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
18939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniavoid TestCase::setFadvise(const char *advice)
19039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
19139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mFadvice = POSIX_FADV_NORMAL;
19239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (strcmp(advice, "sequential") == 0)
19339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
19439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        mFadvice = POSIX_FADV_SEQUENTIAL;
19539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
19639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    else if (strcmp(advice, "random") == 0)
19739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
19839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        mFadvice = POSIX_FADV_RANDOM;
19939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
20039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    else if (strcmp(advice, "noreuse") == 0)
20139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
20239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        mFadvice = POSIX_FADV_NOREUSE;
20339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
20439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    else if (strcmp(advice, "willneed") == 0)
20539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
20639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        mFadvice = POSIX_FADV_WILLNEED;
20739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
20839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    else if (strcmp(advice, "dontneed") == 0)
20939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
21039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        mFadvice = POSIX_FADV_DONTNEED;
21139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
21239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
21339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
21439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniaconst char *TestCase::fadviseAsStr() const
21539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
21639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    switch (mFadvice) {
21739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        case POSIX_FADV_NORMAL: return "fadv_normal";
21839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        case POSIX_FADV_SEQUENTIAL: return "fadv_sequential";
21939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        case POSIX_FADV_RANDOM: return "fadv_random";
22039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        case POSIX_FADV_NOREUSE: return "fadv_noreuse";
22139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        case POSIX_FADV_WILLNEED: return "fadv_willneed";
22239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        case POSIX_FADV_DONTNEED: return "fadv_dontneed";
22339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        default: return "fadvice_unknown";
22439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
22539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
22639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
22739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
22839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}  // namespace android_test
229