summaryrefslogtreecommitdiffstats
path: root/third_party/WebKit/LayoutTests/harness-tests/mojo-helpers.html
blob: 5a869ba479eef205659fa40576a5852405fbdf2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../resources/mojo-helpers.js"></script>
<script>
'use strict';

// Verify that the mojo_test helper functions properly and Mojo bindings
// are available.
mojo_test(mojo => {
  assert_true(mojo instanceof Object);
  assert_true(mojo.core instanceof Object);
  assert_true(mojo.router instanceof Object);
  assert_true(mojo.serviceRegistry instanceof Object);
}, 'Mojo system APIs should be available to layout tests.');

mojo_test(mojo => {
  return new Promise(resolve => {
    let calls = 0;
    // Complete the test as soon as two requests come in for a Frobinator service.
    mojo.serviceRegistry.addServiceOverrideForTesting('Frobinator', () => {
      if (++calls == 2)
        resolve();
    });

    // Try to connect to the browser's Frobinator service. This should be
    // intercepted by the above override.
    mojo.serviceRegistry.connectToService('Frobinator');
    mojo.serviceRegistry.connectToService('Frobinator');
  });
}, 'Service registry overrides should be properly intercepted.');

mojo_test(mojo => {
  return new Promise(resolve => {
    let TEST_REQUEST = new Uint8Array([42, 0, 2, 3, 5, 7, 11, 13, 17, 19, 23]);

    mojo.serviceRegistry.addServiceOverrideForTesting('Frobinator', pipe => {
      resolve(mojo_wait_for_incoming_message(mojo, pipe)
        .then(message => {
          assert_array_equals(new Uint8Array(message.buffer), TEST_REQUEST);
          assert_array_equals(message.handles, []);
        }));
    });

    let pipe = mojo.serviceRegistry.connectToService('Frobinator');
    assert_equals(mojo.core.writeMessage(pipe, TEST_REQUEST, [], 0),
        mojo.core.RESULT_OK);
  });
}, 'Mock services can receive messages from test code.');

mojo_test(mojo => {
  let TEST_REQUEST = new Uint8Array([1, 2, 3, 4, 5]);
  let EXPECTED_RESPONSE = new Uint8Array([5, 4, 3, 2, 1]);

  // Mock service should respond to any message with its reverse.
  mojo.serviceRegistry.addServiceOverrideForTesting('Reversinator', pipe => {
    mojo_wait_for_incoming_message(mojo, pipe)
      .then(message => {
        let response = new Uint8Array(message.buffer);
        response.reverse();
        assert_equals(mojo.core.writeMessage(pipe, response, [], 0),
            mojo.core.RESULT_OK);
      });
  });

  let pipe = mojo.serviceRegistry.connectToService('Reversinator');
  assert_equals(mojo.core.writeMessage(pipe, TEST_REQUEST, [], 0),
      mojo.core.RESULT_OK);

  return mojo_wait_for_incoming_message(mojo, pipe)
    .then(response => {
      assert_array_equals(new Uint8Array(response.buffer), EXPECTED_RESPONSE);
      assert_array_equals(response.handles, []);
    });
}, 'Test code can receive response messages from mock services.');

mojo_test(() => {
  return loadMojoModules(
      'module loading test',
      ['mojo/shell/public/interfaces/interface_provider.mojom']).then(mojo => {
    let interfaceProvider = mojo.modules[0];
    assert_equals(interfaceProvider.InterfaceProvider.name,
                  'mojo::shell::mojom::InterfaceProvider');

  });
}, 'Generated mojo bindings can be loaded in tests');

mojo_test(() => {
  return new Promise(resolve => {
    let iframe = document.createElement('iframe');
    let listener = result => {
      document.body.removeChild(iframe);
      window.removeEventListener('message', listener);
      assert_true(result.data);
      resolve();
    }
    window.addEventListener('message', listener);
    iframe.setAttribute('src', 'resources/mojo-helpers-inner.html');
    document.body.appendChild(iframe);
  });
}, 'Mojo bindings are accessible from iframes');

mojo_test(() => {
  return new Promise(resolve => {
    let popup;
    let listener = result => {
      popup.close();
      window.removeEventListener('message', listener);
      assert_true(result.data);
      resolve();
    }
    window.addEventListener('message', listener);
    popup = window.open('resources/mojo-helpers-inner.html');
  });
}, 'Mojo bindings are accessible from popups');
</script>