1/*
2 * Copyright 2014 Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "AreaTest.h"
8
9#include <OS.h>
10
11#include <cppunit/TestCaller.h>
12#include <cppunit/TestSuite.h>
13
14
15AreaTest::AreaTest()
16{
17}
18
19
20AreaTest::~AreaTest()
21{
22}
23
24
25void
26AreaTest::TestAreas()
27{
28	int * ptr = new int[1];
29	char *adr;
30	area_id id;
31	ptrdiff_t offset;
32
33	area_info info;
34	id = area_for(ptr);
35	get_area_info(id, &info);
36	adr = (char *)info.address;
37	offset = (ptrdiff_t)ptr - (ptrdiff_t)adr;
38
39
40	char * adrclone1;
41	char * adrclone2;
42	int * ptrclone1;
43	int * ptrclone2;
44	area_id idclone1;
45	area_id idclone2;
46
47	idclone1 = clone_area("clone 1", (void **)&adrclone1, B_ANY_ADDRESS,
48		B_READ_AREA | B_WRITE_AREA, id);
49	idclone2 = clone_area("clone 2", (void **)&adrclone2, B_ANY_ADDRESS,
50		B_READ_AREA | B_WRITE_AREA, id);
51
52	ptrclone1 = (int *)(adrclone1 + offset);
53	ptrclone2 = (int *)(adrclone2 + offset);
54
55	// Check that he pointer is inside the area returned by area_for...
56	CPPUNIT_ASSERT(offset >= 0);
57
58	// Chech that the clones have different IDs
59	CPPUNIT_ASSERT(id != idclone1);
60	CPPUNIT_ASSERT(id != idclone2);
61	CPPUNIT_ASSERT(idclone1 != idclone2);
62
63	// Check that the clones have different addresses
64	CPPUNIT_ASSERT(adr != adrclone1);
65	CPPUNIT_ASSERT(adr != adrclone2);
66	CPPUNIT_ASSERT(adrclone1 != adrclone2);
67
68	// Check that changes on one view of the area are visible in others.
69	ptr[0] = 0x12345678;
70	CPPUNIT_ASSERT(ptr[0] == ptrclone1[0]);
71	CPPUNIT_ASSERT(ptrclone2[0] == ptrclone1[0]);
72	CPPUNIT_ASSERT_EQUAL(0x12345678, ptrclone2[0]);
73}
74
75
76/*static*/ void
77AreaTest::AddTests(BTestSuite& parent)
78{
79	CppUnit::TestSuite& suite = *new CppUnit::TestSuite("AreaTest");
80
81	suite.addTest(new CppUnit::TestCaller<AreaTest>(
82		"AreaTest::TestAreas", &AreaTest::TestAreas));
83
84	parent.addTest("AreaTest", &suite);
85}
86