#include "ftp_client_proto.h"
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <netinet/in.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void check(int d, int e, int line) { if (d != e) {
printf("check: test failed: %d != %d at line %d\n", d, e, line);
exit(1);
}
}
void strcheck(const char * d, const char * e, int line)
{
if (!d || !e) {
printf("strcheck: test failed: One of the character string is null: %s %s\n", d, e);
exit(1);
}
if (strcmp(d, e)) {
printf("strcheck: test failed: '%s' != '%s' at line %d\n", d, e, line);
exit(1);
}
}
void statuscheck(const char * d, int e, int line)
{
if (!d) {
printf("strcheck: test failed: Character string is null\n");
exit(1);
}
if (atoi(d) != e) {
printf("statuscheck: test failed: atoi(%s) != %d at line %d\n", d, e, line);
exit(1);
}
}
#define CHECK(d, e) check(d, e, __LINE__)
#define STRCHECK(d, e) strcheck(d, e, __LINE__)
#define STATUSCHECK(d, e) statuscheck(d, e, __LINE__)
#define SLEN 1024
/* Main program to test the ftp client protocol module.
* Doesn't need any networking; simulates the server itself.
* Prints message and exits with nonzero status if any test fails.
*/
int main(int argc, char **argv)
{
ftp_client_proto_t ftp;
int err;
char sbuf[SLEN];
const char *p;
(void) argc; (void) argv;
ftp.init();
CHECK(ftp.isOutputReady(), false);
/*---------------------*/
/* Test login() method */
err = ftp.login("user", "password"); /* start login */
CHECK(err,0);
/* Simulate server's response to connect */
CHECK(ftp.isInputReady(), true);
err = ftp.giveInput("221 Hello, welcome to ftp.null.net");
CHECK(err,0);
CHECK(ftp.isOutputReady(), true);
p = ftp.getOutput();
STRCHECK(p, "USER user\r\n"); /* it should send USER... */
err = ftp.advanceOutput();
CHECK(err,0);
CHECK(ftp.isOutputReady(), false);
/* Simulate server's response to USER */
CHECK(ftp.isInputReady(), true);
err = ftp.giveInput("331 User name OK, need password.");
CHECK(err,0);
CHECK(ftp.isOutputReady(), true);
p = ftp.getOutput();
STRCHECK(p, "PASS password\r\n"); /* followed by PASS. */
err = ftp.advanceOutput();
CHECK(err,0);
CHECK(ftp.isOutputReady(), false);
CHECK(ftp.getStatus(sbuf,SLEN), 0); /* command shouldn't end... */
/* Simulate server's response to PASS */
CHECK(ftp.isInputReady(), true);
err = ftp.giveInput("230 Login successful.");
CHECK(err,0);
CHECK(ftp.isOutputReady(), false);
CHECK(ftp.getStatus(sbuf, SLEN), 230); /* ... until 230 comes back. */
STRCHECK(sbuf, "230 Login successful.");
/*------------------*/
/* Test cd() method */
err = ftp.cd("pub");
CHECK(err,0);
CHECK(ftp.isOutputReady(), true);
p = ftp.getOutput();
STRCHECK(p, "CWD pub\r\n");
err = ftp.advanceOutput();
CHECK(err,0);
CHECK(ftp.getStatus(sbuf, SLEN), 0);
CHECK(ftp.isOutputReady(), false);
/* Simulate server's response to CWD */
CHECK(ftp.isInputReady(), true);
err = ftp.giveInput("250 CWD command successful.");
CHECK(err,0);
CHECK(ftp.getStatus(sbuf, SLEN), 250);
STRCHECK(sbuf, "250 CWD command successful.");
/*--------------------*/
/* Test type() method */
err = ftp.type("I");
CHECK(err,0);
CHECK(ftp.isOutputReady(), true);
p = ftp.getOutput();
STRCHECK(p, "TYPE I\r\n");
err = ftp.advanceOutput();
CHECK(err,0);
CHECK(ftp.getStatus(sbuf, SLEN), 0);
CHECK(ftp.isOutputReady(), false);
/* Simulate server's response to TYPE */
CHECK(ftp.isInputReady(), true);
err = ftp.giveInput("200 TYPE command successful.");
CHECK(err,0);
CHECK(ftp.getStatus(sbuf, SLEN), 200);
STRCHECK(sbuf, "200 TYPE command successful.");
/*------------------*/
/* Test ls() method */
/* not written yet */
/* etc. */
printf("No tests failed.\n");
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1