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