]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - tools/src/tools/ecostest/common/eCosTestUtils.cpp
Initial revision
[karo-tx-redboot.git] / tools / src / tools / ecostest / common / eCosTestUtils.cpp
diff --git a/tools/src/tools/ecostest/common/eCosTestUtils.cpp b/tools/src/tools/ecostest/common/eCosTestUtils.cpp
new file mode 100644 (file)
index 0000000..e1d0a46
--- /dev/null
@@ -0,0 +1,268 @@
+//####COPYRIGHTBEGIN####
+//                                                                          
+// ----------------------------------------------------------------------------
+// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
+//
+// This program is part of the eCos host tools.
+//
+// This program is free software; you can redistribute it and/or modify it 
+// under the terms of the GNU General Public License as published by the Free 
+// Software Foundation; either version 2 of the License, or (at your option) 
+// any later version.
+// 
+// This program is distributed in the hope that it will be useful, but WITHOUT 
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
+// more details.
+// 
+// You should have received a copy of the GNU General Public License along with
+// this program; if not, write to the Free Software Foundation, Inc., 
+// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+//
+// ----------------------------------------------------------------------------
+//                                                                          
+//####COPYRIGHTEND####
+//=================================================================
+//
+//        eCosTestUtils.cpp
+//
+//        Utility functions
+//
+//=================================================================
+//=================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):     sdf
+// Contributors:  sdf
+// Date:          1999-04-01
+// Description:   This class contains utility functions for use in the testing infrastructure
+// Usage:
+//
+//####DESCRIPTIONEND####
+
+#include "eCosStd.h"
+#include "eCosSocket.h"
+#include "eCosTestUtils.h"
+#include "eCosThreadUtils.h"
+#include "eCosTrace.h"
+#include "TestResource.h"
+
+LPCTSTR  const CeCosTestUtils::Tail(LPCTSTR  const pszFile)
+{
+  LPCTSTR pszTail=_tcsrchr(pszFile,_TCHAR('/'));
+  if(0==pszTail){
+    pszTail=_tcsrchr(pszFile,_TCHAR('\\'));
+  }
+  return (0==pszTail)?pszFile:pszTail+1;
+}
+
+// File iterator.  Gets next file in directory, avoiding _T(".") and _T("..")
+bool CeCosTestUtils::NextFile (void *&pHandle,String &str)
+{
+#ifdef _WIN32
+  WIN32_FIND_DATA fd;
+  while(FindNextFile((HANDLE)pHandle,&fd)){
+    LPCTSTR pszName=fd.cFileName;
+#else // UNIX
+    struct dirent *d;
+    while((d=readdir((DIR *)pHandle))){
+      LPCTSTR pszName=d->d_name;
+#endif
+      if(pszName[0]!='.'){
+        str=pszName;
+        return true;
+      }
+    }
+    return false;
+  }
+  
+  // Start file iteration and return first file.
+bool CeCosTestUtils::StartSearch (void *&pHandle,String &str)
+  {
+#ifdef _WIN32
+    WIN32_FIND_DATA fd;
+    pHandle=(void *)FindFirstFile (_T("*.*"), &fd);
+    if(INVALID_HANDLE_VALUE==(HANDLE)pHandle){
+      ERROR(_T("Failed to open dir\n"));
+      return false;
+    } else if (fd.cFileName[0]=='.') {
+      return NextFile((HANDLE)pHandle,str);
+    } else {
+               str=String(fd.cFileName);
+      return true;
+    }
+#else // UNIX
+    pHandle=(void *)opendir(_T("."));
+    if(0==pHandle){
+      ERROR(_T("Failed to open dir\n"));
+      return false;
+    }
+    return NextFile(pHandle,str);
+#endif
+  }
+  
+  // End file iteration
+void CeCosTestUtils::EndSearch (void *&pHandle)
+  {
+#ifdef _WIN32
+    FindClose((HANDLE)pHandle);
+#else // UNIX
+    closedir((DIR *)pHandle);
+#endif
+}
+  
+
+// deal with common command-line  actions
+bool CeCosTestUtils::CommandLine(int &argc,TCHAR **argv,bool bRequireResourceServer)
+{
+  LPCTSTR psz=_tgetenv(_T("RESOURCESERVER"));
+  if(psz && !CTestResource::SetResourceServer(psz)){
+    _ftprintf(stderr,_T("Illegal host:port '%s' defined in RESOURCESERVER environment variable\n"),psz);
+    return false;
+  }
+  
+  for(int i=1;i<argc;i++){
+    if(_TCHAR('-')==*argv[i]){
+      if(0==_tcscmp(argv[i],_T("-v"))){
+        CeCosTrace::EnableTracing((CeCosTrace::TraceLevel)MAX(CeCosTrace::TracingEnabled(),CeCosTrace::TRACE_LEVEL_TRACE));
+        // Shuffle the command line down to remove that which we have just seen:
+        for(TCHAR **a=argv+i;(a[0]=a[1]);a++);
+        argc--;i--; // counteract the increment
+      } else if(0==_tcscmp(argv[i],_T("-V"))){
+        CeCosTrace::EnableTracing((CeCosTrace::TraceLevel)MAX(CeCosTrace::TracingEnabled(),CeCosTrace::TRACE_LEVEL_VTRACE));
+        // Shuffle the command line down to remove that which we have just seen:
+        for(TCHAR **a=argv+i;(a[0]=a[1]);a++);
+        argc--;i--; // counteract the increment
+      } else if(0==_tcscmp(argv[i],_T("-o"))){
+        if(i+1<argc){
+          if(!CeCosTrace::SetOutput(argv[i+1])){
+            _ftprintf(stderr,_T("Failed to direct output to %s\n"),argv[i+1]);
+          }
+          // Shuffle the command line down to remove that which we have just seen:
+          for(TCHAR **a=argv+i;(a[0]=a[2]);a++);
+          argc-=2;i-=2; // counteract the increment
+        } else {
+          return false;
+        }
+      } else if(0==_tcscmp(argv[i],_T("-O"))){
+        if(i+1<argc){
+          if(!CeCosTrace::SetError(argv[i+1])){
+            _ftprintf(stderr,_T("Failed to direct error to %s\n"),argv[i+1]);
+          }
+          // Shuffle the command line down to remove that which we have just seen:
+          for(TCHAR **a=argv+i;(a[0]=a[2]);a++);
+          argc-=2;i-=2; // counteract the increment
+        } else {
+          return false;
+        }
+      } else if(0==_tcscmp(argv[i],_T("-r"))){
+        if(i+1<argc){
+          if(!CTestResource::SetResourceServer(argv[i+1])){
+            _ftprintf(stderr,_T("Illegal host:port '%s'\n"),argv[i+1]);
+            return false;
+          }
+          // Shuffle the command line down to remove that which we have just seen:
+          for(TCHAR **a=argv+i;(a[0]=a[2]);a++);
+          argc-=2;i-=2; // counteract the increment
+        } else {
+          return false;
+        }
+      } else if(0==_tcscmp(argv[i],_T("-version"))){
+        const TCHAR *pszTail=_tcsrchr(argv[0],_TCHAR('/'));
+        if(0==pszTail){
+          pszTail=_tcsrchr(argv[0],_TCHAR('\\'));
+        }
+                       _tprintf (_T("%s %s (%s %s)\n"), (0==pszTail)?argv[0]:pszTail+1,ECOS_VERSION,  __DATE__, __TIME__);
+        exit(0);
+      } 
+    }
+  }
+
+  if(!CeCosSocket::Init() || !CeCosTestPlatform::Load()){
+    return false;
+  }
+
+#ifndef _WIN32
+  sigset_t mask;
+  
+  // Clean out all the signals
+  sigemptyset(&mask);
+  
+  // Add our sigpipe
+  sigaddset(&mask, SIGPIPE);
+  
+  sigprocmask(SIG_SETMASK, &mask, NULL);
+
+#endif
+
+  if(CTestResource::ResourceServerSet()){
+    if(CTestResource::Load()){
+      _ftprintf(stderr,_T("Connected to resource server %s\n"),(LPCTSTR)CTestResource::GetResourceServer());
+    } else {
+      _ftprintf(stderr,_T("Can't load from resource server %s\n"),(LPCTSTR)CTestResource::GetResourceServer());
+      return false;
+    }
+  } else if (bRequireResourceServer) {
+    _ftprintf(stderr,_T("You must specify a resource server using either the -r switch or by setting the RESOURCESERVER environment variable\n"));
+    return false;
+  }
+
+  return true;
+}
+
+void CeCosTestUtils::UsageMessage(bool bRequireResourceServer)
+{
+  _ftprintf(stderr,
+    _T("        -o file      : send standard output to named file\n")
+    _T("        -O file      : send standard error  to named file\n"));
+  if(bRequireResourceServer){
+    _ftprintf(stderr,
+    _T("        -r host:port : use this host:port as resourceserver [or set the RESOURCESERVER environment variable]\n")
+    );
+  }
+  _ftprintf(stderr,
+    _T("        -v           : vebose mode - trace to stderr\n")
+    _T("        -V           : very verbose mode - trace to stderr\n")
+    _T("        -version     : print a version string\n")
+  );
+}
+
+const String CeCosTestUtils::HomeFile (LPCTSTR pszFile)
+{
+  String strFile;
+#ifdef _WIN32
+  LPCTSTR psz=_tgetenv(_T("HOMEDRIVE"));
+  if(psz){
+    strFile=psz;
+    psz=_tgetenv(_T("HOMEPATH"));
+    if(psz){
+      strFile+=psz;
+    }
+    if(_TCHAR('\\')!=strFile[strFile.size()-1]){
+      strFile+=_TCHAR('\\');
+    }
+    strFile+=pszFile;
+  }
+#else // UNIX
+  LPCTSTR psz=_tgetenv(_T("HOME"));
+  if(psz){
+    strFile=psz;
+    strFile+=_TCHAR('/');
+    strFile+=pszFile;
+  }
+#endif
+  return strFile;
+}
+
+bool CeCosTestUtils::Exists(LPCTSTR pszFile)
+{
+  struct _stat buf;
+  return (0==_tstat(pszFile,&buf));
+}
+
+bool CeCosTestUtils::IsFile(LPCTSTR pszFile)
+{
+  struct _stat buf;
+  return 0==_tstat(pszFile,&buf) && 0==(S_IFDIR&buf.st_mode);
+}
+