test: Add testcase for #1112

Refs: #1112
Change-Id: I0041366d8dcf035a09fbb59a5dbd5c94cae0d65e
This commit is contained in:
Ken Sato
2018-06-29 13:49:55 +09:00
committed by Masamichi Takagi
parent c6cc0bf07a
commit e1f204de4a
10 changed files with 438 additions and 0 deletions

65
test/issues/1112/C1112.sh Normal file
View File

@ -0,0 +1,65 @@
#!/bin/sh
BIN=
SBIN=
OSTEST=
BOOTPARAM="-c 1-7,9-15,17-23,25-31 -m 10G@0,10G@1 -r 1-7:0+9-15:8+17-23:16+25-31:24"
if [ -f ../../../config.h ]; then
str=`grep "^#define BINDIR " ../../../config.h | head -1 | sed 's/^#define BINDIR /BINDIR=/'`
eval $str
fi
if [ "x$BINDIR" = x ];then
BINDIR="$BIN"
fi
if [ -f ../../../Makefile ]; then
str=`grep ^SBINDIR ../../../Makefile | head -1 | sed 's/ //g'`
eval $str
fi
if [ "x$SBINDIR" = x ];then
SBINDIR="$SBIN"
fi
if [ -f $HOME/ostest/bin/test_mck ]; then
OSTESTDIR=$HOME/ostest/
fi
if [ "x$OSTESTDIR" = x ]; then
OSTESTDIR="$OSTEST"
fi
if [ ! -x $SBINDIR/mcstop+release.sh ]; then
echo mcstop+release: not found >&2
exit 1
fi
echo -n "mcstop+release.sh ... "
sudo $SBINDIR/mcstop+release.sh
echo "done"
if [ ! -x $SBINDIR/mcreboot.sh ]; then
echo mcreboot: not found >&2
exit 1
fi
echo -n "mcreboot.sh $BOOTPARAM ... "
sudo $SBINDIR/mcreboot.sh $BOOTPARAM
echo "done"
if [ ! -x $BINDIR/mcexec ]; then
echo mcexec: not found >&2
exit 1
fi
echo "*** RT_001 start *******************************"
sudo $BINDIR/mcexec $OSTESTDIR/bin/test_mck -s mremap_mmap_anon -n 1 2>&1 | tee ./RT_001.txt
if grep "RESULT: ok" ./RT_001.txt > /dev/null 2>&1 ; then
echo "*** RT_001: PASSED"
else
echo "*** RT_001: FAILED"
fi
echo ""
sudo $BINDIR/mcexec ./CT_001
sudo $BINDIR/mcexec ./CT_002
sudo $BINDIR/mcexec ./CT_003
sudo $BINDIR/mcexec ./CT_004
sudo $BINDIR/mcexec ./CT_005

43
test/issues/1112/CT_001.c Normal file
View File

@ -0,0 +1,43 @@
#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>
#include "./test_chk.h"
#define TEST_NAME "CT_001"
#define MAP_SIZE 0x2000000
int main(int argc, char **argv)
{
void *map, *remap;
int __errno;
printf("*** %s start *******************************\n", TEST_NAME);
map = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
OKNG(map == MAP_FAILED, "mmap returned :%p", map);
errno = 0;
remap = mremap(map, MAP_SIZE, 0x3000000, MREMAP_MAYMOVE);
__errno = errno;
OKNG(remap == MAP_FAILED, "mremap returned :%p"
" (expect return is valid addr)", remap);
OKNG(__errno != 0, "errno after mremap :%d"
" (expect error is 0)", __errno);
printf("*** %s PASSED\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

43
test/issues/1112/CT_002.c Normal file
View File

@ -0,0 +1,43 @@
#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>
#include "./test_chk.h"
#define TEST_NAME "CT_002"
#define MAP_SIZE 0x2000000
int main(int argc, char **argv)
{
void *map, *remap;
int __errno;
printf("*** %s start *******************************\n", TEST_NAME);
map = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
OKNG(map == MAP_FAILED, "mmap returned :%p", map);
errno = 0;
remap = mremap(map, MAP_SIZE, 0x800000, 0);
__errno = errno;
OKNG(remap != map, "mremap returned :%p"
" (expect return is %p)", remap, map);
OKNG(__errno != 0, "errno after mremap :%d"
" (expect error is 0)", __errno);
printf("*** %s PASSED\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

43
test/issues/1112/CT_003.c Normal file
View File

@ -0,0 +1,43 @@
#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>
#include "./test_chk.h"
#define TEST_NAME "CT_003"
#define MAP_SIZE 0x2000000
int main(int argc, char **argv)
{
void *map, *remap;
int __errno;
printf("*** %s start *******************************\n", TEST_NAME);
map = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
OKNG(map == MAP_FAILED, "mmap returned :%p", map);
errno = 0;
remap = mremap(map, 0xffffffffffffe000, 0xffffffffffffe000, 0);
__errno = errno;
OKNG(remap != map, "mremap returned :%p"
" (expect return is %p)", remap, map);
OKNG(__errno != 0, "errno after mremap :%d"
" (expect error is 0)", __errno);
printf("*** %s PASSED\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

44
test/issues/1112/CT_004.c Normal file
View File

@ -0,0 +1,44 @@
#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>
#include "./test_chk.h"
#define TEST_NAME "CT_004"
#define MAP_SIZE 0x2000000
int main(int argc, char **argv)
{
void *map, *remap;
int __errno;
printf("*** %s start *******************************\n", TEST_NAME);
map = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
OKNG(map == MAP_FAILED, "mmap returned :%p", map);
errno = 0;
remap = mremap(map, 0xffffffffffffe000, 0xffffffffffffe000,
MREMAP_MAYMOVE | MREMAP_FIXED, map + 0x40000000);
__errno = errno;
OKNG(remap != MAP_FAILED, "mremap returned :%p"
" (expect return is MAP_FAILED)", remap);
OKNG(__errno != EINVAL, "errno after mremap :%d"
" (expect error is EINVAL(%d))", __errno, EINVAL);
printf("*** %s PASSED\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

43
test/issues/1112/CT_005.c Normal file
View File

@ -0,0 +1,43 @@
#define _GNU_SOURCE 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>
#include "./test_chk.h"
#define TEST_NAME "CT_005"
#define MAP_SIZE 0x2000000
int main(int argc, char **argv)
{
void *map, *remap;
int __errno;
printf("*** %s start *******************************\n", TEST_NAME);
map = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
OKNG(map == MAP_FAILED, "mmap returned :%p", map);
errno = 0;
remap = mremap(map, MAP_SIZE, 0xffffffffffffe000, MREMAP_MAYMOVE);
__errno = errno;
OKNG(remap != MAP_FAILED, "mremap returned :%p"
" (expect return is MAP_FAILED)", remap);
OKNG(__errno != ENOMEM, "errno after mremap :%d"
" (expect error is ENOMEM(%d))", __errno, ENOMEM);
printf("*** %s PASSED\n\n", TEST_NAME);
return 0;
fn_fail:
printf("*** %s FAILED\n\n", TEST_NAME);
return -1;
}

29
test/issues/1112/Makefile Normal file
View File

@ -0,0 +1,29 @@
CC = gcc
TARGET=CT_001 CT_002 CT_003 CT_004 CT_005
CPPFLAGS =
LDFLAGS =
all: $(TARGET)
CT_001: CT_001.c
$(CC) -o $@ $^ $(LDFLAGS)
CT_002: CT_002.c
$(CC) -o $@ $^ $(LDFLAGS)
CT_003: CT_003.c
$(CC) -o $@ $^ $(LDFLAGS)
CT_004: CT_004.c
$(CC) -o $@ $^ $(LDFLAGS)
CT_005: CT_005.c
$(CC) -o $@ $^ $(LDFLAGS)
test: all
@sh ./C1112.sh
clean:
rm -f $(TARGET) *.o

69
test/issues/1112/README Normal file
View File

@ -0,0 +1,69 @@
【Issue#1112 動作確認】
□ テスト内容
1. Issueで報告された再現プログラムでの確認
RT_001: ostest-rt_sigaction.004 による確認
テストが正常に終了し、「RESULT: ok」が出力される
2. 既存のmremap機能に影響がないことを確認
CT_001: mremapによる領域の拡張
1. mmap で32MBの領域を確保
2. 下記条件でmremapを実行
- old_addr : mmapで確保したアドレス
- old_size : 0x2000000 (32MB)
- new_size : 0x3000000 (64MB)
- flags : MREMAP_MAYMOVE
3. mremap がMAP_FAILED以外の値を返す
4. mremap がerrnoを設定しない
CT_002: mremapによる領域の縮小
1. mmap で32MBの領域を確保
2. 下記条件でmremapを実行
- old_addr : mmapで確保したアドレス
- old_size : 0x2000000 (32MB)
- new_size : 0x800000 (8MB)
- flags : 0
3. mremap がold_addr に指定した値を返す
4. mremap がerrnoを設定しない
CT_003: old/new_size 不正時の動作
1. mmap で32MBの領域を確保
2. 下記条件でmremapを実行
- old_addr : mmapで確保したアドレス
- old_size : 0xffffffffffffe000 (remap後の領域がアドレス空間の最大値を超える値)
- new_size : 0xffffffffffffe000 (remap後の領域がアドレス空間の最大値を超える値)
- flags : 0
3. mremap がold_addr に指定した値を返す
4. mremap がerrnoを設定しない
CT_004: old/new_size 不正時の動作
1. mmap で32MBの領域を確保
2. 下記条件でmremapを実行
- old_addr : mmapで確保したアドレス
- old_size : 0xffffffffffffe000 (remap後の領域がアドレス空間の最大値を超える値)
- new_size : 0xffffffffffffe000 (remap後の領域がアドレス空間の最大値を超える値)
- flags : MREMAP_MAYMOVE | MREMAP_FIXED
- new_addr : mmapで確保したアドレス + 0x40000000 (1GB)
3. mremap がMAP_FAILED を返す
4. mremap がerrnoにEINVALを設定する
CT_005: old/new_size 不正時の動作
1. mmap で32MBの領域を確保
2. 下記条件でmremapを実行
- old_addr : mmapで確保したアドレス
- old_size : 0x2000000 (32MB)
- new_size : 0xffffffffffffe000 (remap後の領域がアドレス空間の最大値を超える値)
- flags : MREMAP_MAYMOVE
3. mremap がMAP_FAILED を返す
4. mremap がerrnoにENOMEMを設定する
□ 実行手順
$ make test
実行できない場合は、C1112.shの以下の行を適切に書き換えた後に実行。
BIN= mcexec が存在するパス
SBIN= mcreboot.sh が存在するパス
OSTEST= OSTESTが存在するパス
□ 実行結果
result.log 参照。
すべての項目をPASSしていることを確認。

View File

@ -0,0 +1,36 @@
*** RT_001 start *******************************
TEST_SUITE: mremap_mmap_anon
TEST_NUMBER: 1
ARGS:
RESULT: ok
*** RT_001: PASSED
*** CT_001 start *******************************
[OK] mmap returned :0x2aaaab200000
[OK] mremap returned :0x2aaaab200000 (expect return is valid addr)
[OK] errno after mremap :0 (expect error is 0)
*** CT_001 PASSED
*** CT_002 start *******************************
[OK] mmap returned :0x2aaaab200000
[OK] mremap returned :0x2aaaab200000 (expect return is 0x2aaaab200000)
[OK] errno after mremap :0 (expect error is 0)
*** CT_002 PASSED
*** CT_003 start *******************************
[OK] mmap returned :0x2aaaab200000
[OK] mremap returned :0x2aaaab200000 (expect return is 0x2aaaab200000)
[OK] errno after mremap :0 (expect error is 0)
*** CT_003 PASSED
*** CT_004 start *******************************
[OK] mmap returned :0x2aaaab200000
[OK] mremap returned :0xffffffffffffffff (expect return is MAP_FAILED)
[OK] errno after mremap :22 (expect error is EINVAL(22))
*** CT_004 PASSED
*** CT_005 start *******************************
[OK] mmap returned :0x2aaaab200000
[OK] mremap returned :0xffffffffffffffff (expect return is MAP_FAILED)
[OK] errno after mremap :12 (expect error is ENOMEM(12))
*** CT_005 PASSED

View File

@ -0,0 +1,23 @@
#ifndef HEADER_TEST_CHK_H
#define HEADER_TEST_CHK_H
#define CHKANDJUMP(cond, ...) do {\
if (cond) {\
fprintf(stderr, " [NG] ");\
fprintf(stderr, __VA_ARGS__);\
fprintf(stderr, " failed\n");\
goto fn_fail;\
} \
} while (0)
#define OKNG(cond, ...) do {\
if (cond) {\
CHKANDJUMP(cond, __VA_ARGS__);\
} else {\
fprintf(stdout, " [OK] ");\
fprintf(stdout, __VA_ARGS__);\
fprintf(stdout, "\n");\
} \
} while (0)
#endif