public XAttrFeature(List<XAttr> xAttrs) {
    if (xAttrs != null && !xAttrs.isEmpty()) {
      List<XAttr> toPack = new ArrayList<XAttr>();
      ImmutableList.Builder<XAttr> b = null;
      for (XAttr attr : xAttrs) {
        if (attr.getValue() == null ||
            attr.getValue().length <= PACK_THRESHOLD) {
          toPack.add(attr);
        } else {
          if (b == null) {
            b = ImmutableList.builder();
          }
          b.add(attr);
        }
      }
      this.attrs = XAttrFormat.toBytes(toPack);
      if (b != null) {
        this.xAttrs = b.build();
      }
    }
  }
@Test
  public void testXAttrFeature() throws Exception {
    List<XAttr> xAttrs = new ArrayList<>();
    XAttrFeature feature = new XAttrFeature(xAttrs);

    // no XAttrs in the feature
    assertTrue(feature.getXAttrs().isEmpty());

    // one XAttr in the feature
    XAttr a1 = XAttrHelper.buildXAttr(name1, value1);
    xAttrs.add(a1);
    feature = new XAttrFeature(xAttrs);

    XAttr r1 = feature.getXAttr(name1);
    assertTrue(a1.equals(r1));
    assertEquals(feature.getXAttrs().size(), 1);

    // more XAttrs in the feature
    XAttr a2 = XAttrHelper.buildXAttr(name2, value2);
    XAttr a3 = XAttrHelper.buildXAttr(name3);
    XAttr a4 = XAttrHelper.buildXAttr(name4, value4);
    XAttr a5 = XAttrHelper.buildXAttr(name5, value5);
    XAttr a6 = XAttrHelper.buildXAttr(name6, value6);
    XAttr a7 = XAttrHelper.buildXAttr(name7, value7);
    XAttr bigXattr = XAttrHelper.buildXAttr(bigXattrKey, bigXattrValue);
    xAttrs.add(a2);
    xAttrs.add(a3);
    xAttrs.add(a4);
    xAttrs.add(a5);
    xAttrs.add(a6);
    xAttrs.add(a7);
    xAttrs.add(bigXattr);
    feature = new XAttrFeature(xAttrs);

    XAttr r2 = feature.getXAttr(name2);
    assertTrue(a2.equals(r2));
    XAttr r3 = feature.getXAttr(name3);
    assertTrue(a3.equals(r3));
    XAttr r4 = feature.getXAttr(name4);
    assertTrue(a4.equals(r4));
    XAttr r5 = feature.getXAttr(name5);
    assertTrue(a5.equals(r5));
    XAttr r6 = feature.getXAttr(name6);
    assertTrue(a6.equals(r6));
    XAttr r7 = feature.getXAttr(name7);
    assertTrue(a7.equals(r7));
    XAttr rBigXattr = feature.getXAttr(bigXattrKey);
    assertTrue(bigXattr.equals(rBigXattr));
    List<XAttr> rs = feature.getXAttrs();
    assertEquals(rs.size(), xAttrs.size());
    for (int i = 0; i < rs.size(); i++) {
      assertTrue(xAttrs.contains(rs.get(i)));
    }

    // get non-exist XAttr in the feature
    XAttr r8 = feature.getXAttr(name8);
    assertTrue(r8 == null);
  }