package org.limewire.promotion.impressions;
import java.util.Date;
import org.limewire.promotion.containers.PromotionMessageContainer;
import org.limewire.util.BaseTestCase;
import org.limewire.util.ByteUtils;
import org.limewire.util.StringUtils;
abstract class AbstractEventQueryDataBaseTestCase extends BaseTestCase {
public AbstractEventQueryDataBaseTestCase(String name) {
super(name);
}
private final String A_QUERY = "the query";
private final long DATE_IN_MILLIS = 123123123123L;
private final Date A_DATE = new Date(DATE_IN_MILLIS);
protected final UserQueryEventData getImpressions(int n) {
UserQueryEvent e = getUserQueryEvent(n);
UserQueryEventData data = new UserQueryEventData(e);
/*
* milliseconds since start of the day : 4 bytes
* original query time : 8 bytes
* number of impressions : 1 byte
* List of n=length of
* n=binder name length : 1 byte
* binder Name : n bytes
* promo ID : 8 bytes
* impression time : 8 bytes
*/
int length = 4 + 8 + 1;
for (Impression imp : e.getImpressions()) {
length += 1;
length += imp.getBinderUniqueName().length();
length += 8;
length += 8;
}
final byte[] expected = new byte[length];
int cur = 0;
expected[cur++] = (byte) e.getImpressions().size();
cur = transfer(data.getMillisSinceToday(), expected, cur);
cur = transfer(A_DATE, expected, cur);
for (Impression imp : e.getImpressions()) {
cur = transfer(imp, expected, cur);
}
assertEquals(data.getQuery(), A_QUERY);
assertEquals(expected, data.getData());
return data;
}
protected final UserQueryEvent getUserQueryEvent(int n) {
Impression[] imps = new Impression[n];
for (int i = 0; i < n; i++) {
imps[i] = new Impression(new PromotionMessageContainer(), ""
+ (Math.random() * Long.MAX_VALUE), new Date(DATE_IN_MILLIS + i));
}
UserQueryEvent e = new UserQueryEvent(A_QUERY, A_DATE);
for (Impression imp : imps) {
e.addImpression(imp);
}
return e;
}
private int transfer(Date d, byte[] in, int start) {
System.arraycopy(date2bytes(d), 0, in, start, 8);
return start + 8;
}
private int transfer(long i, byte[] in, int start) {
System.arraycopy(ByteUtils.long2bytes(i, 4), 0, in, start, 4);
return start + 4;
}
private int transfer(Impression i, byte[] in, int start) {
int cur = start;
byte[] binderName = StringUtils.toAsciiBytes(i.getBinderUniqueName());
int len = binderName.length;
arraycopy(ByteUtils.long2bytes(len, 1), 0, in, cur, 1); cur += 1;
arraycopy(binderName, 0, in, cur, len); cur += len;
arraycopy(ByteUtils.long2bytes(i.getPromoUniqueID(), 8), 0, in, cur, 8); cur += 8;
arraycopy(date2bytes(i.getTimeShown()), 0, in, cur, 8); cur += 8;
return cur;
}
private void arraycopy(byte[] src, int i, byte[] in, int start, int j) {
System.arraycopy(src, i, in, start, j);
}
private byte[] date2bytes(Date d) {
return ByteUtils.long2bytes(d.getTime(), 8);
}
}