| // Copyright 2022 Google LLC |
| // |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package exporter |
| |
| import ( |
| "bytes" |
| "testing" |
| |
| "github.com/stretchr/testify/assert" |
| "github.com/stretchr/testify/require" |
| "go.skia.org/skia/bazel/exporter/build_proto/analysis_v2" |
| "google.golang.org/protobuf/encoding/prototext" |
| ) |
| |
| // This input test data (in textproto format) started as output of |
| // a bazel cquery call - like: |
| // |
| // bazel cquery --noimplicit_deps 'kind("rule", deps(//:skia_public))' --output textproto > out.txt |
| // |
| // and then hand edited to create a small valid query result with specific |
| // files, copts, and other cc_library/cc_binary rule attributes. |
| const ruleTestTextProto = `results { |
| target { |
| type: RULE |
| rule { |
| name: "//src/libs:sum" |
| rule_class: "cc_library" |
| location: "/path/to/workspace/src/libs/BUILD.bazel:8:11" |
| attribute { |
| name: "copts" |
| type: STRING_LIST |
| string_list_value: "-O2" |
| explicitly_specified: true |
| nodep: false |
| } |
| attribute { |
| name: "defines" |
| type: STRING_LIST |
| string_list_value: "SUMDEF" |
| explicitly_specified: false |
| nodep: false |
| } |
| attribute { |
| name: "includes" |
| type: STRING_LIST |
| string_list_value: "." |
| explicitly_specified: false |
| nodep: false |
| } |
| attribute { |
| name: "linkopts" |
| type: STRING_LIST |
| string_list_value: "-L/library/dir" |
| explicitly_specified: false |
| nodep: false |
| } |
| attribute { |
| name: "name" |
| type: STRING |
| string_value: "sum" |
| explicitly_specified: true |
| nodep: false |
| } |
| attribute { |
| name: "srcs" |
| type: LABEL_LIST |
| string_list_value: "//src/libs:sum.cpp" |
| explicitly_specified: true |
| nodep: false |
| } |
| attribute { |
| name: "hdrs" |
| type: LABEL_LIST |
| string_list_value: "//src/libs:sum.h" |
| explicitly_specified: true |
| nodep: false |
| } |
| attribute { |
| name: "visibility" |
| type: STRING_LIST |
| string_list_value: "//visibility:public" |
| explicitly_specified: true |
| nodep: true |
| } |
| } |
| }, |
| } |
| results { |
| target { |
| type: RULE |
| rule { |
| name: "//src/apps:hello" |
| rule_class: "cc_binary" |
| location: "/path/to/workspace/src/apps/BUILD.bazel:8:11" |
| attribute { |
| name: "copts" |
| type: STRING_LIST |
| string_list_value: "-O1" |
| explicitly_specified: true |
| nodep: false |
| } |
| attribute { |
| name: "defines" |
| type: STRING_LIST |
| string_list_value: "APPDEF" |
| explicitly_specified: false |
| nodep: false |
| } |
| attribute { |
| name: "linkopts" |
| type: STRING_LIST |
| string_list_value: "-L/app/dir" |
| explicitly_specified: false |
| nodep: false |
| } |
| attribute { |
| name: "name" |
| type: STRING |
| string_value: "hello" |
| explicitly_specified: true |
| nodep: false |
| } |
| attribute { |
| name: "srcs" |
| type: LABEL_LIST |
| explicitly_specified: true |
| nodep: false |
| } |
| attribute { |
| name: "deps" |
| type: LABEL_LIST |
| string_list_value: "//src/libs:sum" |
| explicitly_specified: false |
| nodep: false |
| } |
| attribute { |
| name: "visibility" |
| type: STRING_LIST |
| string_list_value: "//visibility:public" |
| explicitly_specified: true |
| nodep: true |
| } |
| } |
| } |
| }` |
| |
| func TestGetName_MatchingValue(t *testing.T) { |
| qr := analysis_v2.CqueryResult{} |
| err := prototext.Unmarshal([]byte(ruleTestTextProto), &qr) |
| require.NoError(t, err) |
| |
| r := findRule(&qr, "//src/apps:hello") |
| require.NotNil(t, r) |
| assert.Equal(t, "//src/apps:hello", r.GetName()) |
| |
| cr := newCMakeRule(r) |
| assert.Equal(t, r.GetName(), cr.getName()) |
| } |
| |
| func TestHasSrcs_SourcesExist_ReturnsTrue(t *testing.T) { |
| qr := analysis_v2.CqueryResult{} |
| err := prototext.Unmarshal([]byte(ruleTestTextProto), &qr) |
| require.NoError(t, err) |
| |
| r := findRule(&qr, "//src/libs:sum") |
| require.NotNil(t, r) |
| assert.Equal(t, "//src/libs:sum", r.GetName()) |
| |
| cr := newCMakeRule(r) |
| assert.True(t, cr.hasSrcs()) |
| } |
| |
| func TestHasSrcs_NoSources_ReturnsFalse(t *testing.T) { |
| qr := analysis_v2.CqueryResult{} |
| err := prototext.Unmarshal([]byte(ruleTestTextProto), &qr) |
| require.NoError(t, err) |
| |
| r := findRule(&qr, "//src/apps:hello") |
| require.NotNil(t, r) |
| assert.Equal(t, "//src/apps:hello", r.GetName()) |
| |
| cr := newCMakeRule(r) |
| assert.False(t, cr.hasSrcs()) |
| } |
| |
| func TestHasDependency_DependencyExist_ReturnsTrue(t *testing.T) { |
| qr := analysis_v2.CqueryResult{} |
| err := prototext.Unmarshal([]byte(ruleTestTextProto), &qr) |
| require.NoError(t, err) |
| |
| r := findRule(&qr, "//src/apps:hello") |
| require.NotNil(t, r) |
| assert.Equal(t, "//src/apps:hello", r.GetName()) |
| |
| cr := newCMakeRule(r) |
| require.NoError(t, cr.addDependency("//dependency/name")) |
| assert.True(t, cr.hasDependency("//dependency/name")) |
| } |
| |
| func TestHasDependency_NoDependency_ReturnsFalse(t *testing.T) { |
| qr := analysis_v2.CqueryResult{} |
| err := prototext.Unmarshal([]byte(ruleTestTextProto), &qr) |
| require.NoError(t, err) |
| |
| r := findRule(&qr, "//src/apps:hello") |
| require.NotNil(t, r) |
| assert.Equal(t, "//src/apps:hello", r.GetName()) |
| |
| cr := newCMakeRule(r) |
| assert.False(t, cr.hasDependency("//dependency/name")) |
| } |
| |
| func TestSetContents_SetContents_WriteSucceeds(t *testing.T) { |
| cr := newCMakeRule(nil) |
| cr.setContents([]byte("Contents Value\n")) |
| var writeBuff bytes.Buffer |
| nb, err := cr.write(&writeBuff) |
| require.NoError(t, err) |
| assert.Equal(t, 15, nb) |
| assert.Equal(t, []byte("Contents Value\n"), writeBuff.Bytes()) |
| } |