1 /*
2  * Copyright 2015-present Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may
5  * not use this file except in compliance with the License. You may obtain
6  * a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations
14  * under the License.
15  */
16 
17 package com.facebook.watchman;
18 
19 import java.io.ByteArrayOutputStream;
20 import java.io.IOException;
21 import java.util.Iterator;
22 import java.util.List;
23 import java.util.Map;
24 import java.util.concurrent.BlockingQueue;
25 import java.util.concurrent.Callable;
26 import java.util.concurrent.LinkedBlockingQueue;
27 
28 import org.junit.Assert;
29 import org.junit.Before;
30 
31 public class WatchmanTestBase {
32 
33   protected ByteArrayOutputStream mOutgoingMessageStream;
34   protected BlockingQueue<Map<String, Object>> mObjectQueue;
35   protected Callable<Map<String, Object>> mIncomingMessageGetter;
36 
37   @Before
setUp()38   public void setUp() throws IOException {
39     mOutgoingMessageStream = new ByteArrayOutputStream();
40     mObjectQueue = new LinkedBlockingQueue<>();
41     mIncomingMessageGetter = new Callable<Map<String, Object>>() {
42       @Override
43       public Map<String, Object> call() throws Exception {
44         return mObjectQueue.take();
45       }
46     };
47   }
48 
49   @SuppressWarnings("unchecked")
deepObjectEquals(List<Object> expected, List<Object> object)50   protected static void deepObjectEquals(List<Object> expected, List<Object> object) {
51     Assert.assertNotNull(object);
52     Assert.assertEquals(expected.size(), object.size());
53     Iterator<Object> iteratorExpected = expected.iterator();
54     Iterator<Object> iteratorObject = object.iterator();
55     while (iteratorExpected.hasNext()) {
56       Object elementExpected = iteratorExpected.next();
57       Object elementObject = iteratorObject.next();
58       if (elementExpected instanceof List) {
59         Assert.assertTrue(elementObject instanceof List);
60         deepObjectEquals((List<Object>) elementExpected, (List<Object>) elementObject);
61       } else if (elementExpected instanceof Map) {
62         Assert.assertTrue(elementObject instanceof Map);
63         deepObjectEquals((Map<String, Object>) elementExpected, (Map<String,Object>) elementObject);
64       } else {
65         Assert.assertEquals(elementExpected, elementObject);
66       }
67     }
68   }
69 
70   @SuppressWarnings("unchecked")
deepObjectEquals(Map<String, Object> expected, Map<String, Object> object)71   protected static void deepObjectEquals(Map<String, Object> expected, Map<String, Object> object) {
72     Assert.assertNotNull(object);
73     Assert.assertEquals(expected.size(), object.size());
74     for (String key: expected.keySet()) {
75       Object elementExpected = expected.get(key);
76       Object elementObject = object.get(key);
77       if (elementExpected instanceof List) {
78         Assert.assertTrue(elementObject instanceof List);
79         deepObjectEquals((List<Object>) elementExpected, (List<Object>) elementObject);
80       } else if (elementExpected instanceof Map) {
81         Assert.assertTrue(elementObject instanceof Map);
82         deepObjectEquals((Map<String, Object>) elementExpected, (Map<String,Object>) elementObject);
83       } else {
84         Assert.assertEquals(elementExpected, elementObject);
85       }
86     }
87   }
88 
89 }
90