Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Postfix/src/cleanup/   (Postfix Mailserver Version 3.11©)  Datei vom 23.0.2025 mit Größe 5 kB image not shown  

Quelle  cleanup_envelope_test.c

  Sprache: C
 


 /*
  * System library.
  */

#include <sys_defs.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

 /*
  * Utility library.
  */

#include <msg.h>
#include <msg_vstream.h>
#include <vstring.h>
#include <vstream.h>
#include <stringops.h>

 /*
  * Global library.
  */

#include <record.h>
#include <rec_type.h>
#include <cleanup_user.h>
#include <mail_params.h>
#include <smtputf8.h>

 /*
  * Application-specific.
  */

#include <cleanup.h>

 /*
  * Stubs for parameter dependencies.
  */

int     var_delay_warn_time = 0;
int     var_dup_filter_limit = DEF_DUP_FILTER_LIMIT;
char   *var_remote_rwr_domain = DEF_REM_RWR_DOMAIN;
int     var_qattr_count_limit = DEF_QATTR_COUNT_LIMIT;
VSTRING *cleanup_strip_chars = 0;
MILTERS *cleanup_milters = 0;
VSTRING *cleanup_trace_path = 0;
MAPS   *cleanup_virt_alias_maps = 0;
char   *cleanup_path = "fixed";

 /*
  * Stubs for cleanup_message.c dependencies. TODO(wietse) replace function
  * stubs with mocks that can have expectations and that can report
  * unexpected calls.
  */

void    cleanup_message(CLEANUP_STATE *state, int type, const char *buf,
           ssize_t len)
{
    msg_panic("cleanup_message");
}

 /*
  * Stubs for cleanup_milter.c dependencies.
  */

void    cleanup_milter_receive(CLEANUP_STATE *state, int count)
{
    msg_panic("cleanup_milter_receive");
}

void    cleanup_milter_emul_mail(CLEANUP_STATE *state, MILTERS *milters,
             const char *sender)
{
    msg_panic("cleanup_milter_emul_mail");
}

void    cleanup_milter_emul_rcpt(CLEANUP_STATE *state, MILTERS *milters,
             const char *recipient)
{
    msg_panic("cleanup_milter_emul_rcpt");
}

 /*
  * Stubs for cleanup_addr.c dependencies.
  */

off_t   cleanup_addr_sender(CLEANUP_STATE *state, const char *addr)
{
    msg_panic("cleanup_addr_sender");
}

void    cleanup_addr_recipient(CLEANUP_STATE *state, const char *addr)
{
    msg_panic("cleanup_addr_recipient");
}

 /*
  * Stubs for cleanup_region.c dependencies.
  */

void    cleanup_region_done(CLEANUP_STATE *state)
{
}

 /*
  * Tests and test cases.
  */

typedef struct TEST_CASE {
    const char *label;   /* identifies test case */
    int     (*action) (const struct TEST_CASE *);
} TEST_CASE;

#define PASS 1
#define FAIL 0

static int overrides_size_fields(const TEST_CASE *tp)
{

    /*
     * Generate one SIZE record test payload.
     */

    VSTRING *input_buf = vstring_alloc(100);

    vstring_sprintf(input_buf, REC_TYPE_SIZE_FORMAT,
      (REC_TYPE_SIZE_CAST1) ~ 0/* message segment size */
      (REC_TYPE_SIZE_CAST2) ~ 0/* content offset */
      (REC_TYPE_SIZE_CAST3) ~ 0/* recipient count */
      (REC_TYPE_SIZE_CAST4) ~ 0/* qmgr options */
      (REC_TYPE_SIZE_CAST5) ~ 0/* content length */
      (REC_TYPE_SIZE_CAST6) SOPT_FLAG_ALL); /* sendopts */

    /*
     * Instantiate CLEANUP_STATE, and save information that isn't expected to
     * change. We only need to save simple-type CLEANUP_STATE fields that
     * correspond with SIZE record fields.
     */

    CLEANUP_STATE *state = cleanup_state_alloc((VSTREAM *) 0);
    CLEANUP_STATE saved_state = *state;

    /*
     * Process the test SIZE record payload, clear some bits from the
     * sendopts field, and write an all-zeroes preliminary SIZE record.
     */

    if ((state->dst = vstream_fopen("/dev/null", O_WRONLY, 0)) == 0) {
 msg_warn("vstream_fopen(\"/dev/null\", O_WRONLY, 0): %m");
 return (FAIL);
    }
    cleanup_envelope(state, REC_TYPE_SIZE, vstring_str(input_buf),
       VSTRING_LEN(input_buf));
    if (state->errs != CLEANUP_STAT_OK) {
 msg_warn("cleanup_envelope: got: '%s', want: '%s'",
   cleanup_strerror(state->errs),
   cleanup_strerror(CLEANUP_STAT_OK));
 return (FAIL);
    }
    vstring_free(input_buf);
    input_buf = 0;
    (void) vstream_fclose(state->dst);
    state->dst = 0;

    /*
     * Compare the updated state against the expected content. We expect that
     * the fields for xtra_offset, data_offset, rcpt_count, qmgr_opts, and
     * cont_length, are consistent with the saved CLEANUP_STATE, and we
     * expect to see a specific value for the sendopts field that was
     * assigned in cleanup_envelope().
     */

    if (state->xtra_offset != saved_state.xtra_offset) {
 msg_warn("state->xtra_offset: got %ld, want: %ld",
   (long) state->xtra_offset, (long) saved_state.xtra_offset);
 return (FAIL);
    }
    if (state->data_offset != saved_state.data_offset) {
 msg_warn("state->data_offset: got %ld, want: %ld",
   (long) state->data_offset, (long) saved_state.data_offset);
 return (FAIL);
    }
    if (state->rcpt_count != saved_state.rcpt_count) {
 msg_warn("state->rcpt_count: got: %ld, want: %ld",
   (long) state->rcpt_count, (long) saved_state.rcpt_count);
 return (FAIL);
    }
    if (state->qmgr_opts != saved_state.qmgr_opts) {
 msg_warn("state=>qmgr_opts: got: %d, want: %d",
   state->qmgr_opts, saved_state.qmgr_opts);
 return (FAIL);
    }
    if (state->cont_length != saved_state.cont_length) {
 msg_warn("state->cont_length: got %ld, want: %ld",
   (long) state->cont_length, (long) saved_state.cont_length);
 return (FAIL);
    }
    if (state->sendopts != (SOPT_FLAG_ALL & ~SOPT_FLAG_DERIVED)) {
 msg_warn("state->sendopts: got: 0x%x, want: 0x%x",
   state->sendopts, SOPT_FLAG_ALL & ~SOPT_FLAG_DERIVED);
 return (FAIL);
    }

    /*
     * Cleanup.
     */

    cleanup_state_free(state);
    return (PASS);
}

static const TEST_CASE test_cases[] = {
    {"overrides_size_fields",
 overrides_size_fields,
    },
    {0},
};

int     main(int argc, char **argv)
{
    const TEST_CASE *tp;
    int     pass = 0;
    int     fail = 0;

    /* XXX How to avoid linking in mail_params.o? */
    var_line_limit = DEF_LINE_LIMIT;

    msg_vstream_init(sane_basename((VSTRING *) 0, argv[0]), VSTREAM_ERR);

    for (tp = test_cases; tp->label != 0; tp++) {
 msg_info("RUN  %s", tp->label);
 if (tp->action(tp) != PASS) {
     fail++;
     msg_info("FAIL %s", tp->label);
 } else {
     msg_info("PASS %s", tp->label);
     pass++;
 }
    }
    msg_info("PASS=%d FAIL=%d", pass, fail);
    exit(fail != 0);
}

Messung V0.5 in Prozent
C=76 H=94 G=85

¤ Dauer der Verarbeitung: 0.14 Sekunden  (vorverarbeitet am  2026-08-08) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.