1 #include "TestShmem.h"
2
3 #include "IPDLUnitTests.h" // fail etc.
4
5 namespace mozilla {
6 namespace _ipdltest {
7
8 //-----------------------------------------------------------------------------
9 // Parent
10
Main()11 void TestShmemParent::Main() {
12 Shmem mem;
13 Shmem unsafe;
14
15 size_t size = 12345;
16 if (!AllocShmem(size, SharedMemory::TYPE_BASIC, &mem))
17 fail("can't alloc shmem");
18 if (!AllocUnsafeShmem(size, SharedMemory::TYPE_BASIC, &unsafe))
19 fail("can't alloc shmem");
20
21 if (mem.Size<char>() != size)
22 fail("shmem is wrong size: expected %lu, got %lu", size, mem.Size<char>());
23 if (unsafe.Size<char>() != size)
24 fail("shmem is wrong size: expected %lu, got %lu", size,
25 unsafe.Size<char>());
26
27 char* ptr = mem.get<char>();
28 memcpy(ptr, "Hello!", sizeof("Hello!"));
29
30 char* unsafeptr = unsafe.get<char>();
31 memcpy(unsafeptr, "Hello!", sizeof("Hello!"));
32
33 Shmem unsafecopy = unsafe;
34 if (!SendGive(std::move(mem), std::move(unsafe), size))
35 fail("can't send Give()");
36
37 // uncomment the following line for a (nondeterministic) surprise!
38 // char c1 = *ptr; (void)c1;
39
40 // uncomment the following line for a deterministic surprise!
41 // char c2 = *mem.get<char>(); (void)c2;
42
43 // unsafe shmem gets rid of those checks
44 char uc1 = *unsafeptr;
45 (void)uc1;
46 char uc2 = *unsafecopy.get<char>();
47 (void)uc2;
48 }
49
RecvTake(Shmem && mem,Shmem && unsafe,const size_t & expectedSize)50 mozilla::ipc::IPCResult TestShmemParent::RecvTake(Shmem&& mem, Shmem&& unsafe,
51 const size_t& expectedSize) {
52 if (mem.Size<char>() != expectedSize)
53 fail("expected shmem size %lu, but it has size %lu", expectedSize,
54 mem.Size<char>());
55 if (unsafe.Size<char>() != expectedSize)
56 fail("expected shmem size %lu, but it has size %lu", expectedSize,
57 unsafe.Size<char>());
58
59 if (strcmp(mem.get<char>(), "And yourself!"))
60 fail("expected message was not written");
61 if (strcmp(unsafe.get<char>(), "And yourself!"))
62 fail("expected message was not written");
63
64 if (!DeallocShmem(mem)) fail("DeallocShmem");
65 if (!DeallocShmem(unsafe)) fail("DeallocShmem");
66
67 Close();
68
69 return IPC_OK();
70 }
71
72 //-----------------------------------------------------------------------------
73 // Child
74
RecvGive(Shmem && mem,Shmem && unsafe,const size_t & expectedSize)75 mozilla::ipc::IPCResult TestShmemChild::RecvGive(Shmem&& mem, Shmem&& unsafe,
76 const size_t& expectedSize) {
77 if (mem.Size<char>() != expectedSize)
78 fail("expected shmem size %lu, but it has size %lu", expectedSize,
79 mem.Size<char>());
80 if (unsafe.Size<char>() != expectedSize)
81 fail("expected shmem size %lu, but it has size %lu", expectedSize,
82 unsafe.Size<char>());
83
84 if (strcmp(mem.get<char>(), "Hello!"))
85 fail("expected message was not written");
86 if (strcmp(unsafe.get<char>(), "Hello!"))
87 fail("expected message was not written");
88
89 char* unsafeptr = unsafe.get<char>();
90
91 memcpy(mem.get<char>(), "And yourself!", sizeof("And yourself!"));
92 memcpy(unsafeptr, "And yourself!", sizeof("And yourself!"));
93
94 Shmem unsafecopy = unsafe;
95 if (!SendTake(std::move(mem), std::move(unsafe), expectedSize))
96 fail("can't send Take()");
97
98 // these checks also shouldn't fail in the child
99 char uc1 = *unsafeptr;
100 (void)uc1;
101 char uc2 = *unsafecopy.get<char>();
102 (void)uc2;
103
104 return IPC_OK();
105 }
106
107 } // namespace _ipdltest
108 } // namespace mozilla
109