15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef __cplusplus 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#error "This file should be compiled as C, not C++." 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <stddef.h> 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string.h> 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Include all the header files that are meant to be compilable as C. Start with 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// core.h, since it's the most important one. 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "mojo/public/c/environment/async_waiter.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/public/c/system/core.h" 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/public/c/system/macros.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The joys of the C preprocessor.... 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define STRINGIFY(x) #x 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define STRINGIFY2(x) STRINGIFY(x) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define FAILURE(message) \ 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) __FILE__ "(" STRINGIFY2(__LINE__) "): Failure: " message 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Poor man's gtest. 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define EXPECT_EQ(a, b) \ 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) do { \ 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if ((a) != (b)) \ 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FAILURE(STRINGIFY(a) " != " STRINGIFY(b) " (expected ==)"); \ 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } while (0) 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define EXPECT_NE(a, b) \ 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) do { \ 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if ((a) == (b)) \ 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return FAILURE(STRINGIFY(a) " == " STRINGIFY(b) " (expected !=)"); \ 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } while (0) 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This function exists mainly to be compiled and linked. We do some cursory 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// checks and call it from a unit test, to make sure that link problems aren't 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// missed due to deadstripping. Returns null on success and a string on failure 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// (describing the failure). 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* MinimalCTest(void) { 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // MSVS before 2013 *really* only supports C90: All variables must be declared 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // at the top. (MSVS 2013 is more reasonable.) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MojoTimeTicks ticks; 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MojoHandle handle0, handle1; 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MojoHandleSignals signals; 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char kHello[] = "hello"; 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) char buffer[200] = {0}; 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32_t num_bytes; 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ticks = MojoGetTimeTicksNow(); 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(ticks, 0); 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) handle0 = MOJO_HANDLE_INVALID; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(MOJO_RESULT_OK, MojoClose(handle0)); 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ( 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MOJO_RESULT_INVALID_ARGUMENT, 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MojoWait(handle0, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE)); 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) handle1 = MOJO_HANDLE_INVALID; 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(NULL, &handle0, &handle1)); 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) signals = MOJO_HANDLE_SIGNAL_READABLE; 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MojoWaitMany(&handle0, &signals, 1, 1)); 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(MOJO_RESULT_OK, 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MojoWriteMessage(handle0, 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kHello, 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) (uint32_t)sizeof(kHello), 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NULL, 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 0u, 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MOJO_WRITE_DATA_FLAG_NONE)); 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ( 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MOJO_RESULT_OK, 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MojoWait(handle1, MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE)); 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) num_bytes = (uint32_t)sizeof(buffer); 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(MOJO_RESULT_OK, 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MojoReadMessage(handle1, 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) buffer, 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) &num_bytes, 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NULL, 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NULL, 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOJO_READ_MESSAGE_FLAG_NONE)); 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ((uint32_t)sizeof(kHello), num_bytes); 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, memcmp(buffer, kHello, sizeof(kHello))); 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(MOJO_RESULT_OK, MojoClose(handle0)); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(MOJO_RESULT_OK, MojoClose(handle1)); 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(vtl): data pipe 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return NULL; 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 97