It seems problematic to allow arbitary non-lowercase attribute on HTML nodes. Because the server has no ability to keep them case sensitive (HTML isn't). So they will end up different on the client.

We should probably warn if the attribute is not a known one *and* is not lowercase.
var el = document.createElement('div');
    ReactDOM.render(<div unknown="something" />, el);
    expect(el.firstChild.getAttribute('unknown')).toBe('something');
    ReactDOM.render(<div unknown={givenValue} />, el);
    expect(el.firstChild.getAttribute('unknown')).toBe(expectedDOMValue);
  }
  describe('unknown attributes', () => {
    it('removes values null and undefined', () => {
      testUnknownAttributeRemoval(null);
      testUnknownAttributeRemoval(undefined);
    });
    it('changes values true, false to null, and also warns once', () => {
      spyOn(console, 'error');
      testUnknownAttributeAssignment(true, null);
      testUnknownAttributeAssignment(false, null);
      expectDev(
        normalizeCodeLocInfo(console.error.calls.argsFor(0)[0]),
      ).toMatch(
        'Warning: Received `true` for non-boolean attribute `unknown`. ' +
          'If this is expected, cast the value to a string.\n' +
          '    in div (at **)',
      );
      expectDev(console.error.calls.count()).toBe(1);
    });
    it('removes unknown attributes that were rendered but are now missing', () => {
      var el = document.createElement('div');
      ReactDOM.render(<div unknown="something" />, el);