Coverage Report

Created: 2026-08-13 06:41

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/pigeonhole/src/testsuite/cmd-test-set.c
Line
Count
Source
1
/* Copyright (c) Pigeonhole authors, see top-level COPYING file */
2
3
#include "lib.h"
4
#include "ioloop.h"
5
#include "str-sanitize.h"
6
#include "istream.h"
7
#include "istream-header-filter.h"
8
9
#include "sieve-common.h"
10
#include "sieve-commands.h"
11
#include "sieve-code.h"
12
#include "sieve-actions.h"
13
#include "sieve-validator.h"
14
#include "sieve-generator.h"
15
#include "sieve-interpreter.h"
16
#include "sieve-code-dumper.h"
17
#include "sieve-result.h"
18
19
#include "testsuite-common.h"
20
#include "testsuite-objects.h"
21
22
#include <stdio.h>
23
24
/*
25
   Test_set command
26
27
   Syntax
28
     test_set <testsuite object (member): string> <value: string>
29
 */
30
31
static bool
32
cmd_test_set_validate(struct sieve_validator *valdtr,
33
          struct sieve_command *cmd);
34
static bool
35
cmd_test_set_generate(const struct sieve_codegen_env *cgenv,
36
          struct sieve_command *cmd);
37
38
const struct sieve_command_def cmd_test_set = {
39
  .identifier = "test_set",
40
  .type = SCT_COMMAND,
41
  .positional_args = 2,
42
  .subtests = 0,
43
  .block_allowed = FALSE,
44
  .block_required = FALSE,
45
  .validate = cmd_test_set_validate,
46
  .generate = cmd_test_set_generate,
47
};
48
49
/*
50
 * Test_set operation
51
 */
52
53
static bool
54
cmd_test_set_operation_dump(const struct sieve_dumptime_env *denv,
55
          sieve_size_t *address);
56
static int
57
cmd_test_set_operation_execute(const struct sieve_runtime_env *renv,
58
             sieve_size_t *address);
59
60
const struct sieve_operation_def test_set_operation = {
61
  .mnemonic = "TEST_SET",
62
  .ext_def = &testsuite_extension,
63
  .code = TESTSUITE_OPERATION_TEST_SET,
64
  .dump = cmd_test_set_operation_dump,
65
  .execute = cmd_test_set_operation_execute,
66
};
67
68
/*
69
 * Validation
70
 */
71
72
static bool
73
cmd_test_set_validate(struct sieve_validator *valdtr, struct sieve_command *cmd)
74
0
{
75
0
  struct sieve_ast_argument *arg = cmd->first_positional;
76
77
  /* Check arguments */
78
79
0
  if (!sieve_validate_positional_argument(valdtr, cmd, arg, "object",
80
0
            1, SAAT_STRING))
81
0
    return FALSE;
82
0
  if (!testsuite_object_argument_activate(valdtr, arg, cmd))
83
0
    return FALSE;
84
85
0
  arg = sieve_ast_argument_next(arg);
86
87
0
  if (!sieve_validate_positional_argument(valdtr, cmd, arg, "value",
88
0
            2, SAAT_STRING))
89
0
    return FALSE;
90
0
  return sieve_validator_argument_activate(valdtr, cmd, arg, FALSE);
91
0
}
92
93
/*
94
 * Code generation
95
 */
96
97
static bool
98
cmd_test_set_generate(const struct sieve_codegen_env *cgenv,
99
          struct sieve_command *cmd)
100
0
{
101
0
  sieve_operation_emit(cgenv->sblock, cmd->ext, &test_set_operation);
102
103
  /* Generate arguments */
104
0
  return sieve_generate_arguments(cgenv, cmd, NULL);
105
0
}
106
107
/*
108
 * Code dump
109
 */
110
111
static bool
112
cmd_test_set_operation_dump(const struct sieve_dumptime_env *denv,
113
          sieve_size_t *address)
114
0
{
115
0
  sieve_code_dumpf(denv, "TEST SET:");
116
0
  sieve_code_descend(denv);
117
118
0
  return (testsuite_object_dump(denv, address) &&
119
0
    sieve_opr_string_dump(denv, address, "value"));
120
0
}
121
122
/*
123
 * Intepretation
124
 */
125
126
static int
127
cmd_test_set_operation_execute(const struct sieve_runtime_env *renv,
128
             sieve_size_t *address)
129
0
{
130
0
  struct testsuite_object tobj;
131
0
  string_t *value;
132
0
  int member_id;
133
0
  int ret;
134
135
0
  if (!testsuite_object_read_member(renv->sblock, address,
136
0
            &tobj, &member_id)) {
137
0
    sieve_runtime_trace_error(
138
0
      renv, "invalid testsuite object member");
139
0
    return SIEVE_EXEC_BIN_CORRUPT;
140
0
  }
141
142
0
  ret = sieve_opr_string_read(renv, address, "string", &value);
143
0
  if (ret <= 0)
144
0
    return ret;
145
146
0
  if (sieve_runtime_trace_active(renv, SIEVE_TRLVL_COMMANDS)) {
147
0
    sieve_runtime_trace(renv, 0, "testsuite: test_set command");
148
0
    sieve_runtime_trace_descend(renv);
149
0
    sieve_runtime_trace(renv, 0,
150
0
      "set test parameter '%s' = \"%s\"",
151
0
      testsuite_object_member_name(&tobj, member_id),
152
0
      str_c(value));
153
0
  }
154
155
0
  if (tobj.def == NULL || tobj.def->set_member == NULL) {
156
0
    sieve_runtime_trace_error(
157
0
      renv, "unimplemented testsuite object");
158
0
    return SIEVE_EXEC_FAILURE;
159
0
  }
160
161
0
  tobj.def->set_member(renv, member_id, value);
162
0
  return SIEVE_EXEC_OK;
163
0
}