Home | History | Annotate | Download | only in tests
      1 //
      2 // Copyright 2011 The Android Open Source Project
      3 //
      4 #ifndef MOCKDIRECTORYWALKER_H
      5 #define MOCKDIRECTORYWALKER_H
      6 
      7 #include <utils/Vector.h>
      8 #include <utils/String8.h>
      9 #include <utility>
     10 #include "DirectoryWalker.h"
     11 
     12 using namespace android;
     13 using std::pair;
     14 
     15 // String8 Directory Walker
     16 // This is an implementation of the Directory Walker abstraction that is built
     17 // for testing.
     18 // Instead of system calls it queries a private data structure for the directory
     19 // entries. It takes a path and a map of filenames and their modification times.
     20 // functions are inlined since they are short and simple
     21 
     22 class StringDirectoryWalker : public DirectoryWalker {
     23 public:
     24     StringDirectoryWalker(String8& path, Vector< pair<String8,time_t> >& data)
     25         :  mPos(0), mBasePath(path), mData(data) {
     26         //fprintf(stdout,"StringDW built to mimic %s with %d files\n",
     27         //       mBasePath.string());
     28     };
     29     // Default copy constructor, and destructor are fine
     30 
     31     virtual bool openDir(String8 path) {
     32         // If the user is trying to query the "directory" that this
     33         // walker was initialized with, then return success. Else fail.
     34         return path == mBasePath;
     35     };
     36     virtual bool openDir(const char* path) {
     37         String8 p(path);
     38         openDir(p);
     39         return true;
     40     };
     41     // Advance to next entry in the Vector
     42     virtual struct dirent* nextEntry() {
     43         // Advance position and check to see if we're done
     44         if (mPos >= mData.size())
     45             return NULL;
     46 
     47         // Place data in the entry descriptor. This class only returns files.
     48         mEntry.d_type = DT_REG;
     49         mEntry.d_ino = mPos;
     50         // Copy chars from the string name to the entry name
     51         size_t i = 0;
     52         for (i; i < mData[mPos].first.size(); ++i)
     53             mEntry.d_name[i] = mData[mPos].first[i];
     54         mEntry.d_name[i] = '\0';
     55 
     56         // Place data in stats
     57         mStats.st_ino = mPos;
     58         mStats.st_mtime = mData[mPos].second;
     59 
     60         // Get ready to move to the next entry
     61         mPos++;
     62 
     63         return &mEntry;
     64     };
     65     // Get the stats for the current entry
     66     virtual struct stat*   entryStats() {
     67         return &mStats;
     68     };
     69     // Nothing to do in clean up
     70     virtual void closeDir() {
     71         // Nothing to do
     72     };
     73     virtual DirectoryWalker* clone() {
     74         return new StringDirectoryWalker(*this);
     75     };
     76 private:
     77     // Current position in the Vector
     78     size_t mPos;
     79     // Base path
     80     String8 mBasePath;
     81     // Data to simulate a directory full of files.
     82     Vector< pair<String8,time_t> > mData;
     83 };
     84 
     85 #endif // MOCKDIRECTORYWALKER_H