Esempio n. 1
0
int main(void)
{
  INIT_TEST("DT_TEST");

  CHECK_TEST(test_sys_Init());
  CHECK_TEST(test_sys_Reboot());
  CHECK_TEST(test_sys_Destroy());
  return 0;
}
Esempio n. 2
0
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ScalingFunction::ScalingFunction(const Signal &sig) : s(&sig) {
  TRACER_CALL(t,"ScalingFunction::ScalingFunction");
  int sf=s->firstIndex();
  int len=s->length();
#ifdef DEBUG
//for (int n=s->firstIndex();n<=s->lastIndex();n++) {
//  cout << "\ts[ " << n << " ] = " << s->value(n) << endl;
//}
  double summ=0.;
  double sumr=0.;
  for (int n=s->firstIndex();n<=s->lastIndex();n++) {
    double svn=s->value(n);
    summ+=svn;
    if (n%2!=0) svn=-svn;
    sumr+= svn;
  }
  CHECK_TEST(abs(summ-1.)<512.*DBL_EPSILON);
  CHECK_TEST(abs(sumr)<512.*DBL_EPSILON);
#endif
  SquareMatrix<double,double> M(len-1,0.);
  Vector<double,double> b(len-1,1.);
  double eigvalue=1.+DBL_EPSILON;
  for (int i=0;i<len-1;i++) {
    int jlo=max(2*i-len+1,0);
    int jhi=min(2*i,len-2);
    for (int j=jlo;j<=jhi;j++) M(i,j)=2.*s->value(2*i-j+sf);
    M(i,i)-=eigvalue;
  }
#ifdef DEBUG
//for (int i=0;i<len-1;i++) {
//  cout << "\tM[ " << i << " , * ] = ";
//  for (int j=0;j<len-1;j++) {
//    cout << M(i,j) << " ";
//  }
//  cout << endl;
//}
#endif
  values_at_integers=OPERATOR_NEW Vector<double,double>(len-1);
  M.solve(b,*values_at_integers);
  double sum=0.;
  double big=-HUGE_VAL;
  for (int n=0;n<len-1;n++) {
    double vain=(*values_at_integers)[n];
    sum+=(*values_at_integers)[n];
    big=max(big,abs(vain));
  }
  if (abs(sum)>=sqrt(DBL_EPSILON)*big) values_at_integers->scal(1./sum);
  else values_at_integers->scal(1./big);
#ifdef DEBUG
  for (int n=0;n<len-1;n++) {
    cout << "\tvalues_at_integers[ " << n+s->firstIndex() << " ] = "
         << (*values_at_integers)[n] << endl;
  }
#endif
}
Esempio n. 3
0
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
void Filter::addUpsampleAndOperateOn(const Signal &s,Signal &r) const {
//TRACER_CALL(t,"Filter::addUpsampleAndOperateOn");
#ifdef DEBUG
//cout << "\ts = " << s.firstIndex() << " " << s.lastIndex() << endl;
//cout << "\tr = " << r.firstIndex() << " " << r.lastIndex() << endl;
#endif
  int signal_start=s.firstIndex();
  int signal_finish=s.lastIndex();
  int impulse_start=impulse_response->firstIndex();
  int impulse_finish=impulse_response->lastIndex();
  int result_start=impulse_start+2*signal_start;
  int result_finish=impulse_finish+2*signal_finish;
#ifdef DEBUG
//cout << "\timpulse = " << impulse_start << " " << impulse_finish << endl;
//cout << "\tresult = " << result_start << " " << result_finish << endl;
#endif
  CHECK_TEST(result_start>=r.firstIndex());
  CHECK_TEST(result_finish<=r.lastIndex());
#ifdef DEBUG
//for (int n=impulse_response->firstIndex();
//n<=impulse_response->lastIndex();n++) {
//  cout << "\timpulse_response[ " << n << "] = "
//       << impulse_response->value(n) << endl;
//}
//for (int n=s.firstIndex();n<=s.lastIndex();n++) {
//  cout << "\ts[ " << n << "] = " << s.value(n) << endl;
//  cout << "\tn = " << n << endl;
//}
//for (int n=r.firstIndex();n<=r.lastIndex();n++) {
//  cout << "\tr[ " << n << "] = " << r.value(n) << endl;
//}
#endif

  for (int n=result_start;n<=result_finish;n++) {
    double sum=0.;
    int m_start=max(signal_start,(n-impulse_finish)/2);
    if (2*m_start<n-impulse_finish) m_start++;
    int m_finish=min(signal_finish,(n-impulse_start)/2);
    if (2*m_finish>n-impulse_start) m_finish--;
    for (int m=m_start;m<=m_finish;m++) {
      sum+=s.value(m)*impulse_response->value(n-2*m);
    }
    r.value(n)+=sum;
  }
#ifdef DEBUG
//for (int n=r.firstIndex();n<=r.lastIndex();n++) {
//  cout << "\tr[ " << n << "] = " << r.value(n) << endl;
//}
#endif
}
Esempio n. 4
0
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
NumPtr<double>* ScalingFunction::values(int scale) const {
//TRACER_CALL(t,"ScalingFunction::values");
#ifdef DEBUG
//for (int n=s->firstIndex();n<=s->lastIndex();n++) {
//  cout << "\ts[ " << n << "] = " << s->value(n) << endl;
//}
//for (int n=0;n<values_at_integers->size();n++) {
//  cout << "\tvalues_at_integers[ " << n << "] = "
//       << (*values_at_integers)[n] << endl;
//}
#endif
  CHECK_TEST(scale>=1);
  int twotoscale=pow(2,scale);
  int inc=twotoscale;
  int sf=s->firstIndex();
  int len=s->length();
  int vai_len=len-1;
  NumPtr<double> *v=OPERATOR_NEW NumPtr<double>(vai_len*twotoscale);
  int vlen=v->getNumber();
  for (int n=0;n<vai_len;n++) (*v)[n*inc]=(*values_at_integers)[n];
#ifdef DEBUG
//for (int n=0;n<v->getNumber();n+=inc) {
//  cout << "\tv[ " << n << " ] = " << (*v)[n] << endl;
//}
//cout << endl;
#endif
  for (int j=1;j<=scale;j++) {
    inc /= 2;
#ifdef DEBUG
//  cout << "\n\n\tj,inc = " << j << " " << inc << endl;
#endif
    for (int n=1;n<vlen/inc;n+=2) {
      int twon=2*n;
      double sum=0.;
#ifdef DEBUG
//    cout << "\n\tn = " << n << endl;
#endif
      for (int m=0;m<len;m++) {
        int mm=twon*inc-m*twotoscale;
        if (mm>=0 && mm<vlen) {
#ifdef DEBUG
//        cout << "\tm,s[" << m + sf << "],v[" << twon*inc-m*twotoscale
//             << "] = " << m << " " << s->value(m+sf) << " " << (*v)[mm]
//             << endl;
#endif
          sum+=s->value(m+sf)*(*v)[mm];
        }
      }
      (*v)[n*inc]=2.*sum;
    }
#ifdef DEBUG
//  for (int nn=0;nn<vlen;nn+=inc) {
//    cout << "\tv[ " << nn << " ] = " << (*v)[nn] << endl;
//  }
//  cout << endl;
#endif
  }
  return v;
}
Esempio n. 5
0
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
void Filter::operateOn(const Signal &s,Signal &r) const {
//TRACER_CALL(t,"Filter::operateOn");
  int signal_start=s.firstIndex();
  int signal_finish=s.lastIndex();
  int impulse_start=impulse_response->firstIndex();
  int impulse_finish=impulse_response->lastIndex();
  int result_start=signal_start+impulse_start;
  int result_finish=signal_finish+impulse_finish;
  CHECK_TEST(result_start>=r.firstIndex());
  CHECK_TEST(result_finish<=r.lastIndex());

  for (int n=result_start;n<=result_finish;n++) {
    double sum=0.;
    int m_start=max(signal_start,n-impulse_finish);
    int m_finish=min(signal_finish,n-impulse_start);
    for (int m=m_start;m<=m_finish;m++) {
      sum+=s.value(m)*impulse_response->value(n-m);
    }
    r.value(n)=sum;
  }
}
Esempio n. 6
0
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
void Filter::operateOnAndDownsample(const Signal &s,Signal &r) const {
//TRACER_CALL(t,"Filter::operateOnAndDownsample");
  int signal_start=s.firstIndex();
  int signal_finish=s.lastIndex();
  int impulse_start=impulse_response->firstIndex();
  int impulse_finish=impulse_response->lastIndex();
  int result_start=(signal_start+impulse_start)/2;
  int result_finish=(signal_finish+impulse_finish)/2;
  CHECK_TEST(result_start>=r.firstIndex());
  CHECK_TEST(result_finish<=r.lastIndex());
#ifdef DEBUG
//for (int n=impulse_response->firstIndex();
//n<=impulse_response->lastIndex();n++) {
//  cout << "\timpulse_response[ " << n << "] = "
//       << impulse_response->value(n) << endl;
//}
//for (int n=s.firstIndex();n<=s.lastIndex();n++) {
//  cout << "\ts[ " << n << "] = " << s.value(n) << endl;
//}
#endif

  for (int n=result_start;n<=result_finish;n++) {
    double sum=0.;
    int m_start=max(signal_start,2*n-impulse_finish);
    int m_finish=min(signal_finish,2*n-impulse_start);
#ifdef DEBUG
//  cout << "\tn,m_start,m_finish = " << n << " " << m_start << " "
//       << m_finish << endl;
#endif
    for (int m=m_start;m<=m_finish;m++) {
      sum+=s.value(m)*impulse_response->value(2*n-m);
    }
    r.value(n)=sum;
  }
#ifdef DEBUG
//for (int n=r.firstIndex();n<=r.lastIndex();n++) {
//  cout << "\tr[ " << n << "] = " << r.value(n) << endl;
//}
#endif
}
Esempio n. 7
0
int main(void)
{
  swi_sms_regId_t regId;

  INIT_TEST("SMS_TEST");
  CHECK_TEST(test_sms_Init());

  CHECK_TEST(test_sms_Register((swi_sms_ReceptionCB_t)sms_handler, PHONE_NUMBER, MESSAGE, &regId));
  CHECK_TEST(test_sms_Unregister(regId));

  CHECK_TEST(test_sms_Register((swi_sms_ReceptionCB_t)sms_handler, NULL, NULL, &regId));
  CHECK_TEST(test_sms_Unregister(regId));

  CHECK_TEST(test_sms_Register_failure());
  CHECK_TEST(test_sms_Unregister_failure());

  CHECK_TEST(test_sms_Send(PHONE_NUMBER, MESSAGE, SWI_SMS_8BITS));
  CHECK_TEST(test_sms_Destroy());
  return 0;
}
Esempio n. 8
0
int main(void)
{
  swi_dt_regId_t regId = NULL;

  INIT_TEST("DT_TEST");

  CHECK_TEST(test_dt_Init());
  CHECK_TEST(test_dt_Init());

  CHECK_TEST(test_dt_Register(&regId));
  CHECK_TEST(test_dt_Set());

  while(waitingForNotification)
    ;

  CHECK_TEST(test_dt_Get());
  CHECK_TEST(test_dt_MultipleGet());
  CHECK_TEST(test_dt_Unregister(regId));
  CHECK_TEST(test_dt_SetTypes());

  CHECK_TEST(test_dt_Destroy());
  CHECK_TEST(test_dt_Destroy());
  return 0;
}
Esempio n. 9
0
int main(void)
{
  INIT_TEST("EMP_TEST");

  setenv("SWI_EMP_SERVER_PORT", "1234", 1);
  setenv("SWI_EMP_CMD_TIMEOUT", "2", 1);
  setenv("SWI_EMP_RETRY_IPC_BROKEN", "2", 1);
  setenv("SWI_EMP_TIMEOUT_IPC_BROKEN", "2", 1);

  CHECK_TEST(emp_init());
  CHECK_TEST(emp_destroy());
  CHECK_TEST(emp_init_with_callbacks());
  CHECK_TEST(emp_start_mt_cmd());
  CHECK_TEST(emp_trigger_response_timeout());

  while (cb_invoked == 0)
    usleep(1000 * 5); // 5ms

  CHECK_TEST(emp_reconnecting());
  CHECK_TEST(emp_stop_mt_cmd());
  CHECK_TEST(emp_fail_reconnecting());
  CHECK_TEST(emp_destroy());
  return 0;
}
Esempio n. 10
0
    /// Perform actual tests
    template<class Array> bool runTestForArray(Array& a) {
      // Test/problem information.
      const char* test    = "NONE";
      const char* problem = "NONE";
      // Constant reference to the array
      const Array& const_a = a;

      START_TEST("Iteration");
      {
        typedef typename Array::reference reference;
        typedef typename Array::pointer pointer;
        typedef typename Array::iterator iterator;
        const iterator begin = a.begin(), end = a.end();
        CHECK_TEST(end-begin==a.size(),"Distance != size");
        int index = 0;
        iterator iter = begin;
        for(; iter != end; ++iter, ++index) {
          reference ref = *iter;
          const pointer ptr = &ref;
          CHECK_TEST(ptr==&a[index],"Iterator points to the wrong element (going forward)");
        }
        CHECK_TEST(index==a.size(),"Iteration covered the wrong number of elements (going forward)");
        for(; iter != begin; --iter, --index) {
          reference ref = *(iter-1);
          const pointer ptr = &ref;
          CHECK_TEST(ptr==&a[index-1],"Iterator points to the wrong element (going backwards)");
        }
        CHECK_TEST(index==0,"Iteration covered the wrong number of elements (going backward)");
      }
      START_TEST("Read-only iteration");
      {
        typedef typename Array::const_reference reference;
        typedef typename Array::const_pointer pointer;
        typedef typename Array::const_iterator iterator;
        const iterator begin = const_a.begin(), end = const_a.end();
        CHECK_TEST(end-begin==const_a.size(),"Distance != size");
        int index = 0;
        iterator iter = begin;
        for(; iter != end; ++iter, ++index) {
          reference ref = *iter;
          const pointer ptr = &ref;
          CHECK_TEST(ptr==&const_a[index],"Iterator points to the wrong element (going forward)");
        }
        CHECK_TEST(index==const_a.size(),"Iteration covered the wrong number of elements (going forward)");
        for(; iter != begin; --iter, --index) {
          reference ref = *(iter-1);
          const pointer ptr = &ref;
          CHECK_TEST(ptr==&const_a[index-1],"Iterator points to the wrong element (going backwards)");
        }
        CHECK_TEST(index==0,"Iteration covered the wrong number of elements (going backward)");
      }

      START_TEST("Reverse iteration");
      {
        typedef typename Array::reference reference;
        typedef typename Array::pointer pointer;
        typedef typename Array::reverse_iterator iterator;
        const iterator begin = a.rbegin(), end = a.rend();
        CHECK_TEST(end-begin==a.size(),"Distance != size");
        int index = a.size();
        iterator iter = begin;
        for(; iter != end; ++iter, --index) {
          reference ref = *iter;
          const pointer ptr = &ref;
          CHECK_TEST(ptr==&a[index-1],"Iterator points to the wrong element (going forward)");
        }
        CHECK_TEST(index==0,"Iteration covered the wrong number of elements (going forward)");
        for(; iter != begin; --iter, ++index) {
          reference ref = *(iter-1);
          const pointer ptr = &ref;
          CHECK_TEST(ptr==&a[index],"Iterator points to the wrong element (going backwards)");
        }
        CHECK_TEST(index==a.size(),"Iteration covered the wrong number of elements (going backward)");
      }

      START_TEST("Reverse read-only iteration");
      {
        typedef typename Array::const_reference reference;
        typedef typename Array::const_pointer pointer;
        typedef typename Array::const_reverse_iterator iterator;
        const iterator begin = const_a.rbegin(), end = const_a.rend();
        CHECK_TEST(end-begin==const_a.size(),"Distance != size");
        int index = a.size();
        iterator iter = begin;
        for(; iter != end; ++iter, --index) {
          reference ref = *iter;
          const pointer ptr = &ref;
          CHECK_TEST(ptr==&const_a[index-1],"Iterator points to the wrong element (going forward)");
        }
        CHECK_TEST(index==0,"Iteration covered the wrong number of elements (going forward)");
        for(; iter != begin; --iter, ++index) {
          reference ref = *(iter-1);
          const pointer ptr = &ref;
          CHECK_TEST(ptr==&const_a[index],"Iterator points to the wrong element (going backwards)");
        }
        CHECK_TEST(index==a.size(),"Iteration covered the wrong number of elements (going backward)");
      }

      return true;
    failed:
      if (opt.log)
        olog << "FAILURE" << std::endl
        << ind(1) << "Test:       " << test << std::endl
        << ind(1) << "Problem:    " << problem << std::endl;
      return false;
    }
Esempio n. 11
0
int main(int argc, char *argv[])
{
    INIT_TEST("AV_TEST");
//  swi_log_setlevel(DEBUG, "AV", NULL );

    CHECK_TEST(test_1_Init_Destroy());
    CHECK_TEST(test_2_TriggerPolicy());
    CHECK_TEST(test_3_ConnectToServer());
    CHECK_TEST(test_4_asset_Create_Start_Destroy());
    CHECK_TEST(test_5_asset_pushData());
    CHECK_TEST(test_6_Acknowledge());
    CHECK_TEST(test_7_path_utils());
    CHECK_TEST(test_8_UpdateNotification());
    CHECK_TEST(test_9_TableManipulation());
    CHECK_TEST(test_10_asset_receiveDataWriting());
    CHECK_TEST(test_11_asset_receiveDataWritingList());
    CHECK_TEST(test_12_asset_receiveDataCommandList());

//preventive clean if one previous test failed
//  swi_av_Destroy();

    return 0;
}
Esempio n. 12
0
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
SplineFilterBank::SplineFilterBank(int N,int L) {
  TRACER_CALL(t,"SplineFilterBank::SplineFilterBank");
  CHECK_TEST(N>=1);
  CHECK_TEST(L>=1);
  if ((N+L)%2==1) L++;
  int M=(N+L)/2;

  lowpass=OPERATOR_NEW Filter(0,N);

  BinomialCoefficient bc(max(max(N,L),2*M-2));
  double two_power=pow(.5,N);
  for (int n=0;n<=N;n++) lowpass->value(n)=two_power*bc.value(N,n);
#ifdef DEBUG
  for (int n=lowpass->firstIndex();n<=lowpass->lastIndex();n++) {
    cout << "\tlowpass[" << n << "] = " << lowpass->value(n) << endl;
  }
#endif

  Signal alpha(0,L);
  two_power=pow(.5,L);
  for (int n=0;n<=L;n++) alpha.value(n)=two_power*bc.value(L,n);
  alpha.shift((L-N)/2);

  Filter beta_filter(1-M,M-1);
  for (int n=0;n<M;n++) {
    double sum=0.;
    for (int m=n;m<M;m++) {
      int twom=2*m;
      sum+=bc.value(M+m-1,m)*bc.value(twom,m-n)*pow(.5,twom);
    }
    if (n%2 != 0) sum=-sum;
    beta_filter.value(n)=sum;
    beta_filter.value(-n)=sum;
  }
#ifdef DEBUG
  for (int n=beta_filter.firstIndex();n<=beta_filter.lastIndex();n++) {
    cout << "\tbeta[" << n << "] = " << beta_filter.value(n) << endl;
  }
#endif

  dual_lowpass=OPERATOR_NEW Filter(
    alpha.firstIndex()+beta_filter.firstIndex(),
    alpha.lastIndex()+beta_filter.lastIndex());
  beta_filter.operateOn(alpha,dual_lowpass->impulseResponse());
  dual_lowpass->replaceWithAdjoint();
#ifdef DEBUG
  for (int n=dual_lowpass->firstIndex();n<=dual_lowpass->lastIndex();n++) {
    cout << "\tdual_lowpass[" << n << "] = " << dual_lowpass->value(n)
      << endl;
  }
#endif

  highpass=OPERATOR_NEW Filter(*dual_lowpass);
  highpass->impulseResponse().shift(dual_lowpass->firstIndex());
  highpass->impulseResponse().reverse();
#ifdef DEBUG
  for (int n=highpass->firstIndex();n<=highpass->lastIndex();n++) {
    cout << "\thighpass[" << n << "] = " << highpass->value(n)
      << endl;
  }
#endif

  dual_highpass=OPERATOR_NEW Filter(*lowpass);
  dual_highpass->impulseResponse().shift(2*N-1);
  dual_highpass->impulseResponse().reverse();
#ifdef DEBUG
  for (int n=dual_highpass->firstIndex();n<=dual_highpass->lastIndex();n++)
  {
    cout << "\tdual_highpass[" << n << "] = " << dual_highpass->value(n)
      << endl;
  }
#endif
}
Esempio n. 13
0
/*===========================================================================*
 *				    main				     *
 *===========================================================================*/
int main(int argc, char **argv)
{
	endpoint_t ep_self, ep_child;
	size_t size = BUF_SIZE;
	int i, r, pid;
	int status;

	/* SEF local startup. */
	env_setargs(argc, argv);
	sef_local_startup();

	/* Prepare work. */
	buf = (char*) CLICK_CEIL(buf_buf);
	fid_get = open(FIFO_GRANTOR, O_RDONLY);
	fid_send = open(FIFO_REQUESTOR, O_WRONLY);
	if(fid_get < 0 || fid_send < 0) {
		printf("REQUESTOR: can't open fifo files.\n");
		return 1;
	}

	/* Send the endpoint to the granter, in order to let him to
	 * create the grant.
	 */
	ep_self = getprocnr();
	write(fid_send, &ep_self, sizeof(ep_self));
	dprint("REQUESTOR: sending my endpoint: %d\n", ep_self);

	/* Get the granter's endpoint and gid. */
	read(fid_get, &ep_granter, sizeof(ep_granter));
	read(fid_get, &gid, sizeof(gid));
	dprint("REQUESTOR: getting granter's endpoint %d and gid %d\n",
		ep_granter, gid);

	/* Test MAP. */
	FIFO_WAIT(fid_get);
	r = sys_safemap(ep_granter, gid, 0, (long)buf, size, 1);
	if(r != OK) {
		printf("REQUESTOR: error in sys_safemap: %d\n", r);
		return 1;
	}
	CHECK_TEST("REQUESTOR", buf[0], BUF_START_GRANTOR, "MAP");
	buf[0] = BUF_START_REQUESTOR;
	r = sys_safeunmap((long)buf);
	if(r != OK) {
		printf("REQUESTOR: error in sys_safeunmap: %d\n", r);
		return 1;
	}
	FIFO_NOTIFY(fid_send);

	/* Test UNMAP. */
	FIFO_WAIT(fid_get);
	CHECK_TEST("REQUESTOR", buf[0], BUF_START_REQUESTOR, "UNMAP");
	r = sys_safemap(ep_granter, gid, 0, (long)buf, size, 1);
	if(r != 0) {
		printf("REQUESTOR: error in sys_safemap: %d\n", r);
		return 1;
	}
	FIFO_NOTIFY(fid_send);

	/* Test REVOKE. */
	FIFO_WAIT(fid_get);
	CHECK_TEST("REQUESTOR", buf[0], BUF_START_GRANTOR, "REVOKE");
	buf[0] = BUF_START_REQUESTOR;
	FIFO_NOTIFY(fid_send);

	/* Test SMAP_COW. */
	FIFO_WAIT(fid_get);
	r = sys_safemap(ep_granter, gid, 0, (long)buf, size, 1);
	if(r != OK) {
		printf("REQUESTOR: error in sys_safemap: %d\n", r);
		return 1;
	}
	buf[0] = BUF_START_REQUESTOR;
	pid = fork();
	if(pid < 0) {
		printf("REQUESTOR: error in fork\n");
		return 1;
	}
	if(pid == 0) {
		exit(buf[0] != BUF_START_REQUESTOR);
	}
	FIFO_NOTIFY(fid_send);
	FIFO_WAIT(fid_get);
	ep_child = getnprocnr(pid);
	if ((r = sys_privctl(ep_child, SYS_PRIV_SET_USER, NULL)) != OK) {
		printf("REQUESTOR: unable to set privileges: %d\n", r);
		return 1;
	}
	if ((r = sys_privctl(ep_child, SYS_PRIV_ALLOW, NULL)) != OK) {
		printf("REQUESTOR: child process can't run: %d\n", r);
		return 1;
	}
	wait(&status);
	FIFO_NOTIFY(fid_send);
	CHECK_TEST("REQUESTOR", buf[0], BUF_START_GRANTOR, "SMAP_COW");
	CHECK_TEST("REQUESTOR", 1, WIFEXITED(status)
		&& (WEXITSTATUS(status) == 0), "SMAP_COW child");

	/* Test COW_SMAP. */
	FIFO_WAIT(fid_get);
	buf[0] = BUF_START_REQUESTOR;
	r = sys_safemap(ep_granter, gid, 0, (long)buf, size, 1);
	if(r != OK) {
		printf("REQUESTOR: error in sys_safemap: %d\n", r);
		return 1;
	}
	FIFO_NOTIFY(fid_send);
	FIFO_WAIT(fid_get);
	CHECK_TEST("REQUESTOR", buf[0], BUF_START_GRANTOR+1, "COW_SMAP");

	/* Test COW_SMAP2 (with COW safecopy). */
	FIFO_WAIT(fid_get);
	buf[0] = BUF_START_REQUESTOR;
	r = sys_safecopyto(ep_granter, gid, 0, (long)buf, size);
	if(r != OK) {
		printf("REQUESTOR: error in sys_safecopyto: %d\n", r);
		return 1;
	}
	r = sys_safemap(ep_granter, gid, 0, (long)buf, size, 1);
	if(r != OK) {
		printf("REQUESTOR: error in sys_safemap: %d\n", r);
		return 1;
	}
	FIFO_NOTIFY(fid_send);
	CHECK_TEST("REQUESTOR", buf[0], BUF_START_REQUESTOR, "COW_SMAP2");

	return 0;
}