]> git.pond.sub.org Git - empserver/commitdiff
tests: New test-suite-only command __cmd
authorMarkus Armbruster <armbru@pond.sub.org>
Mon, 13 Jan 2014 20:27:16 +0000 (21:27 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 19 Jan 2014 09:16:24 +0000 (10:16 +0100)
Adding or removing a command to/from a test has unfortunate effects:

* Before the previous commit: if the command consumes pseudorandom
  numbers, all subsequent users of pseudorandom numbers get different
  ones.  This has always been a major headache.

* Since the previous commit: all subsequent users of pseudorandom
  numbers get different ones whether the command consumes any or not.
  That's even worse.

* If the command uses BTUs, subsequent prompts are changed.  Not
  nearly as bad as the above, but still annoying.

Create a new command __cmd to allow compensating for adding/removing
commands for tests.  Throw in the ability to compensate treasury
changes for good measure.  Three arguments: command count, BTU use,
money use.

Usage example: say you add a convert command to a test, and it uses 3
BTUs and $15.  Then you compensate by adding "__cmd added 1 3 15"
right after it.

The command must not be available unless running_test_suite is on, of
course.  Make it require the new player command capability TESTING,
and give that to all players when running_test_suite is on.

The command is intentionally not documented in info.  Switch
running_test_suite off for info-test, to hide it (and any future
TESTING commands) from info-test.

Suppress the command counter increment for TESTING commands, so they
can be used without upsetting pseudorandom numbers

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
include/player.h
include/testing.h [new file with mode: 0644]
src/lib/commands/testing.c [new file with mode: 0644]
src/lib/player/dispatch.c
src/lib/player/empmod.c
src/lib/player/init_nats.c
tests/info-test
tests/smoke/00/01-1
tests/smoke/journal.log

index 64eb09fe780edf09b70039d0be5a0ec2e89b9879..ddd26d6de51cedd9fdb2ede4e89bca96cf132c84 100644 (file)
@@ -29,7 +29,7 @@
  *  Known contributors to this file:
  *     Dave Pare, 1994
  *     Doug Hay, 1998
- *     Markus Armbruster, 2005-2012
+ *     Markus Armbruster, 2005-2014
  */
 
 #ifndef PLAYER_H
@@ -46,6 +46,7 @@
 #define SANCT  bit(1)  /* can execute commands available in sanctuary */
 #define NORM   bit(2)  /* can execute active player commands */
 #define GOD    bit(3)  /* can execute deity commands */
+#define TESTING        bit(4)  /* can execute commands meant for test suite */
 #define EXEC   bit(5)  /* can execute the execute command */
 #define CAP    bit(6)  /* has capital */
 #define MONEY  bit(7)  /* isn't broke */
diff --git a/include/testing.h b/include/testing.h
new file mode 100644 (file)
index 0000000..eaa4f0e
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ *  Empire - A multi-player, client/server Internet based war game.
+ *  Copyright (C) 1986-2014, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *                Ken Stevens, Steve McClure, Markus Armbruster
+ *
+ *  Empire 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ *  ---
+ *
+ *  See files README, COPYING and CREDITS in the root of the source
+ *  tree for related information and legal notices.  It is expected
+ *  that future projects/authors will amend these files as needed.
+ *
+ *  ---
+ *
+ *  testing.h: Test suite support
+ *
+ *  Known contributors to this file:
+ *     Markus Armbruster, 2014
+ */
+
+#ifndef TESTING_H
+#define TESTING_H
+
+extern int test_suite_prng_seed;
+
+/* Commands for test suite use */
+int testing_cmd(void);
+
+#endif
diff --git a/src/lib/commands/testing.c b/src/lib/commands/testing.c
new file mode 100644 (file)
index 0000000..6469d4f
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ *  Empire - A multi-player, client/server Internet based war game.
+ *  Copyright (C) 1986-2014, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *                Ken Stevens, Steve McClure, Markus Armbruster
+ *
+ *  Empire 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ *  ---
+ *
+ *  See files README, COPYING and CREDITS in the root of the source
+ *  tree for related information and legal notices.  It is expected
+ *  that future projects/authors will amend these files as needed.
+ *
+ *  ---
+ *
+ *  testing.c: Commands for test-suite use
+ *
+ *  Known contributors to this file:
+ *     Markus Armbruster, 2014
+ */
+
+#include <config.h>
+
+#include "chance.h"
+#include "commands.h"
+#include "testing.h"
+
+int
+testing_cmd(void)
+{
+    char *p;
+    char buf[1024];
+
+    p = getstarg(player->argp[1], "? ", buf);
+    if (!p)
+       return RET_SYN;
+    if (!strcmp(p, "added")) {
+       p = getstarg(player->argp[2], "number? ", buf);
+       test_suite_prng_seed -= strtol(p, NULL, 10);
+       p = getstarg(player->argp[3], "BTUs? ", buf);
+       player->btused -= strtol(p, NULL, 10);
+       p = getstarg(player->argp[4], "money? ", buf);
+       player->dolcost -= strtod(p, NULL);
+       return RET_OK;
+    }
+    return RET_SYN;
+}
index 681156e1f5026c6412ff8e65c704f218e3f903b7..50379b48b1aa4e90cc242f7581e734a5370052cd 100644 (file)
@@ -46,6 +46,7 @@
 #include "player.h"
 #include "prototypes.h"
 #include "server.h"
+#include "testing.h"
 
 /*
  * Last command's PRNG seed.
@@ -101,9 +102,12 @@ dispatch(char *buf, char *redir)
      * When running the test suite, reseed PRNG for each command with
      * a counter, to keep results stable even when the number of PRNs
      * consumed changes.
+     * Tests can adjust the counter with "__cmd added ...", to
+     * keep the results stable when commands are inserted or deleted.
      */
+    test_suite_prng_seed += !(command->c_permit & TESTING);
     if (running_test_suite)
-       seed_prng(++test_suite_prng_seed);
+       seed_prng(test_suite_prng_seed);
 
     if (redir) {
        prredir(redir);
index 578ccf348dfcd6568e6e87286b4bb9386da6e8a5..c89896cd3449376e2d569462638c9fa274842dfd 100644 (file)
@@ -32,7 +32,7 @@
  *     Thomas Ruschak, 1992
  *     Ken Stevens, 1995
  *     Steve McClure, 1996-2000
- *     Markus Armbruster, 2004-2013
+ *     Markus Armbruster, 2004-2014
  */
 
 /*
@@ -46,6 +46,7 @@
 #include "com.h"
 #include "player.h"
 #include "prototypes.h"
+#include "testing.h"
 
 struct cmndstr player_coms[] = {
 /*  command form                       cost    addr    permit */
@@ -282,5 +283,6 @@ struct cmndstr player_coms[] = {
     {"work <LAND UNITS> <AMOUNT>", 1, work, C_MOD, NORM + MONEY + CAP},
     {"xdump [\"meta\"] <TYPE> [<RECORDS>]", 0, xdump, 0, 0},
     {"zdone <y|n|c>", 0, zdon, C_MOD, NORM},
+    {"__cmd \"added\" <NUM> <NUM> <NUM>", 0, testing_cmd, 0, TESTING},
     {NULL, 0, NULL, 0, 0}
 };
index bc054f7020025cf9a3b1343574aed79690c14b83..705229be4fdd2f28a9ba0b25cec3285b9e5e75e2 100644 (file)
@@ -29,7 +29,7 @@
  *  Known contributors to this file:
  *     Dave Pare, 1994
  *     Steve McClure, 2000
- *     Markus Armbruster, 2007-2012
+ *     Markus Armbruster, 2007-2014
  */
 
 #include <config.h>
@@ -81,6 +81,8 @@ player_set_nstat(struct player *pl, struct natstr *np)
        pl->nstat |= MONEY;
     if (np->nat_stat == STAT_ACTIVE && !influx(np))
        pl->nstat |= CAP;
+    if (running_test_suite)
+       pl->nstat |= TESTING;
     pl->nstat |= EXEC;
     return pl->nstat;
 }
index 09940f7e531331c60ad3d02f6cb752f64590d87a..8544b20e3b0a3f4a2d4cc03f219c27ad6d4f6807 100755 (executable)
@@ -10,6 +10,10 @@ srcdir="$1"
 . "$srcdir"/tests/test-common.sh
 
 create_sandbox
+# Suppress test-only commands:
+cat >>sandbox/etc/empire/econfig <<EOF
+running_test_suite 0
+EOF
 
 # begin_test warns POSIX isn't expected to work, because thread
 # scheduling isn't reliably deterministic.  Not an issue for this
index 163bcd8ec9bb80bc787d09a13cf8c214d9e00d61..b8681fa84343f5d932cc4a1d27639c2d6b5d7ef3 100644 (file)
@@ -1,3 +1,5 @@
+__cmd added -1 -2 -101
+__cmd added 1 2 101
 xdump sect 0,0
 break
 expl c 0,0 1 uh
index d067c67d2598c2f2705545e28e124d50dcea62f7..3fa0daa13fceedb928903fd1b2d7a5d86be45060 100644 (file)
     Play#1 output Play#1 1 ***          Server configured for testing          ***
     Play#1 output Play#1 1 *** If you see this in a game, it is misconfigured! ***
     Play#1 output Play#1 6 0 640
+    Play#1 input __cmd added -1 -2 -101
+    Play#1 command __cmd
+    Play#1 output Play#1 1 That just cost you $101.00
+    Play#1 output Play#1 6 0 638
+    Play#1 input __cmd added 1 2 101
+    Play#1 command __cmd
+    Play#1 output Play#1 1 You just made $101.00
+    Play#1 output Play#1 6 0 640
     Play#1 input xdump sect 0,0
     Play#1 command xdump
     Play#1 output Play#1 1 Access to table sect denied